好比时区的改变,数据链接状态,短信的接收,来电,底座模式,电池状态等等。 java
下面的列表介绍的是一些设备状态变化的Actions: android
1.ACTION_BOOT_COMPLETED 当你的安卓系统启动完成时触发,App要接收此广播,须要RECEIVE_BOOT_COMPLETED权限。 网络
2.ACTION_CAMERA_BUTTON 当照相机的按钮被点击。 app
3.ACTION_DATE_CHANGED 和 ACTION_TIME_CHANGED 日期或者时间被手动改变时会发送此广播。 this
4.ACTION_MEDIA_EJECT 外存储设备被物理得拔出的时候触发,一般指的是SD卡 .net
5.ACTION_MEDIA_MOUNTED和ACTION_MEDIA_UNMOUNTED 前者是外部存储(SD卡或U盘)被成功被加载,后者是成功被移除(注意这个跟物理拔出不同)。 code
注意:监听SD卡状态时候,除了ACTION必须之外,你的过滤器还须要data scheme为file.(好比intentFilter.addDataScheme("file"),很重要,否则收不到广播) ci
6.ACTION_NEW_OUTGOING_CALL 监听电话打出的广播,那么我能够看到号码么?答:能够,首先必定是存在发来的intent中,那么intent只要找到这个存储的键,就能够找到值,这个键是什么呢?答:EXTRA_PHONE_NUMER。 注意:须要权限PROCESS_OUTGOING_CALLS。 get
7.ACTION_SCREEN_ON和ACTION_SCREEN_OFF 分别监听的是屏幕打开和关闭。 it
8.ACTION_TIMEZONE_CHANGED 当前手机时区发生改变,Intent包含了time-zone键,返回的是Java.util.TimeZone的ID
以前咱们讨论过这个电池状态的广播Intent是属于Sticky Intent,因此一般不须要去声明一个接受者去接收。
Aciton是什么呢? 答:Intent.ACTION_BATTERY_CHANGED
例子:
IntentFilter batIntentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent battery = context.registerReceiver(null, batIntentFilter); int status = battery.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
这个intent里面包含了当前电量的电量状态,还有是不是充电状态。
值得注意一点:你不能在mainfest中去注册一个Receiver来监听电池变化这个ACTION。可是呢,你仍是能够监视电源的链接状况,低电池水平,和接下来的列出的:
1.ACTION_BATTERY_LOW 电池电量低
2.ACTION_BATTERY_OKAY 电池电量水平OK
3.ACTION_POWER_CONNECTED 与电源链接
4.ACTION_POWER_DISCONNECTED 与电源断开
那么这里所指的链接改变具体是什么呢?
答:包括带宽,延迟,可用的网络链接和一些对APP有用的信息发生改变。
应用场景举例:好比当你断开了wifi,你可能须要挂起app正在更新的东西,直到你又连上了。
注册这种广播,动态静态均可以,具体链接的信息,你还须要用到Connectivity Manager。
Aciton: mainfest中:android.net.conn.CONNECTIVITY_CHANGE,程序中:ConnectivityManager.CONNECTIVITY_ACTION
例子:
String svcName = Context.CONNECTIVITY_SERVICE; ConnectivityManager cm = (ConnectivityManager)context.getSystemService(svcName); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork.isConnectedOrConnecting(); boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE;
安卓设备能够放在车的底座或者办工桌的手机底座上。
废话很少说了,Action: Intent.ACTION_DOCK_EVENT(android.intent.action.ACTION_DOCK_EVENT) ,你能够获得底座状态和底座类型。
像电池状态的监听,这个广播intent,也是sticky的。
例子:
IntentFilter dockIntentFilter = new IntentFilter(Intent.ACTION_DOCK_EVENT); Intent dock = registerReceiver(null, dockIntentFilter); int dockState = dock.getIntExtra(Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_UNDOCKED); boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;
经过使用Package Manager, 你能够启用或者禁用接受者,经过方法setComponentEnabledSetting(还包括activity,service)。
这样的话,当你须要监听的时候,就能够禁用这个广播。(爽吧)
下面给出代码片断:
ComponentName myReceiverName = new ComponentName(this, MyReceiver.class); PackageManager pm = getPackageManager(); // Enable a manifest receiver pm.setComponentEnabledSetting(myReceiverName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); // Disable a manifest receiver pm.setComponentEnabledSetting(myReceiverName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);