引言
在Android 8.0的平臺上,應用不能對大部分的廣播進行靜態註冊,也就是說,不能在AndroidManifest文件對有些廣播進行靜態註冊,這裏必須強調是有些廣播,由於有些廣播仍是可以註冊的。好比,通過測試,對接收Android 開機的廣播經過靜態註冊仍是可以正常接收的。
android
解決辦法
咱們知道廣播的註冊方式分爲兩種:app
靜態註冊,也就是說在AndroidManifest文件中對BroadcastReceiver進行註冊,一般還會加上action用來過濾。ide
動態註冊,調用Context中的registerReceiver對廣播進行動態註冊,使用unRegisterReceiver方法對廣播進行取消註冊的操做。測試
既然android 8.0已經限制了靜態註冊,咱們就沒必要在靜態註冊上面費工夫了(除非你想折騰下)。this
這裏假設有兩個app A和B,其中A爲發送廣播的app,B爲接收廣播的appspa
第一步:在A app中定義權限,而且使用自定義權限.net
1 <uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" /> 2 3 <permission 4 android:name="com.cn.customview.permissions.MY_BROADCAST" 5 android:protectionLevel="signature" > 6 </permission>
注意:android:protectionLevel=」signature」 若是是同一個應用能夠這麼聲明,若是跨app發送廣播(好比A app向B app發送廣播),則須要去掉android:protectionLevel=」signature」。code
關於protectionLevel,你們能夠參考下面博客:
https://blog.csdn.net/u013553529/article/details/53167072xml
第二步:在B app中定義註冊廣播blog
1 private static final String BROADCAST_PERMISSION_DISC = "com.cn.customview.permissions.MY_BROADCAST"; 2 private static final String BROADCAST_ACTION_DISC = "com.cn.customview.permissions.my_broadcast"; 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.broadcast_permissions_activity); 8 ButterKnife.bind(this); 9 // 註冊廣播接收 10 BroadcastReceiver receiveBroadCast = new ReceiveBroadCast(); 11 IntentFilter filter = new IntentFilter(); 12 filter.addAction(BROADCAST_ACTION_DISC); // 只有持有相同的action的接受者才能接收此廣播 13 registerReceiver(receiveBroadCast, filter,BROADCAST_PERMISSION_DISC,null); 14 } 15 16 public class ReceiveBroadCast extends BroadcastReceiver { 17 18 @Override 19 public void onReceive(Context context, Intent intent) { 20 Toast.makeText(BroadcastPermissionsActivity.this, 21 "receive broadcast", 0).show(); 22 } 23 24 }
註冊一個廣播,而且申明,這個廣播須要BROADCAST_PERMISSION_DISC權限才能收到消息。可是咱們應用程序已經註冊了這個權限。因此是有這個權限的。
同時在B app的AndroidManifest中聲明權限:
<uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" />
第三步: 在A app中發送廣播
1 public void sendBroadcastWithPermissions() { 2 Intent intent = new Intent(); //Itent就是咱們要發送的內容 3 intent.putExtra("data", "this is data from broadcast "+Calendar.getInstance().get(Calendar.SECOND)); 4 intent.setAction(BROADCAST_ACTION_DISC); //設置你這個廣播的action,只有和這個action同樣的接受者才能接受者才能接收廣播 5 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權限,若是第二個參數去掉,則說明廣播監聽器不須要任何權限就能收到這個消息。