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来发送广播的
  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/ygj0930/p/7515194.html
Copyright © 2011-2022 走看看