四大应用组件之广播

 自定义广播:

 1. 广播静态注册

    如何静态注册:
1.1.  定义BroadcastReceiver广播接收者

/**
 * 广播一旦onReceive 就是成为垃圾对象
 * 下一次接收,系统重新创建广播
 */
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String name= intent.getStringExtra("name");
        Log.e("denganzhi1","MyReceiver:"+name);

        // 中断广播
        abortBroadcast();

    }
}

1.2.  AndroidManifest.xml  注册广播

    <!-- 广播的静态注册,应用安装就会注册,但是不会创建对象,接收广播才创建对象
          接收以后就死了,重新接收,重新创建-->
        <receiver android:name=".MyReceiver">
            <intent-filter android:priority="2">
                <action android:name="com.example.administrator.myapplication.action"></action>
            </intent-filter>
        </receiver>

1.3. 发送广播:

   Intent intent=new Intent("com.example.administrator.myapplication.action");
        intent.putExtra("name","xiaoming");
        sendBroadcast(intent);

    2. 如何动态注册:

2.1.  在Activity中动态注册 registerReceiver

MyReceiver myReceiver=null;   
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 动态注册在Activity中注册, 调用方法就去注册
        // 广播接收器 绑定到宿主 Activity中,
        // 所以Activity死了时候,必须unregisterReceiver, 否则会报错
if(myReceiver==null){
    myReceiver=new MyReceiver();
    IntentFilter intentFilter=new IntentFilter("com.example.administrator.myapplication.action");
    registerReceiver(myReceiver,intentFilter);
}else{
    Log.e("denganzhi","已经注册");
}
    }

    @Override
    protected void onDestroy() {
        if(myReceiver!=null){
            unregisterReceiver(myReceiver);
        }
        super.onDestroy();
    }

  2.静态注册和动态注册区别:

区别: 广播的静态注册,应用安装就会注册,但是不会创建对象,接收广播才创建对象
          接收以后就死了,重新接收,重新创建
    
        动态注册: 执行方法以后才注册,activity退出的时候接除注册对象回收
 
   场景区分: 如果该广播只是服务于某一个Activitry,那么使用动态注册
   如果服务区应用,那么使用静态注册

3.   有序广播

 特点:有序广播,按照优先级来接收,并且可以中断广播 
   AndroidManifest.xm,  通过android:priority 执行接收优先级

<!-- 广播的静态注册,应用安装就会注册,但是不会创建对象,接收广播才创建对象
          接收以后就死了,重新接收,重新创建-->
        <receiver android:name=".MyReceiver">
            <!-- 最大是2147483647  Integr.Max
             值越大,越先调用 -->
            <intent-filter android:priority="2">
                <action android:name="com.example.administrator.myapplication.action"></action>
            </intent-filter>
        </receiver>

        <receiver android:name=".MyReceiver1">
            <intent-filter android:priority="1">
                <action android:name="com.example.administrator.myapplication.action"></action>
            </intent-filter>
        </receiver>

  发送有序广播:

  public void sendbroad(View view) {
        Intent intent=new Intent("com.example.administrator.myapplication.action");
        intent.putExtra("name","xiaoming");
        // 发送有序广播,第一个参数接受者权限
        sendOrderedBroadcast(intent,null);
    }

   中断广播,那么后面的无法接收:

/**
 * 广播一旦onReceive 就是成为垃圾对象
 * 下一次接收,系统重新创建广播
 */
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String name= intent.getStringExtra("name");
        Log.e("denganzhi1","MyReceiver:"+name);

        // 中断广播
        abortBroadcast();

    }
}

4.   系统广播案例,监听电量变化:

private MyReceiver receiver;
//当电量变化的时候发这个广播
		receiver = new MyReceiver();
		IntentFilter intentFiler = new IntentFilter();
		intentFiler.addAction(Intent.ACTION_BATTERY_CHANGED);
		registerReceiver(receiver, intentFiler);
			class MyReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			int level = intent.getIntExtra("level", 0);//0~100;
			Log.e("denganzhi","电量是:"+level);
			setBattery(level);//主线程
		}
	}
@Override
	protected void onDestroy() {
		//释放资源的时候,先释放子类,在释放父类
		if (receiver != null) {
			unregisterReceiver(receiver);
			receiver = null;
		}
		super.onDestroy();
		//这里技巧,释放的时候首先释放子类,然后在释放父类,否则会空指针异常
		// Activity都有了,其他也没有了
		// 初始化的时候首先初始化父类,然后子类
	}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值