android 8.0跨App(程序)傳送廣播
引言
解決辦法
我們知道廣播的註冊方式分為兩種:
靜態註冊,也就是說在AndroidManifest檔案中對BroadcastReceiver進行註冊,通常還會加上action用來過濾。
動態註冊,呼叫Context中的registerReceiver對廣播進行動態註冊,使用unRegisterReceiver方法對廣播進行取消註冊的操作。
既然android 8.0已經限制了靜態註冊,我們就不必在靜態註冊上面費工夫了(除非你想折騰下)。
這裡假設有兩個app A和B,其中A為傳送廣播的app,B為接收廣播的app
第一步:在A app中定義許可權,並且使用自定義許可權
<uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" />
<permission
android:name="com.cn.customview.permissions.MY_BROADCAST"
android:protectionLevel="signature" >
</permission>
注意:android:protectionLevel=”signature” 如果是同一個應用可以這麼宣告,如果跨app傳送廣播(比如A app向B app傳送廣播),則需要去掉android:protectionLevel=”signature”。
第二步:在B app中定義註冊廣播
private static final String BROADCAST_PERMISSION_DISC = "com.cn.customview.permissions.MY_BROADCAST";
private static final String BROADCAST_ACTION_DISC = "com.cn.customview.permissions.my_broadcast";
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.broadcast_permissions_activity);
ButterKnife.bind(this);
// 註冊廣播接收
BroadcastReceiver receiveBroadCast = new ReceiveBroadCast();
IntentFilter filter = new IntentFilter();
filter.addAction(BROADCAST_ACTION_DISC); // 只有持有相同的action的接受者才能接收此廣播
registerReceiver(receiveBroadCast, filter,BROADCAST_PERMISSION_DISC,null);
}
public class ReceiveBroadCast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(BroadcastPermissionsActivity.this,
"receive broadcast", 0).show();
}
}
註冊一個廣播,並且申明,這個廣播需要BROADCAST_PERMISSION_DISC許可權才能收到訊息。但是我們應用程式已經註冊了這個許可權。所以是有這個許可權的。
同時在B app的AndroidManifest中宣告許可權:
<uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" />
第三步: 在A app中傳送廣播
public void sendBroadcastWithPermissions() {
Intent intent = new Intent(); //Itent就是我們要傳送的內容
intent.putExtra("data", "this is data from broadcast "+Calendar.getInstance().get(Calendar.SECOND));
intent.setAction(BROADCAST_ACTION_DISC); //設定你這個廣播的action,只有和這個action一樣的接受者才能接受者才能接收廣播
sendBroadcast(intent,BROADCAST_PERMISSION_DISC); //傳送廣播
}
代表接收訊息的廣播需要BROADCAST_PERMISSION_DISC許可權。
注意:
1.registerReceiver(receiveBroadCast, filter,BROADCAST_PERMISSION_DISC,null);如果改為registerReceiver(receiveBroadCast, filter); 照樣能夠收到第三步傳送的訊息,因為我們在xml裡面已經申請了BROADCAST_PERMISSION_DISC許可權,所以sendBroadcast(intent,BROADCAST_PERMISSION_DISC);傳送廣播我們依然能收到。
2.sendBroadcast(intent,BROADCAST_PERMISSION_DISC); 改為sendBroadcast(intent);也同樣能收到這個訊息。因為第一個的意思是收到這個訊息的廣播監聽器必須有BROADCAST_PERMISSION_DISC許可權,如果第二個引數去掉,則說明廣播監聽器不需要任何許可權就能收到這個訊息。
由於某些方面的限制,不能貼我自己的程式碼,為了給大家提供解決問題的思路,本文大量使用了這篇部落格的程式碼,有需要的可以檢視。