好比時區的改變,數據鏈接狀態,短信的接收,來電,底座模式,電池狀態等等。 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);