国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - 舉例講解Android應用開發中OTTO框架的基本使用

舉例講解Android應用開發中OTTO框架的基本使用

2021-06-09 15:41BlackSwift Android

這篇文章主要介紹了Android應用開發中OTTO框架的基本使用講解,文中舉了創建一個單例模式的應用例子,需要的朋友可以參考下

otto是一個eventbus類型的事件傳輸總線,它可以提供“存儲轉發”的功能,讓你app中各個組件的交流更加便利,讓你的程序分層更加清晰。

使用場景
otto基于observer設計模式。它有發布者,訂閱者這兩個主要對象。otto的最佳實踐就是通過反射犧牲了微小的性能,同時極大的提高了程序的耦合度,更加利于mvp分工開發與維護。業務層開發者在處理資源(比如db, rest等)后并發布消息,展示層開發者(比如activity/fragment)就可以處理消息,而不用關心數據是怎么來的(在讀報紙的時候需要知道編輯們如何排版印刷嗎?),比如:

fragment,service或者activity組件之間的通信。比如
導航菜單的navigationdrawer與activity的通信
activity與activity的通信(在設置界面上勾選了夜間模式,回到主界面就發現已經完成變色了;或者你在詳細界面上點了一個贊,回到主界面發現已經同步增加了一個"贊")
mvp(model view presidenter)架構中,model與presidenter的回掉通信。包括但不限于rest, db, sp, broadcastreceiver, contentobserver。

舉例講解Android應用開發中OTTO框架的基本使用

一、android studio中配置otto (eclipse中直接下載jar包導入)

跟之前介紹的其他的框架一樣,它只需要簡單地在build.gradle中配置下面的部分即可

?
1
2
3
4
5
6
7
8
9
10
11
dependencies {
 
  compile filetree(dir: 'libs', include: ['*.jar'])
 
  compile 'com.android.support:appcompat-v7:19.+'
 
  /
 
/otto 所需要依賴的包
 
}

 

二、開始使用
1. 訂閱者

當你想進行訂閱時,首先要打開注冊(比如生命周期的啟動/恢復部分)

?
1
bus.register(this);

當你不再關注某個事情后,需要取消注冊(比如生命周期的停止/暫停部分)

?
1
bus.unregister(this);

當你對某個事情感興趣的話,就加入@subscribe進行關注。

?
1
2
3
@subscribe public void getmessage(@nonnull someevent s) {
    //todo: 在回掉中使用這個事件
 }

2. 發布者
當你想發布消息時,使用post即可,注意發布者同樣需要事先注冊。

?
1
bus.post(someevent);

 

實例說明
本文以短信服務接受為例,介紹otto的使用

1. 構造單例模式
bus是一個單例,所以我們要創建一個單例模式,而最簡單的單例當然是在application中建立,記得在manifest注冊哦。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * created by leon on 15/5/27.
 * 主線程事件總線,方便在異步任務中回掉
 */
public class mainthreadbus extends bus {
 private final handler handler = new handler(looper.getmainlooper());
 
 @override public void post(final object event) {
  if (looper.mylooper() == looper.getmainlooper()) {
   //直接通過反射調用
   super.post(event);
  } else {
   //通過handler把異步任務發送到ui線程,然后再反射調用
   handler.post(new runnable() {
    @override
    public void run() {
     mainthreadbus.super.post(event);
    }
   });
  }
 }
}

接著是application的重寫

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class globalcontext extends application {
 
 //event bus singleton
 public static final mainthreadbus bus = new mainthreadbus();
 public static globalcontext instance;
 
 @override public void oncreate() {
  super.oncreate();
  instance = this;
 }
 
 public static mainthreadbus getbusinstance(){
  return bus;
 }
 
 public static globalcontext getcontextinstance(){
  return instance;
 }
}

2. 發送者(publisher)
現在我們要注冊一個短信接收機器,為了與國內毒瘤軟件搶占第一的短信監聽,我們使用service動態注冊接收器,以搶占第一優先級。

建立一個常駐后臺的服務,動態注冊接收器,以搶占第一優先級。同樣記得要把service在manifest注冊哦。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class smsservice extends service {
 
 private smsreceiver mreceiver = null;
 
 public smsservice() {
 }
 
 @override public ibinder onbind(intent intent) {
  // todo: return the communication channel to the service.
  throw new unsupportedoperationexception("not yet implemented");
 }
 
 @override public void oncreate() {
  super.oncreate();
  log.d(tag, "oncreate");
  intentfilter ifilter = null; // 意圖過濾對象
  mreceiver = new smsreceiver(); // 廣播接收類初始化
  ifilter = new intentfilter("android.provider.telephony.sms_received");
  ifilter.setpriority(integer.max_value); // 設置優先級
  globalcontext.getbusinstance().register(mreceiver);//注冊bus
  registerreceiver(mreceiver, ifilter); // 注冊廣播
 }
 
 @override public void ondestroy() {
  super.ondestroy();
  if (mreceiver != null){
   globalcontext.getbusinstance().unregister(mreceiver);//取消注冊bus
   unregisterreceiver(mreceiver);
  }
 }
}

