按照顺序来,第二个是广播接收者BroadcastReceiver.
BroadcastReceiver
1.Xmind
2. 注册方式
这些还是有必要具体讲一讲的
静态注册
AndroidManifest.xml:<receiver android:name="blog.broadcastReciver.01Test "> <intent-filter> <action android:name="android.intent.action.MEDIA_UNMOUNTED"/> <data android:scheme="unmounted"></data> </intent-filter> </receiver>
动态注册
在Java代码中注册:public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilter intentFilter = new IntentFilter("android.intent.action.MEDIA_UNMOUNTED"); intentFilter.addDataScheme("unmounted"); registerReceiver(new SDCardUnmountedReceiver(), intentFilter); } }
上面两个方法添加的事件都是media是否挂再,media在这里是外部储存的意思,所以验证方式也是在设置中移除sdcard就能收到这样的广播了。
- 注意事项
- 在AndroidManifest.xml中注册的广播接收者在应用运行一次之后就会被注册到系统里了,以后不需要在运行这个广播接收者也能够接收到广播了。
- 动态注册的优先级会高于静态注册,但是动态注册的却不能像静态注册那样一次运行就被添加入系统当中,他会跟随Activity的生命周期,Activity销毁时,它也会一并被销毁。
- 无论静态注册还是动态注册,都需要在清单文件中添加需要的权限。
3.自定义广播
来个例子吧.
先是创建一个发送自定义广播的。
创建一个布局文件添加一个按钮:
<Button android:id="@+id/send" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送广播" />
为主活动实现OnClickListener接口,添加点击监听:
findViewById(R.id.send).setOnClickListener(this);
覆写onClick方法
@Override public void onClick(View view){ Intent intent_normal = new Intent(); intent_normal.setAction("sendBroadcast.Action.NormalBroadcast"); intent_normal.putExtra("data", "send Normal Broadcast"); Log.d("tag", "normalBroadcast"); sendBroadcast(intent_normal); }
创建一个接受自定义广播的。
用来接受自定义广播的应用。
创建类继承BroadcastReceiver
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String data = intent.getStringExtra("data"); Toast.makeText(context, "receive data:"+data, Toast.LENGTH_SHORT).show(); Log.d("tag", "receive data:"+data); } }
- 在清单文件中注册
<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="sendBroadcast.Action.OrderedBroadcast"/> </intent-filter> </receiver>
之后运行两个应用,在按下发送端的按键时,接收端能够接收到其数据。而这个事件是我们自己自定义的,只需要两个应用间事件名相同,就能够匹配。
4.广播大全
最后来个资源,Android的广播大全。
android.provider.Telephony.SMS_RECEIVED
—–系统收到短信时发送的广播android.net.conn.CONNECTIVITY_CHANGE
—–网络状态改变Intent.ACTION_AIRPLANE_MODE_CHANGED;
——封闭或打开飞行模式时的广播Intent.ACTION_BATTERY_CHANGED;
——充电状况,或者电池的电量产生变更
——电池的充电状况、电荷级别改变,不克不及经由过程组建声明接管这个广播,只有经由过程Context.registerReceiver()注册Intent.ACTION_BATTERY_LOW;
——默示电池电量低Intent.ACTION_BATTERY_OKAY;
——默示电池电量充沛,即从电池电量低变更到饱满时会发出广播Intent.ACTION_BOOT_COMPLETED;
——在开机启动完成后,这个动作被广播一次(只有一次)。Intent.ACTION_CAMERA_BUTTON;
——按下拍照时的摄影按键(硬件按键)时发出的广播Intent.ACTION_CLOSE_SYSTEM_DIALOGS;
——当屏幕超时进行锁屏时,当用户按下电源按钮,长按或短按(不管有没跳出话框),进行锁屏时,android体系都邑广播此Action消息Intent.ACTION_CONFIGURATION_CHANGED;
——设备当前设置被改变时发出的广播(包含的改变:界面说话,设备标的目标,等,请参考Configuration.java)Intent.ACTION_DATE_CHANGED;
——设备日期产生改变时会发出此广播Intent.ACTION_DEVICE_STORAGE_LOW;
——设备内存不足时发出的广播,此广播只能由体系应用,其它APP不成用?Intent.ACTION_DEVICE_STORAGE_OK;
——设备内存从不足到充沛时发出的广播,此广播只能由体系应用,其它APP不成用?Intent.ACTION_DOCK_EVENT;
——发出此广播的处所frameworks\base\services\java\com\android\server\DockObserver.javaIntent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;
——移动APP完成之后,发出的广播(移动是指:APP2SD)Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
——正在移动APP时,发出的广播(移动是指:APP2SD)Intent.ACTION_GTALK_SERVICE_CONNECTED;
——Gtalk已建树连接时发出的广播Intent.ACTION_GTALK_SERVICE_DISCONNECTED;
——Gtalk已断开连接时发出的广播Intent.ACTION_HEADSET_PLUG;
——在耳机口上插入耳机时发出的广播Intent.ACTION_INPUT_METHOD_CHANGED;
——改变输入法时发出的广播Intent.ACTION_LOCALE_CHANGED;
——设备当前区域设置已更改时发出的广播Intent.ACTION_MEDIA_BAD_REMOVAL;
——未正确移除SD卡(正确移除SD卡的办法:设置–SD卡和设备内存–卸载SD卡),但已把SD卡取出来时发出的广播
——广播:扩大介质(扩大卡)已经从 SD 卡插槽拔出,然则挂载点 (mount point) 还没解除 (unmount)Intent.ACTION_MEDIA_BUTTON;
——按下”Media Button” 按键时发出的广播,假如有”Media Button” 按键的话(硬件按键)Intent.ACTION_MEDIA_CHECKING;
——插入外部储存装配,比如SD卡时,体系会查验SD卡,此时发出的广播?Intent.ACTION_MEDIA_EJECT;
——已拔掉外部大容量储存设备发出的广播(比如SD卡,或移动硬盘),不管有没有正确卸载都邑发出此广播?
——广播:用户想要移除扩大介质(拔掉扩大卡)。Intent.ACTION_MEDIA_MOUNTED;
——插入SD卡并且已正确安装(辨认)时发出的广播
——广播:扩大介质被插入,并且已经被挂载。Intent.ACTION_MEDIA_REMOVED;
——外部储存设备已被移除,不管有没正确卸载,都邑发出此广播?
—— 广播:扩大介质被移除。Intent.ACTION_MEDIA_SCANNER_FINISHED;
——广播:已经扫描完介质的一个目次Intent.ACTION_MEDIA_SCANNER_STARTED;
——广播:开端扫描介质的一个目次Intent.ACTION_MEDIA_SHARED;
—— 广播:扩大介质的挂载被解除 (unmount),因为它已经作为 USB 大容量存储被共享。Intent.ACTION_MEDIA_UNMOUNTED
—— 广播:扩大介质存在,然则还没有被挂载 (mount)。Intent.ACTION_NEW_OUTGOING_CALL;
—— 拨打电话广播Intent.ACTION_PACKAGE_ADDED;
——成功的安装APK之后
——广播:设备上新安装了一个应用法度包。
——一个新应用包已经安装在设备上,数据包含包名(最新安装的包法度不克不及接管到这个广播)Intent.ACTION_PACKAGE_CHANGED;
——一个已存在的应用法度包已经改变,包含包名Intent.ACTION_PACKAGE_DATA_CLEARED;
——清除一个应用法度的数据时发出的广播(在设置--应用经管--选中某个应用,之后点清除数据时?)
——用户已经清除一个包的数据,包含包名(清除包法度不克不及接管到这个广播)Intent.ACTION_PACKAGE_INSTALL;
——触发一个下载并且完成安装时发出的广播,比如在电子市场里下载应用?
——Intent.ACTION_PACKAGE_REMOVED;
——成功的删除某个APK之后发出的广播
——一个已存在的应用法度包已经从设备上移除,包含包名(正在被安装的包法度不克不及接管到这个广播)Intent.ACTION_PACKAGE_REPLACED;
——调换一个现有的安装包时发出的广播(不管如今安装的APP比之前的新还是旧,都邑发出此广播?)Intent.ACTION_PACKAGE_RESTARTED;
——用户从头开端一个包,包的所有过程将被杀死,所有与其接洽的运行时候状况应当被移除,包含包名(从头开端包法度不克不及接管到这个广播)Intent.ACTION_POWER_CONNECTED;
——插上外部电源时发出的广播Intent.ACTION_POWER_DISCONNECTED;
——已断开外部电源连接时发出的广播Intent.ACTION_REBOOT;
——重启设备时的广播Intent.ACTION_SCREEN_OFF;
——屏幕被封闭之后的广播Intent.ACTION_SCREEN_ON;
——屏幕被打开之后的广播Intent.ACTION_SHUTDOWN;
——封闭体系时发出的广播Intent.ACTION_TIMEZONE_CHANGED;
——时区产生改变时发出的广播Intent.ACTION_TIME_CHANGED;
——时候被设置时发出的广播Intent.ACTION_TIME_TICK;
——广播:当前时候已经变更(正常的时候流逝)。
——当前时候改变,每分钟都发送,不克不及经由过程组件声明来接管,只有经由过程Context.registerReceiver()办法来注册Intent.ACTION_UID_REMOVED;
——一个用户ID已经从体系中移除发出的广播Intent.ACTION_UMS_CONNECTED;
——设备已进入USB大容量储存状况时发出的广播?Intent.ACTION_UMS_DISCONNECTED;
——设备已从USB大容量储存状况转为正常状况时发出的广播?Intent.ACTION_WALLPAPER_CHANGED;
——设备墙纸已改变时发出的广播
广播接收者内容较少,整理的比较快。
未完待续。。。