android广播接受者学习

在生活中,电台要发布消息,通过广播把消息广播出去,使用收音机,就可以收听广播,得知这条消息.同样地,在Android中,系统在运行过程中,会产生会多事件,那么某些事件产生时,比如:电量改变、收发短信、拨打电话、屏幕解锁、开机,系统会发送广播,只要应用程序接收到这条广播,就知道系统发生了相应的事件,从而执行相应的代码。使用广播接收者,就可以收听广播.

 一创建广播接受者

创建一个类继承自BroadcastReceivre基类必须复写抽象方法onReceive()方法.广播接收器接收到相应广播后,会自动回调onReceive()方法.默认情况下,广播接收器运行在UI线程,因此,onReceive方法不能执行耗时操作,否则将导致ANR。

public class CallReceiver extends BroadcastReceiver {
	//接收到广播时就会调用
	@Override
	public void onReceive(Context context, Intent intent) {
		//添加IP线路
		//在打电话广播中,会携带拨打的电话的号码,通过以下代码获取到
		String number = getResultData();	
	}

}

二 注册广播接受者

2.1静态注册,在清单文件中,在application节点下注册,本例是注册的是一个打电话的广播,当此App首次启动时,系统会自动实例化CallReciver类,并注册到系统中.

       
            
                
            
        

2.2动态注册,就是在java代码动态设置.在代码中通过调用Context的registerReceiver()方法进行动态注册.

        //实例化BroadcastReceiver子类
        CallReceiver mBroadcastReceiver = new CallReceiver();
        IntentFilter intentFilter = new IntentFilter();
       //设置接收广播的类型
        intentFilter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
       //调用Context的registerReceiver()方法进行动态注册
        registerReceiver(mBroadcastReceiver, intentFilter);
注意:1.动态广播最好在Activity的onResume()注册、onPause()注销。对于动态广播,有注册就必然得有注销,否则会导致内存泄露.重复注册、重复注销也不允许不在onCreate() & onDestory() 或 onStart() & onStop()注册、注销是因为:当系统因为内存不足(优先级更高的应用需要内存,请看上图红框)要回收Activity占用的资源时,Activity在执行完onPause()方法后就会被销毁,有些生命周期方法onStop(),onDestory()就不会执行。当再回到此Activity时,是从onCreate方法开始执行。2. 安卓4.0以后广播接收者安装以后必须手动启动一次,否则不生效 4.0以后广播接收者如果被手动关闭,就不会再启动了

区别:静态注册会常驻系统,即使该app关闭了,系统发出了广播时,该app进程被启动,将消息发送给,不受app的生命周期的影响,缺点耗电,占内存.应用场景,适用需要时刻监听的情况.
动态注册的广播,跟随组件的生命周期,组件结束广播就结束了,组件结束前必须注销广播接受者,应用场景为,需要特定时刻监听广播.

三 自定义广播和接受广播.

1.随便发送一个广播
	//发送自定义广播
    	Intent intent = new Intent();
    	//广播中的action也是自定义的
    	intent.setAction("com.test.demo");
    	sendBroadcast(intent);
2.定义一个类来接受这个广播
public class ZDYReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		Toast.makeText(context, "成功接收到广播", 0).show();
	}

}
 清单文件中注册
       
            
                
            
        


四 安卓内置广播

Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播.每个广播都有特定的Intent - Filter(包括具体的action),Android系统广播action如下:
监听网络变化 android.net.conn.CONNECTIVITY_CHANGE
关闭或打开飞行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED
充电时或电量发生变化 Intent.ACTION_BATTERY_CHANGED
电池电量低 Intent.ACTION_BATTERY_LOW
电池电量充足(即从电量低变化到饱满时会发出广播 Intent.ACTION_BATTERY_OKAY
系统启动完成后(仅广播一次) Intent.ACTION_BOOT_COMPLETED
按下照相时的拍照按键(硬件按键)时 Intent.ACTION_CAMERA_BUTTON
屏幕锁屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
设备当前设置被改变时(界面语言、设备方向等) Intent.ACTION_CONFIGURATION_CHANGED
插入耳机时 Intent.ACTION_HEADSET_PLUG
未正确移除SD卡但已取出来时(正确移除方法:设置--SD卡和设备内存--卸载SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL
插入外部储存装置(如SD卡) Intent.ACTION_MEDIA_CHECKING
成功安装APK Intent.ACTION_PACKAGE_ADDED
成功删除APK Intent.ACTION_PACKAGE_REMOVED
重启设备 Intent.ACTION_REBOOT
屏幕被关闭 Intent.ACTION_SCREEN_OFF
屏幕被打开 Intent.ACTION_SCREEN_ON
关闭系统时 Intent.ACTION_SHUTDOWN
重启设备 Intent.ACTION_REBOOT


五 有序广播和无序广播

* 无序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序(同时收到)
* 有序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序
* 优先级的定义:-1000~1000
* 最终接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收
* abortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截

你可能感兴趣的:(安卓,广播接受者,android)