1.Intent.ACTION_TIME_TICK 含義:系統每分鐘會發出該廣播
Intent.ACTION_TIME_CHANGED); // 時間改變,例如手動修改設置裏的時間
Intent.ACTION_TIMEZONE_CHANGED); // 時區變化,例如手動修改設置裏的時區
2.用法:
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_TICK);
filter.addAction(Intent.ACTION_TIME_CHANGED);
registerReceiver(broadcastReceiver, filter);
//廣播的註冊,其中Intent.ACTION_TIME_CHANGED代表時間設置變化的時候會發出該廣播
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.ACTION_TIME_TICK.equals(intent.getAction())){
updateTime();//每一分鐘更新時間
}else if(intent.ACTION_TIME_CHANGED.equals(intent.getAction())){
}
}
};
public String updateTime() {
final Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
boolean is24hFormart = true;
if (!is24hFormart && hour >= 12) {
hour = hour - 12;
}
String time = "";
if (hour >= 10) {
time += Integer.toString(hour);
}
else {
time += "0" + Integer.toString(hour);
}
time += ":";
if (minute >= 10) {
time += Integer.toString(minute);
}
else {
time += "0" + Integer.toString(minute);
}
return time;
}
3.注意:ACTION_TIME_TICK不能用於靜態註冊,原因爲:
1.提高系統效率:這兩個事件是android的基本事件,如果大多數程序監聽,會大大的拖慢整個系統,所以android不鼓勵我們在後臺監聽這兩個事件。
2.因爲有序廣播的優先級問題。以上這些廣播中,靜態註冊時,系統的優先級大於應用,並且系統阻止了廣播的向下傳播。又因在Android 的廣播機制中,動態註冊的優先級是要高於靜態註冊優先級的。故用動態註冊代替靜態註冊。
3.系統安全問題。
4.不能靜態註冊的廣播還有以下幾個:
android.intent.action.SCREEN_ON
android.intent.action.SCREEN_OFF
android.intent.action.BATTERY_CHANGED
android.intent.action.CONFIGURATION_CHANGED
5.解決方式(以android.intent.action.SCREEN_ON爲例):
動 態註冊不能放到activity中,因爲動態註冊必須要在activity消亡的時候調用unregisterReceiver,會隨着activity 的解鎖消失而不能再接收廣播。一般的辦法是在activity起來後馬上start一個service,這個service裏動態註冊一 個broadcastreceiver,broadcastreceiver裏接收到SCREEN_ON消息後啓動鎖屏activitty 爲了保證 broadcastreceiver任何時候都可以接收到SCREEN_ON,service必須常駐在系統內,所以要接收開機消息 android.intent.action.BOOT_COMPLETED。