美文网首页
Android-Broadcast Receiver(广播接收器

Android-Broadcast Receiver(广播接收器

作者: Override0330 | 来源:发表于2019-04-13 01:38 被阅读0次

    简单记录Broadcast Receiver(广播接收器)的简单实用

    1. 广播分类

    1.1 Normal broadcasts 标准广播

    完全异步的广播,所有的广播接收器几乎同时受到广播且无法截断。

    1.2 Ordered broadcast 有序广播

    显然对比与标准广播,有序广播就是有序的,可以设置各个接收器的优先级,可以被截断。

    2. 注册全局广播接收器

    全部广播代表,整个Android系统中的所有广播接收器都可以收到的广播

    2.1 动态注册广播接收器

    接受系统广播

    主要步骤如下:

    1. 自定义广播接收器继承自BroadcastReceiver,并重写onReceive方法
    class NetWorkReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                networkInfo = connectivityManager.getActiveNetworkInfo();//需要申请权限
                if (networkInfo != null && networkInfo.isAvailable())
                    Toast.makeText(context,"网络开启了",Toast.LENGTH_SHORT).show();
                else
                    Toast.makeText(context,"网络关闭了",Toast.LENGTH_SHORT).show();
            }
        }
    
    1. 在代码中新建一个自定义广播接收器的实例,并在Activity中注册,注册时需要传入该广播接收器所接受的广播类型。
    public class MainActivity extends AppCompatActivity {
        private IntentFilter intentFilter;
        private NetworkInfo networkInfo;
        private NetWorkReceiver netWorkReceiver;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            intentFilter = new IntentFilter();
            netWorkReceiver = new NetWorkReceiver();
            intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//设置广播接收器接受的内容
            registerReceiver(netWorkReceiver,intentFilter);//注册广播接收器
        }
    }
    
    1. 在Activity的onDestroy方法中要取消注册广播接收器。
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(netWorkReceiver);
        }
    

    此时变设置好了一个接受系统广播的广播接收器,当数据网络开关出现变化时,会接受到相应的广播并发出Toast信息。

    2.2 注册静态广播接收器

    静态广播接收器还有一个特性,那就是在系统没有启动的时候就能够接受广播并对他进行处理

    2.2.1 接受系统广播(开机启动)
    1. 同样自定义广播接收器继承自BroadcastReceiver,并重写onReceive方法
    public class BootCompleteReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"开机了!",Toast.LENGTH_LONG).show();
        }
    }
    
    1. 在AndroidManifest.xml文件中注册(如果使用as自动创建的则自动注册)
    <application
            >
            <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=".BootCompleteReceiver"
                android:enabled="true"
                android:exported="true">
                <intent-filter>
                    <action
                        android:name="android.intent.action.BOOT_COMPLETED"></action>
                </intent-filter>
            </receiver>
        </application>
    
    2.3 发送自定义广播并接收

    自定义的广播使用静态注册

    2.3.1 发送标准广播
    1. 广播接收器注册

    步骤同静态广播接收器一致,不过在AndroidManifest.xml文件中不仅仅注册时,广播接收器的<intent-filter>标签里应该填写自己自定义的广播名

    ......
    <intent-filter>
                    <action
                        android:name="com.override0330.example"></action>
                </intent-filter>
    ......
    
    1. 发送广播-使用Intent发送:
    ......
    Intent intent = new Intent("com.override0330.example");
    sendBroadcast(intent);
    ......
    
    2.3.2 发送有序广播
    1. 广播接收器注册

    步骤同发送标准广播一致,但是多加入一个优先级的设置

    ......
    <intent-filter android:priority="98">//设置优先级为98,最高为100
                    <action
                        android:name="com.override0330.example"></action>
                </intent-filter>
    ......
    
    1. 发送有序广播
    Intent intent = new Intent("com.override0330.example");
    sendOrderBroadcast(intent, null);//null参数为一个与权限相关的字符串,一般情况传入null
    
    1. 截断广播

    在想要截断的广播接收器的onReceive里使用

    abortBroadcast();//截断该广播
    

    3.使用本地广播

    本地广播区别于全局广播,它只在本应用程序中传递,如果掌握了全局广播,那么本地广播的使用是非常简单的。而且貌似本地广播只能使用标准广播。
    将上图中我们使用的注册广播接收器和发送广播的方法改为使用由LocalBroadcastManager的方法:

    //获取LocalBroadManage实例
    LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
    //发送本地广播
    localBroadcastManager.sendBroadcast(intent);
    //注册本地广播接收器
    localBroadcastManager.registerReceiver(localBroadReceiver,intentFilter);
    

    4. 总结

    广播的使用还是相当简单的,但是它的底层实现还有待我的研究√

    相关文章

      网友评论

          本文标题:Android-Broadcast Receiver(广播接收器

          本文链接:https://www.haomeiwen.com/subject/uqjcwqtx.html