欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

关于静态注册BroadcastReceiver接收不到非系统广播的问题

程序员文章站 2022-03-10 22:43:50
静态注册广播接收器接收不到自己发送的广播参照郭霖老师的《第一行代码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, 左边是本步骤操作接收到,右边是第一步操作接收到。
关于静态注册BroadcastReceiver接收不到非系统广播的问题关于静态注册BroadcastReceiver接收不到非系统广播的问题

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

相关标签: android