接下來就是真正的發布者smsreceiver了,大部分代碼與網上都是一樣的,注意看我是如何發布消息的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class smsreceiver extends broadcastreceiver {
 
 public smsreceiver() {
 }
 
 @override public void onreceive(context context, intent intent) {
 
  bundle bundle = intent.getextras();
  //獲取鏈路層的協議數據單元
  object[] messages = (object[]) bundle.get("pdus");
  smsmessage[] sms = new smsmessage[messages.length];
  // create messages for each incoming pdu
  for (int n = 0; n < messages.length; n++) {
   sms[n] = smsmessage.createfrompdu((byte[]) messages[n]);
  }
  for (smsmessage msg : sms) {
   //todo: 這里應該加上你自己的過濾條件,比如手機號,短信內容
   //盡可能的攔截短信,這個命令在miui,flyme上都沒有用
   abortbroadcast();
   globalcontext.getbusinstance().post(msg);
  }
 }
}

從代碼中可以看出,在service中,我們控制了smsreceiver中bus的生命周期,之后在smsreceiver中,通過post把消息發布出去

 

?
1
globalcontext.getbusinstance().post(msg);

3. 接收者(subscriber)
接收者可以是activity,也可以是fragment,還可以是service。

我們以fragment為例進行操作.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class smscontrolfragment extends fragment {
 
  bus bus = globalcontext.getbusinstance();
 
  @override public void onattach(activity activity) {
    super.onattach(activity);
    bus.register(this);
   }
 
  @override public void ondetach() {
    super.ondetach();
    bus.unregister(this);
   }
 
  @subscribe public void getmessage(smsmessage s) {
    mtvnumber.settext(s.getoriginatingaddress());
    mtvmessage.settext(s.getmessagebody());
  }
 
}

訂閱者是fragment,發布者是smsreceiver,消息內容是smsmessage。
通過以上操作,一個使用otto的消息傳遞總線就完成了。


4.綜合demo
下面的demo, 僅為了讓大家知道“事件”被產生了之后,post出來,所有訂閱了該事件的類都會接到該事件,接受的先后順序,不由我們控制!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class myactivity extends actionbaractivity {
 
 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_my);
  findviewbyid(r.id.button_change).setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view view) {
    busprovider.getbusinstance().post(new datachangedevent("this is changed string"));//發布事件
   }
  });
 }
 
 @override
 protected void onresume() {
  super.onresume();
  busprovider.getbusinstance().register(this);//注冊
  
 }
 
 @override
 protected void onpause() {
  super.onpause();
  busprovider.getbusinstance().unregister(this);//注銷
 }
 
 @subscribe  //訂閱事件datachangedevent
 public void saygoodonevent(datachangedevent event){
  log.e("event", "good");
 }
 
 @subscribe //訂閱事件
 public void saybadonevent(datachangedevent event){
  log.e("event", "bad");
 }
 
 @produce //產生事件
 public datachangedevent producedatachangedevent(){
  return new datachangedevent("this is changed string");
 }
 
}

 

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美日韩激情一区 | 成人免费毛片高清视频 | 国产精品亲子伦av一区二区三区 | 韩国精品一区二区三区 | 久久a视频 | 精品96久久久久久中文字幕无 | 精品日韩一区二区三区 | 韩国毛片在线 | 欧美日韩国产在线 | 1000部精品久久久久久久久 | 91短视频版在线观看www免费 | 丁香综合 | 欧美在线观看一区 | av一级毛片 | 亚洲一区二区精品视频 | 三级无遮挡污在线观看 | 久久精品电影 | 久久精品国产99国产精品 | 日韩精品色 | 欧美一区二区三区免费 | 在线理论电影 | 国产中文视频 | 免费精品 | 久久精品伊人 | 国产九九九 | 中文字幕永久第一页 | 免费午夜电影 | 可以看av的网站 | 中文字幕一区二区三区四区 | 午夜影院免费 | 欧美精品久久久久久久久老牛影院 | 精久久| 91中文在线观看 | 中文字幕在线观看 | 黄色在线网站 | 色综合色综合网色综合 | 精品久久一区 | 亚洲狠狠爱 | 亚洲国产一区二区三区 | 精品视频在线播放 | 日韩av免费在线播放 |