1. 程式人生 > >android 8.0跨App(程序)傳送廣播

android 8.0跨App(程序)傳送廣播

引言

解決辦法

我們知道廣播的註冊方式分為兩種:

  1. 靜態註冊,也就是說在AndroidManifest檔案中對BroadcastReceiver進行註冊,通常還會加上action用來過濾。

  2. 動態註冊,呼叫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許可權,如果第二個引數去掉,則說明廣播監聽器不需要任何許可權就能收到這個訊息。

由於某些方面的限制,不能貼我自己的程式碼,為了給大家提供解決問題的思路,本文大量使用了這篇部落格的程式碼,有需要的可以檢視。