Android 中LocalBroadcastManager的使用方式

來源:互聯網
上載者:User

標籤:des   android   style   io   color   ar   使用   java   sp   

Android中BroadcastReceiver主要用途有

發送通知,更新UI或者資料,應用程式間相互連信,監聽系統狀態(比如開機,網路等)

Android中BroadcasetReceiver的註冊方式

  1. manifest資訊清單檔中的全域註冊

  2. 按照生命週期,在Service或者Activity中使用代碼註冊

manifest的註冊方式

 <receiver android:name="com.sample.test.MyBroadcastReciever">              <intent-filter>                  <action android:name="com.sample.test.ACTION_DO_SOMETHING"></action>                <action android:name="android.intent.ACTION_WIFI_STATE_CHANGED"></action>              </intent-filter>    </receiver>

使用代碼註冊

SampleActivity

private  MyReceiver receiver;@Override public void onStart() {      super.onStart();      receiver = new MyReceiver();    IntentFilter filter = new IntentFilter();    filter.addAction("android.intent.action.MY_BROADCAST");    registerReceiver(receiver, filter);}@Overridepublic void onStop(){    super.onStop();    unregisterReceiver(receiver);  }

Android中發送廣播的方式

普通廣播:無論優先順序大小,將發送給所有監聽Action="com.test.sample.action"的廣播,內容不可被修改,無傳遞性。

Intent intent = new Intent( "com.test.sample.action");sendBroadcast(intent);

非同步(黏性)廣播: 當處理完之後的Intent ,依然存在,這時候registerReceiver(BroadcastReceiver, IntentFilter) 還能收到他的值,直到你把它去掉 , 無傳遞性 , 無法終止(abort())廣播。

發這個廣播需要許可權<uses-permission android:name="android.permission.BROADCAST_STICKY" />

去掉是用這個方法removeStickyBroadcast(intent); 但別忘了在執行這個方法的應用裡面 AndroidManifest.xml 同樣要加上面的許可權;

sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,       initialCode, initialData, initialExtras)

有序廣播:

按照接收者的優先順序順序接收廣播 , 優先順序別在 intent-filter 中的 priority 中聲明 ,-1000 到1000 之間 ,值越大 優先順序越高 。可以終止廣播意圖的繼續傳播 , 接收者可以篡改內容,具有傳遞性。

sendBroadcast(intent);

Android中的BroadcastReceiver可以用來發送資訊到另一個廣播,這種方式可實現程式或者進程間的通行。


上面回顧了一下Android的廣播用例,總體來說安全性都不太好,因此只適用於安全性較低的資料傳遞,或者頁面更新。

在android-support-v4.jar中引入了LocalBroadcastManager,稱為局部通知管理器,這種通知的好處是安全性高,效率也高,適合局部通訊,可以用來代替Handler更新UI

public class LocalServiceBroadcasterActivity extends Activity {static final String ACTION_STARTED = "com.example.android.supportv4.STARTED";static final String ACTION_UPDATE = "com.example.android.supportv4.UPDATE";static final String ACTION_STOPPED = "com.example.android.supportv4.STOPPED";LocalBroadcastManager mLocalBroadcastManager;BroadcastReceiver mReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);final TextView callbackData = (TextView) findViewById(R.id.callback);callbackData.setText("No broadcast received yet");mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);IntentFilter filter = new IntentFilter();filter.addAction(ACTION_STARTED);filter.addAction(ACTION_UPDATE);filter.addAction(ACTION_STOPPED);mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(ACTION_STARTED)) {callbackData.setText("STARTED");} else if (intent.getAction().equals(ACTION_UPDATE)) {callbackData.setText("Got update: " + intent.getIntExtra("value", 0));} else if (intent.getAction().equals(ACTION_STOPPED)) {callbackData.setText("STOPPED");}}};mLocalBroadcastManager.registerReceiver(mReceiver, filter);Button button = (Button) findViewById(R.id.start);button.setOnClickListener(mStartListener);button = (Button) findViewById(R.id.stop);button.setOnClickListener(mStopListener);}@Overrideprotected void onDestroy() {super.onDestroy();mLocalBroadcastManager.unregisterReceiver(mReceiver);}private OnClickListener mStartListener = new OnClickListener() {public void onClick(View v) {startService(new Intent(LocalServiceBroadcasterActivity.this, LocalService.class));}};private OnClickListener mStopListener = new OnClickListener() {public void onClick(View v) {stopService(new Intent(LocalServiceBroadcasterActivity.this, LocalService.class));}};public static class LocalService extends Service {LocalBroadcastManager mLocalBroadcastManager;int mCurUpdate;static final int MSG_UPDATE = 1;Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case MSG_UPDATE: {mCurUpdate++;Intent intent = new Intent(ACTION_UPDATE);intent.putExtra("value", mCurUpdate);mLocalBroadcastManager.sendBroadcast(intent);Message nmsg = mHandler.obtainMessage(MSG_UPDATE);mHandler.sendMessageDelayed(nmsg, 1000);}break;default:super.handleMessage(msg);}}};@Overridepublic void onCreate() {super.onCreate();mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);}public int onStartCommand(Intent intent, int flags, int startId) {// Tell any local interested parties about the start.mLocalBroadcastManager.sendBroadcast(new Intent(ACTION_STARTED));// Prepare to do update reports.mHandler.removeMessages(MSG_UPDATE);Message msg = mHandler.obtainMessage(MSG_UPDATE);mHandler.sendMessageDelayed(msg, 1000);return ServiceCompat.START_STICKY;}@Overridepublic void onDestroy() {super.onDestroy();// Tell any local interested parties about the stop.mLocalBroadcastManager.sendBroadcast(new Intent(ACTION_STOPPED));// Stop doing updates.mHandler.removeMessages(MSG_UPDATE);}@Overridepublic IBinder onBind(Intent intent) {return null;}}}



Android 中LocalBroadcastManager的使用方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.