1. 程式人生 > 其它 >Android中定時器AlarmManager的用法

Android中定時器AlarmManager的用法

技術標籤:Android Studio開發實戰 從零基礎到APP上線

AlarmManager是Android提供的全域性定時器,利用系統鬧鐘定時傳送廣播。可以實現定時執行程式碼的目的。只要我們APP在後臺執行,那麼我們就可以定時執行我們的程式碼。當然,由於高版本Android對於系統安全性的提高,我們可能無法做到喚起APP的目的,不過做一些定時執行的任務還是可以的。

我們具體實現的程式碼如下

public class MainActivity extends AppCompatActivity {

    private Button bt_nz;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_nz = findViewById(R.id.bt_nz);
        bt_nz.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 建立一個廣播事件的意圖
                Intent intent = new Intent(ALARM_EVENT);
                // 建立一個用於廣播的延遲意圖
                PendingIntent pIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent,
                        PendingIntent.FLAG_UPDATE_CURRENT);
                // 從系統服務中獲取鬧鐘管理器
                AlarmManager alarmMgr = (AlarmManager) getSystemService(ALARM_SERVICE);
                Calendar calendar = Calendar.getInstance();
                calendar.setTimeInMillis(System.currentTimeMillis());
                // 給當前時間加上若干秒
                calendar.add(Calendar.SECOND, 5);
                // 開始設定鬧鐘,延遲若干秒後,攜帶延遲意圖傳送鬧鐘廣播
                alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
            }
        });
    }

    // 宣告一個鬧鐘廣播事件的標識串
    private String ALARM_EVENT = "com.example.senior.AlarmActivity.AlarmReceiver";
    private static String mDesc = ""; // 鬧鐘時間到達的描述
    private static boolean isArrived = false; // 鬧鐘時間是否到達

    // 定義一個鬧鐘廣播的接收器
    public static class AlarmReceiver extends BroadcastReceiver {

        // 一旦接收到鬧鐘時間到達的廣播,馬上觸發接收器的onReceive方法
        public void onReceive(Context context, Intent intent) {
            if (intent != null) {
                if (!isArrived) {
                    isArrived = true;
                    //TODO 接收到鬧鐘到達廣播的動作
                    Intent intent1 = new Intent(context, MainActivity.class);
                    context.startActivity(intent1);
                }
            }
        }
    }

    // 適配Android9.0開始
    @Override
    public void onStart() {
        super.onStart();
        // 從Android9.0開始,系統不再支援靜態廣播,應用廣播只能通過動態註冊
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // 建立一個鬧鐘的廣播接收器
            alarmReceiver = new AlarmReceiver();
            // 建立一個意圖過濾器,只處理指定事件來源的廣播
            IntentFilter filter = new IntentFilter(ALARM_EVENT);
            // 註冊廣播接收器,註冊之後才能正常接收廣播
            registerReceiver(alarmReceiver, filter);
        }
    }

    @Override
    public void onStop() {
        super.onStop();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // 登出廣播接收器,登出之後就不再接收廣播
            unregisterReceiver(alarmReceiver);
        }
    }

    // 宣告一個鬧鐘的廣播接收器
    private AlarmReceiver alarmReceiver;
    // 適配Android9.0結束
}

清單檔案中配置

<receiver android:name=".MainActivity$AlarmReceiver" >
            <intent-filter>
                <action android:name="com.example.senior.ScheduleDetailActivity.AlarmReceiver" />
            </intent-filter>
</receiver>

這樣我們如果版本高於9.0,可以實現我們要的定時任務。如果版本低於9.0我們也可以實現我們想要的即使退出app依舊可以執行程式碼的目的。