"BroadcastReceiver"-安卓面試必問技能點大總結"
阿新 • • 發佈:2019-02-02
大家好,現在我們開始講解四大元件之三-廣播接收者,一下是技能點大總結,讓我們詳細的去了解吧.
廣播接收者:
1.請描述一下BroadcastReceiver
- 1.是四大元件之一,主要用於接收app傳送的廣播
- 2.內部通訊實現機制:通過android系統的Binder機制.
3.廣播分為兩種:
- 無序廣播
- 優點:完全非同步,邏輯上可被任何接受者收到廣播,效率高
- 缺點:接受者不能講處理結果交給下一個接受者,且無法終止廣播.
- 有序廣播
- 按被接收者的優先順序循序傳播
- A>B>C,每個都有權終止廣播,下一個就得不到
- 每一個都可進行修改操作,下一個就得到上一個修改後的結果.
- 無序廣播
4.最終廣播者:
- Context.sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras)時我們可以指定resultReceiver為最終廣播接收者.
- 如果比他優先順序高的接受者不終止廣播,那麼他的onReceive會執行兩次
- 第一次是正常的接收
- 第二次是最終的接收
- 如果優先順序高的那個終止廣播,那麼還是依然收到一次最終的廣播
5.常見的廣播接收者運用場景:
- 開機啟動,sd卡掛載,低電量,外撥電話,鎖屏等
- 比如根據產品經理要求,設計播放音樂時,鎖屏是否決定暫停音樂.
2.在mainfest和程式碼如何註冊和使用BroadcastReceiver?-一個action是重點
1.情況檔案註冊(靜態廣播)
- 只要app還在執行,那麼會一直收到廣播訊息
演示:
1.一個app裡:自定義一個類繼承BroadcastReceiver然後要求重寫onReveiver方法
public class MyBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d("MyBroadCastReceiver", "收到資訊,內容是 : " + intent.getStringExtra("info") + ""); } }
2.清單檔案註冊,並設定Action,就那麼簡單完成接收準備工作
<receiver android:name=".MyBroadCastReceiver"> <intent-filter> <action android:name="myBroadcast.action.call"/> </intent-filter> </receiver>
2.程式碼註冊(動態廣播)
- 當註冊的Activity或者Service銷燬了那麼就會接收不到廣播.
演示:
- 1.在和廣播接受者相同的app裡的MainActivity新增一個註冊按鈕,用來註冊廣播接收者
2.設定意圖過濾,新增Action
//onCreate建立廣播接收者物件 mReceiver = new MyBroadCastReceiver(); //註冊按鈕 public void click(View view) { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("myBroadcast.action.call"); registerReceiver(mReceiver, intentFilter); }
3.銷燬的時候取消註冊
@Override protected void onDestroy() { unregisterReceiver(mReceiver); super.onDestroy(); }
3.在另一個app,定義一個按鈕,設定意圖,意圖新增訊息內容,意圖設定action()要匹配,然後傳送廣播即可.
public void click(View view) { Intent intent = new Intent(); intent.putExtra("info", "訊息內容"); intent.setAction("myBroadcast.action.call"); sendBroadcast(intent); }
兩個app都執行之後:靜
- 靜態註冊的方法:另一app直接發廣播就收到了
- 動態註冊的方法:自己的app先程式碼註冊,然後另一個app直接發廣播即可.
3.BroadCastReceiver的生命週期
- a.只有一個onReceiver, 相當的短暫,方法完成後廣播接受者 就銷燬,傳送一次呼叫一次
- b.接受者不要做耗時操作,否則出現ANR
- c.也不要開啟子執行緒進行耗時操作,因為生命週期結束後 整個程序就變程序了,容易被系統殺掉
- d.耗時較長的工作最好放在服務裡.
4.如何讓自己的廣播只讓指定的app接收?
在傳送廣播的app端,自定義定義許可權,那麼想要接收的另外app端必須宣告許可權才能收到.
- 1.許可權,保護層級是普通正常.
- 2.使用者許可權
<permission android:name="broad.ok.receiver" android:protectionLevel="normal"/>
<uses-permission android:name="broad.ok.receiver" />
- 3.傳送廣播的時候加上許可權字串
public void click(View view) {
Intent intent = new Intent();
intent.putExtra("info", "訊息內容");
intent.setAction("myBroadcast.action.call");
sendBroadcast(intent, "broad.ok.receiver");
//sendOrderedBroadcast(intent,"broad.ok.receiver");
}
其他app接收者想好獲取廣播,必須宣告在清單檔案許可權
<uses-permission android:name="broad.ok.receiver"/>
5.什麼是最終廣播接收者
(針對有序廣播來說)
- Context.sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras)時我們可以指定resultReceiver為最終廣播接收者.
- 最終接受者可能會接收到兩次:第一次:按照標準的優先順序接收,第二次,作為final receiver肯定會收到.
6.廣播的優先順序對無序廣播生效嗎?
- 優先順序對無序也生效.
7.動態註冊的廣播優先順序誰高?
- 誰先註冊,誰就高
8.如何判斷當前的BrodcastReceiver接收到的是有序還是無序的廣播?
- 在onReceiver方法裡,直接呼叫判斷方法得返回值
public void onReceive(Context context, Intent intent) {
Log.d("MyBroadCastReceiver", "收到資訊,內容是 : " + intent.getStringExtra("info") + "");
boolean isOrderBroadcast = isOrderedBroadcast();
}
9.總結:
- 人家app傳送廣播,有action;那麼廣播接收者當然要註冊廣播(動/靜),並宣告action才能獲取到廣播
- 人家發廣播,有action,但是如果人家添加了許可權,那麼你雖然有action,但是如果沒許可權還是收不到,你也要懂許可權字串,並宣告才行.