美文网首页老生常谈
Android广播机制和广播接收器Broadcast Recei

Android广播机制和广播接收器Broadcast Recei

作者: 万事命名难 | 来源:发表于2020-02-19 12:03 被阅读0次

    [TOC]

    简介

    广播机制,本质上是一种组件间的通信方式,如果是两个组件位于不同的进程当中,也可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它们之间可以用来通信的方式就更多了,这样看来,广播机制似乎是多余的。然而,广播机制却是不可替代的,它和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。

    广播负责发出信号,需要用四大组件之一的Broadcast Receiver广播接收器接收信号。一般四大组件都要注册在清单文件中,而广播也可以在代码中注册;

    广播分类

    Android中的广播主要可以分为两种类型,标准广播和有序广播。

    1. **标准广播****(Normal broadcasts):标准广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎会在同一时刻接收到这条广播消息。这种广播效率比较高,但同时也意味着它是无法被截断的。
    2. 有序广播(Ordered broadcasts):有序广播则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递。
    3. 系统广播 Android 内置了很多系统级别的广播,我们可以在应用中通过监听这些广播来得到各种系统的状态信息
    4. 本地广播 为了解决广播安全性问题,Android 引入了一套本地广播机制,使用这个机制发出的广播只能在应用程序内部进行传递,并且广播接受器也只能接受来自本应用程序发出的广播;

    使用

    注册广播接收器

    静态广播和动态广播的区别

    1. 生存期,静态广播的生存期可以比动态广播的长很多,因为静态广播很多都是用来对系统时间进行监听,比如我们可以监听手机开机。而动态广播会随着context的终止而终止

    2. 优先级,动态广播的优先级比静态广播高

    3. 静态广播比较耗费资源

    4. 静态注册可以让程序在停止状态的情况下就能接收到广播。

      停止状态

      1. 应用安装后未运行

      2. 应用被手动(设置-应用-强制停止)或者被其他应用强制停止

        如果需要启动处于停止状态的应用,则只要为Intent添加FLAG_INCLUDE_STOPPED_PACKAGES 标记即可。(stopped机制)

    1.静态注册(和在 AndroidManifest.xml 中注册)

      <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="MyAction" />
            </intent-filter>
      </receiver>
    

    2.动态注册(在代码中注册)

    动态注册广播接收器可以自由地控制注册与注销。但必须先注册,再发送广播才能接收到广播。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //实例化广播接收器对象
        reciever = new MyReceiver();
        //构建一个意图过滤器IntentFilter
        IntentFilter filter = new IntentFilter();
        //添加Action表明该广播接收器能接收什么类型的广播
        filter.addAction("MyAction");
        //注册广播接收器
        registerReceiver(reciever,filter);
        //动态注册时,先注册,再发送广播
        sendBroadcast(new Intent("MyAction"));
     }
     @Override
     protected void onDestroy() {
        super.onDestroy();
        //解除注册
        if(reciever != null)unregisterReceiver(reciever);
    }
    

    广播接收器

    public class MyReceiver extends BroadcastReceiver {
        public MyReceiver() {
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO: 这个方法在广播接收器接收时被调用
            // an Intent broadcast.
            //throw new UnsupportedOperationException("Not yet implemented");
            System.out.print("程序已启动");
            Toast.makeText(context,"程序已启动",Toast.LENGTH_SHORT).show();
        }
    }
    

    发送广播

    sendBroadcast(Intent var1);
        public abstract void sendBroadcast(Intent var1, String var2);
    
        public abstract void sendOrderedBroadcast(Intent var1, String var2);
    
        public abstract void sendOrderedBroadcast(Intent var1, String var2, BroadcastReceiver var3, Handler var4, int var5, String var6, Bundle var7);
    //var2:接收权限 var3:指定必须收到的接收器 var4:消息处理器 var6:传入的字符串 var7:传入的bundle;
    
        public abstract void sendBroadcastAsUser(Intent var1, UserHandle var2);
    
        public abstract void sendBroadcastAsUser(Intent var1, UserHandle var2, String var3);
    
        public abstract void sendOrderedBroadcastAsUser(Intent var1, UserHandle var2, String var3, BroadcastReceiver var4, Handler var5, int var6, String var7, Bundle var8);
    

    接受权限配置

        <permission android:name="你自定义的权限名称" android:protectionLevel="normal"></permission>   
    

    终止广播

    在广播接收器里调用abortBroadcast()阻止其他接受者接收,只适用于有序广播。

    相关文章

      网友评论

        本文标题:Android广播机制和广播接收器Broadcast Recei

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