Android 8.0的平台上,應用不能對大部分的廣播進行靜態注冊


引言
在Android 8.0的平台上,應用不能對大部分的廣播進行靜態注冊,也就是說,不能在AndroidManifest文件對有些廣播進行靜態注冊,這里必須強調是有些廣播,因為有些廣播還是能夠注冊的。比如,經過測試,對接收Android 開機的廣播通過靜態注冊還是能夠正常接收的。
 

解決辦法
我們知道廣播的注冊方式分為兩種:

靜態注冊,也就是說在AndroidManifest文件中對BroadcastReceiver進行注冊,通常還會加上action用來過濾。

動態注冊,調用Context中的registerReceiver對廣播進行動態注冊,使用unRegisterReceiver方法對廣播進行取消注冊的操作。

既然android 8.0已經限制了靜態注冊,我們就不必在靜態注冊上面費工夫了(除非你想折騰下)。

這里假設有兩個app A和B,其中A為發送廣播的app,B為接收廣播的app

第一步:在A app中定義權限,並且使用自定義權限

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”。

關於protectionLevel,大家可以參考下面博客:
https://blog.csdn.net/u013553529/article/details/53167072

第二步:在B app中定義注冊廣播

 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權限,如果第二個參數去掉,則說明廣播監聽器不需要任何權限就能收到這個消息。

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM