Android学习笔记八:用Broadcast Receiver跨进程(跨app)通信

摘要:
当多个接收器接收广播的action相同时,则以它们在AndroidManifest.xml中注册的先后顺序依次接受、响应广播。

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7515194.html

在前面介绍四大组件的时候提到了可以对外部事件进行过滤的Broadcast Receiver,这里就对它的用法作进一步的探讨。

一:Broadcast Receiver的使用

主要有以下三个流程:定义接收器,在其中定义接收到广播后的响应行为——注册接收器,配置可以接收到什么广播——在其他地方发送广播。

1)定义接收器:继承BroadcastReceiver定义子类

public class MyBroadcastReceiver extendsBroadcastReceiver {  
    @Override  
    public voidonReceive(Context context, Intent intent) {  
        //定义接收到广播后的操作
}  
}  

2)在AndroidManifest.xml中注册接收器,通过intent-filter配置其action

<receiver android:name=".MyBroadcastReceiver">  
           <intent-filter>  
               <action android:name="com.example.broadcasttest.MY_BROADCAST" />  
           </intent-filter>  
</receiver> 

3)在其他地方,通过intent来发送广播

Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");  //指明action类型
sendBroadcast(intent);  

二:广播的响应链与优先级

通过intent来发送广播时,是以action来匹配广播接收器的。如果,有多个广播接收器,其action一样,会如何呢?这就是广播的链式响应。

当多个接收器接收广播的action相同时,则以它们在AndroidManifest.xml中注册的先后顺序依次接受、响应广播。

1)那么,这个过程可控吗?

当然,我们可以在AndroidManifest.xml中注册接收器时,为其指定响应优先级,这样,广播的响应就会根据优先级的高低而决定其响应的顺序了。

2)响应链条可以终止吗?

可以,我们可以在某一环接收器的 onReceive() 方法中,通过 abortBroadcast(); 来终止这个广播往下传递。通常,这个会搭配优先级来使用,达到清晰的链条控制的目的。

三:动态注册广播接收器

上面我们提到的在AndroidManifest.xml中注册是静态注册,静态注册的特点是:在AndroidManifest.xml中注册的接收器对于android系统全局可见,并且随着硬件设备的开启而开启,一直保持开启、监听状态。

如果,我们需要定义一种随着app运行而启动、随着app退出而停止的广播接收器,则需要用动态创建、动态注册的方式。

1)在程序的某个actvity中,以内部类的方式定义广播接收器

public class MainActivity extendsAppCompatActivity {  
    class LocalReceiver extendsBroadcastReceiver {  
        @Override  
        public voidonReceive(Context context, Intent intent) {  
            //定义响应
}  
    }  
}  

2)在activity的其他方法中(一般为onCreate())创建intent-filter,为其添加action类型;然后把内部创建的接收器实例以及intent-filter实例作为参数,通过LocalBroadcastManager.registerReceiver(localReceiver,intentFilter)动态注册

intentFilter = newIntentFilter(); //创建intent-filter
intentFilter.addAction("com.example.localbroadcast.LOCAL_BROADCAST");  //添加action类型
localReceiver = newLocalReceiver(); //创建内部广播接收器实例 
localBroadcastManager = localBroadcastManager.getInstance(this);  //获取系统本地广播接收器管理类实例
localBroadcastManager.registerReceiver(localReceiver, intentFilter);  //注册广播接收器

3)在该app的其他地方,发送广播

Intent intent = new Intent("com.example.localbroadcast.LOCAL_BROADCAST");  
localBroadcastManager.sendBroadcast(intent);  //注意:此处是通过localBroadcastManager来发送广播的

免责声明:文章转载自《Android学习笔记八:用Broadcast Receiver跨进程(跨app)通信》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇npm run build报错 No PostCSS Config found inC++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)控制 WebBrowser 控件的外观和行为下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android中ActionBar的使用

ActionBar是一个显示在屏幕顶部的控件,它包括了在左边显示的应用的logo图标和右边操作菜单的可见项。 ActionBar的基本操作 启用ActionBar Android3.0版本已经默认使用了ActionBar,因此只要在Mainifest.xml中配置的targetSdkVersion高于11(Android3.0),则默认会使用ActionB...

android判断adb调试是否打开及代码跳转到开发者选项界面

boolean enableAdb = (Settings.Secure.getInt(getContentResolver(), Settings.Secure.ADB_ENABLED, 0) > 0);//判断adb调试模式是否打开 if (enableAdb) { ToastUtil.showShort(...

Android开发高级进阶——多进程间通信

一. 什么是多进程? 多进程就是多个进程的意思,那么什么是进程呢? 当一个应用在开始运行时,系统会为它创建一个进程,一个应用默认只有一个进程,这个进程(主进程)的名称就是应用的包名。 进程的特点: 进程是系统资源和分配的基本单位,而线程是调度的基本单位。 每个进程都有自己独立的资源和内存空间 其它进程不能任意访问当前进程的内存和资源 系统给每个进程分...

Android开发之AIDL的使用一--跨应用启动Service

启动其他App的服务,跨进程启动服务。 与启动本应用的Service一样,使用startService(intent)方法 不同的是intent需要携带的内容不同,需要使用intent的setComponent()方法。 setComponent()方法需要传入两个参数,第一个参数是包名,第二个参数是组件名。即,第一个参数传入要启动的其他app的包名,第二...

android之Parcel机制学习

Parcel源码的分析,可以参考曹文斌的探索Android中的Parcel机制(上)。 本质上把Parcel当成一个Serialize,不同在于它是在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此会更加高效。 在Android中,最常见的使用Parcel类的情况是:在Activity间传递数据。在Activity间通过Intent传递数据的时候...

android中LitePal的使用

网上有一篇文章写的挺好的,推荐给大家:安卓项目实战之:数据库框架 LitePal 3.0 的使用详解 LitePal是对SQLite数据库操作进行了封装,采用对象映射的方式操作SQLite数据库,简化了对SQLiter的操作 我也是使用的是最新的LitePal3.0 1、首先添加依赖,引入LitePal3.0,在build.gradle中添加如下内容: i...