安卓時間相關的廣播(Intent.ACTION_TIME_TICK)

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章