一.本地廣播
2.1 基本概念
由於之前的廣播都是全局的,所有應用程序都可以接收到,這樣就很容易會引起安全性的問題,比如說我們發送一些攜帶關鍵性數據的廣播有可能被其他的應用程序截獲,或者其他的程序不停地向我們的廣播接收器里發送各種垃圾廣播。
為了能夠簡單地解決廣播的安全性問題,Android引入了一套本地廣播機制,使用這個機制發出的廣播只能夠在應用程序的內部進行傳遞,並且廣播接收器也只能接收來自應用程序發出的廣播,這樣所有的安全性問題就都不存在了。
2.2 核心用法
使用LocalBroadcastManager來管理廣播:
- 調用LocalBroadcastManager.getInstance()來獲得實例
- 調用xx.registerReceiver()來注冊廣播
- 調用xx.sendBroadcast()發送廣播
- 調用xx.unregisterReceiver()取消注冊
2.3 注意事項
- 本地廣播無法通過靜態注冊來接收,相比起系統全局廣播更加高效
- 在廣播中啟動activity的話,需要為intent加入FLAG_ACTIVITY_NEW_TASK的標記,不然會報錯,因為需要一個棧來存放新打開的activity。
- 廣播中彈出AlertDialog的話,需要設置對話框的類型為:TYPE_SYSTEM_ALERT不然是無法彈出的。
二.代碼之旅
使用一個LocalBroadcastManager來對廣播進行管理,並提供了發送廣播和注冊廣播的接收器的方法,代碼如下所示:
package com.nyl.orderlybroadcast; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity implements View.OnClickListener { private Button btnOrderlyBroadcast; private IntentFilter intentFilter; private LocalReceiver localReceiver; private LocalBroadcastManager localBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); localBroadcastManager = LocalBroadcastManager.getInstance(this); btnOrderlyBroadcast = (Button) findViewById(R.id.btnOrderlyBroadcast); btnOrderlyBroadcast.setOnClickListener(this); } @Override public void onClick(View view) { Intent intent = new Intent("com.nyl.orderlybroadcast.AnotherBroadcastReceiver"); //發送本地廣播 localBroadcastManager.sendBroadcast(intent); intentFilter = new IntentFilter(); intentFilter.addAction("com.nyl.orderlybroadcast.AnotherBroadcastReceiver"); localReceiver = new LocalReceiver(); //注冊本地接收器 localBroadcastManager.registerReceiver(localReceiver,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); localBroadcastManager.unregisterReceiver(localReceiver); } private class LocalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"收到本地廣播",Toast.LENGTH_SHORT).show(); } } }
運行效果如下圖:
好了,廣播接收器的內容已經學完了,內容不是很多,所以接下來綜合運用一下本章中所學到的知識來做一個強制下線的功能~~~~