Android Receiver两种注册方式--静态注册和动态

本文详细介绍了Android中的广播机制,包括静态注册与动态注册的方式,并对比了这两种方式的主要区别。通过具体的代码示例,展示了如何创建广播接收器以及如何发送广播。

一、静态注册

 创建广播类,如下:
public class MyReceiver extends BroadcastReceiver {
   public MyReceiver() {
   }
   @Override
   public void onReceive(Context context, Intent intent) {
     Toast t = Toast.makeText(context, "静态广播:" +intent.getStringExtra( "info" ), Toast.LENGTH_SHORT);
     t.setGravity(Gravity.TOP, 0 , 0 );
     t.show();
   }
}
在清单文件中注册广播,如下:
<? xml version = "1.0" encoding = "utf-8" ?>
< manifest xmlns:android = "http://schemas.android.com/apk/res/android"
   package = "com.example.administrator.day19" >
< uses-permission android:name = "android.permission.PROCESS_OUTGOING_CALLS" />
   < application
     android:allowBackup = "true"
     android:icon = "@mipmap/ic_launcher"
     android:label = "@string/app_name"
     android:supportsRtl = "true"
     android:theme = "@style/AppTheme" >
     < activity android:name = ".MainActivity" >
       < intent-filter >
         < action android:name = "android.intent.action.MAIN" />
 
         < category android:name = "android.intent.category.LAUNCHER" />
       </ intent-filter >
     </ activity >
     //生成的receiver配置文件
     < receiver
       android:name = ".MyReceiver"
       android:enabled = "true"
       android:exported = "true" >
       < intent-filter >
       //自定义Action
         < action android:name = "MLY" />
       </ intent-filter >
     </ receiver >
   </ application >
</ manifest >
发送广播,如下:
public class MainActivity extends AppCompatActivity {
   DynamicReceiver dynamicReceiver;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super .onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
   }
   //静态广播点击
   public void send(View v){
     Intent intent = new Intent();
     intent.setAction( "MLY" );
     intent.putExtra( "info" , "panhouye" );
     sendBroadcast(intent);
   }
}


二、动态注册


public class MainActivity extends AppCompatActivity {
   DynamicReceiver dynamicReceiver;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super .onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     //实例化IntentFilter对象
     IntentFilter filter = new IntentFilter();
     filter.addAction( "panhouye" );
     dynamicReceiver = new DynamicReceiver();
     //注册广播接收
     registerReceiver(dynamicReceiver,filter);
   }
   //按钮点击事件
   public void send2(View v){
     Intent intent = new Intent();
     intent.setAction( "panhouye" );
     intent.putExtra( "sele" , "潘侯爷" );
     sendBroadcast(intent);//发送广播
   }
   /*动态注册需在Acticity生命周期onPause通过
    *unregisterReceiver()方法移除广播接收器,
    * 优化内存空间,避免内存溢出
    */
   @Override
   protected void onPause() {
     super .onPause();
     unregisterReceiver( new MyReceiver());
   }
   //通过继承 BroadcastReceiver建立动态广播接收器
   class DynamicReceiver extends BroadcastReceiver{
     @Override
     public void onReceive(Context context, Intent intent) {
       //通过土司验证接收到广播
       Toast t = Toast.makeText(context, "动态广播:" + intent.getStringExtra( "sele" ), Toast.LENGTH_SHORT);
       t.setGravity(Gravity.TOP, 0 , 0 ); //方便录屏,将土司设置在屏幕顶端
       t.show();
     }
   }
三、两种注册方式的区别

(1)动态注册广播不是常驻型广播,也就是说广播跟随Activity的生命周期。注意在Activity结束前,移除广播接收器。

静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

(2)当广播为有序广播时:优先级高的先接收(不分静态和动态)。同优先级的广播接收器,动态优先于静态

(3)同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。

(4)当广播为默认广播时:无视优先级,动态广播接收器优先于静态广播接收器。同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后册的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲暇部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值