zoukankan      html  css  js  c++  java
  • Android学习笔记八:用Broadcast Receiver跨进程(跨app)通信

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

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

        一:Broadcast Receiver的使用

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

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

    public class MyBroadcastReceiver extends BroadcastReceiver {  
        @Override  
        public void onReceive(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 extends AppCompatActivity {  
      
        class LocalReceiver extends BroadcastReceiver {  
            @Override  
            public void onReceive(Context context, Intent intent) {  
                //定义响应
            }  
        }  
    }  

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

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

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

    Intent intent = new Intent("com.example.localbroadcast.LOCAL_BROADCAST");  
    localBroadcastManager.sendBroadcast(intent);  //注意:此处是通过localBroadcastManager来发送广播的
  • 相关阅读:
    编程之类 字符串包括问题
    Performance Counter的使用
    MVVM Light Toolkit使用指南
    Lambda表达式详解
    C#线程篇---Task(任务)和线程池不得不说的秘密(5)
    在WPF中如何使用RelativeSource绑定
    WPF中使用ObjectDataProvider绑定方法
    免费的精品: Productivity Power Tools 动画演示
    使用Myeclipse进行简单webservice开发的示例
    <context:component-scan>使用说明
  • 原文地址:https://www.cnblogs.com/ygj0930/p/7515194.html
Copyright © 2011-2022 走看看