美文网首页
Android08-广播机制

Android08-广播机制

作者: figure_ai | 来源:发表于2017-04-07 17:42 被阅读0次

    广播的类型:

    1. 标准广播:完全异步执行的广播,这也意味着,在广播发出之后,所有的广播接收器几乎会在同一时刻接收到广播消息,因此它们之间没有先后顺序可言,这种广播的效率会比较高,标准广播的流程图如下所示。图片来自第一行代码


      2017-04-07_14-07-37.png
    1. 有序广播:一种同步执行的广播,在广播发出之后,同一时刻只有一个广播接收器能够收到这条广播消息。当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递。


      2017-04-07_14-09-52.png

    1. 接收系统广播

    Android内置了很多系统级别的广播,比如电池电量,时区时区、开关机、等状态变化时都可以发送系统广播。

    • 广播接收器的简介

    广播接收器可以自定义对某些广播进行注册,当收到注册的广播时能够在内部做相应的逻辑处理。

    • 如何创建一个广播接收器:

    新建一个类,让它继承自Broadcast-Receiver,并重写父类的onReceive()方法。这样当有广播进来的时,就会调用onRecevier()方法。

    • 注册广播的方式:
    1. 在代码中注册:也称为动态注册,动态注册的广播接收器在处理完业务之后都要取消注册。
    2. 在AndroidManifest.xml中注册:也称为静态注册。
      注:动态注册虽然灵活性高,但是需要在打开程序的情况下才可接收到广播。所以当需要实现开启启动时就需要用到静态注册了。另外在注册前都需要在配置文件中声明权限,否则直接崩溃
    ```
    

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.anwser_mac.broadcasttest">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    ```

    • 使用广播的注意点

    1.如果是静态注册广播的话需要在配置文件说明,如果是通过系统创建的话则系统会自动添加

    <receiver
    

    android:name=".BootCompleteReceiver"
    android:enabled="true"
    android:exported="true">
    </receiver>

    2.动态广播接收器在处理完业务之后要记得取消注册。
    3.涉及系统权限的广播都要在配置文件做声明。
    4.广播接收器中不允许开启线程,因此不能够在onReceiver()方法中处理过多逻辑或耗时操作,一般广播接收器扮演的是打开程序其他组件的角色,比如创建状态栏通知,或者启动一个服务。
    

    2. 发送自定义的广播

    2.1 发送标准广播

    具体思路

    1. 新建一个类,继承自BroadcastReceiver,重写onReceive()方法
    2. 在配置文件中声明广播的名称等属性
    <receiver
    
    android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
    </intent-filter>
    

    </receiver>

    3.发送广播,通过获得Intent实例,调用sendBroadcast()方法发送广播。
    
    

    Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
    sendBroadcast(intent);

    2.2发送有序广播

    1. 发送有序广播只需将3.中的sendBroadcast()改为sendOrderedBroadcast()即可。
    2. 在配置文件中可以通过android:priority属性设置广播接收的优先级
    <receiver
    
    android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="100">
            <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
    </intent-filter>
    

    </receiver>

    3.在某个广播器中可以通过调用absortBroadcast()截断通知继续传播。
    

    使用本地广播

    • 使用本地广播的注意点
    1. 本地广播机制发出的广播只能够在应用程序的内部进行传递,简单的解决了广播的安全性问题。并且广播接收器也只能接收来自本应用程序发出的广播。
    2. 本地广播主要就是使用LocalBroadcastManager来对广播进行管理,并提供了发送和注册广播接收器的方法。
    3. 本地广播无法通过静态注册的方式来接收。因为静态注册主要是为了让程序在为启动的情况下也能收到广播,而发送本地广播的前提是程序处于启动状态。
    • 使用本地广播的优势

    1.可以明确的知道发送的广播不会离开程序,因此不必担心机密数据泄漏的问题。

    1. 其他程序无法将广播发送到我们的程序内部,因此不必担心安全漏洞隐患。
    2. 发送本地广播比发送系统全局广播更加高效。
    • 使用实例如下

      public class MainActivity extends AppCompatActivity {
      
        private IntentFilter intentFilter;
      
        private LocalReceiver localReceiver;
      
        private LocalBroadcastManager localBroadcastManager;
      
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
      
            localBroadcastManager = LocalBroadcastManager.getInstance(this);
            Button button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                    localBroadcastManager.sendBroadcast(intent);
                }
            });
            intentFilter = new IntentFilter();
            intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
            localReceiver = new LocalReceiver();
            //注册广播
            localBroadcastManager.registerReceiver(localReceiver, intentFilter);
        }
      
        //定义一个广播接收器
        class LocalReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                Toast.makeText(context, "发送本地广播", Toast.LENGTH_SHORT).show();
            }
        }
      

    }

    相关文章

      网友评论

          本文标题:Android08-广播机制

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