Android中定時器AlarmManager的用法
阿新 • • 發佈:2021-02-04
技術標籤: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依舊可以執行程式碼的目的。