关于静态注册BroadcastReceiver接收不到非系统广播的问题
程序员文章站
2023-12-31 15:10:22
静态注册广播接收器接收不到自己发送的广播参照郭霖老师的《第一行代码Android》5.3.1节,发送标准广播时,发现静态注册的广播接收器,没有对程序发送的标准广播做出反应。于是对问题进行了排查。1.自己动态注册了一个广播接收器,发现能够接收到自己发送的标准广播。以下附上本 Activity 的代码。public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; pri...
静态注册广播接收器接收不到自己发送的广播
参照郭霖老师的《第一行代码Android》5.3.1节,发送标准广播时,发现静态注册的广播接收器,没有对程序发送的标准广播做出反应。
于是对问题进行了排查。
1.自己动态注册了一个广播接收器,发现能够接收到自己发送的标准广播。以下附上本 Activity 的代码。
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
private MyBroadcastReceiver myBroadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //引用布局文件,给当前的活动加载一个布局
Button button = (Button) findViewById(R.id.button);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
intentFilter.addAction("com.example.broadcasttest.MY_BROADCAST");
//监听网络变化广播,监听自己发送的广播
networkChangeReceiver = new NetworkChangeReceiver(); //创建网络变化广播接收器实例
myBroadcastReceiver = new MyBroadcastReceiver(); //创建(myBroadcastReceiver)实例
registerReceiver(networkChangeReceiver, intentFilter);
registerReceiver(myBroadcastReceiver, intentFilter); //动态注册广播接收器
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver); //取消对动态注册的广播接收器的注册
}
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.isAvailable()) //判断网络是否可用
Toast.makeText(context,"network is Available", Toast.LENGTH_LONG).show();
else
Toast.makeText(context,"network is unAvailable", Toast.LENGTH_LONG).show();
}
}
}
2.在另一个程序动态注册一个广播接收器,发现也能够接收到上个程序发送的标准广播。
附上两张收到广播后弹出的Toast, 左边是本步骤操作接收到,右边是第一步操作接收到。
3.静态注册一个开机完成监听器,能够接收到开机广播。
那么问题出现在哪呢?附上Mainfest代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 静态注册的 非系统广播(不是系统发送的广播)接收器, 不能接收到广播-->
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
<!-- 静态注册的开机广播接收器, 能够成功接收到开机广播-->
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
<!-- 获得接收开机广播的权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- 获得接收网络变化广播的权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
百度后,得到的解答是8.0版本之后的,非系统广播仅在清单中声明接收器是不行的(可能是谷歌想要避免应用之间的打扰吧)。
个人解决方法:
1.非系统广播改用动态注册广播接收器接收(上面的步骤1)
可参考文章及解决方案:静态注册接收不到非系统广播原因探究
本文地址:https://blog.csdn.net/qq_41991365/article/details/107874901