Android 開發 AlarmManager 定時器
阿新 • • 發佈:2018-12-09
介紹
AlarmManager是Android中常用的一種系統級別的提示服務,在特定的時刻為我們廣播一個指定的Intent。簡單的說就是我們設定一個時間,然後在該時間到來時,AlarmManager為我們廣播一個我們設定的Intent,通常我們使用 PendingIntent,PendingIntent可以理解為Intent的封裝包,簡單的說就是在Intent上在加個指定的動作。在使用Intent的時候,我們還需要在執行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的話就是將這個動作包含在內了。
建立流程
- 建立Intent用來告訴定時器觸發後它要做什麼,Intent可以是啟動activity、啟動Service、傳送廣播。
- 建立時間值用來告訴定時器什麼時候觸發。
- 建立PendingIntent(等待Intent)用來包裹建立好的Intent。
- 取得AlarmManager系統服務,強制轉型並且例項化
- 用AlarmManager例項以set方法,新增型別、時間值、PendingIntent引數
簡單demo瞭解流程
關於更詳解的瞭解在後續說明,我們先簡單大概的瞭解一下使用流程。幫助理解後續更詳細的引數說明。
我們建立一個定時器啟動Activity的簡單demo:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_time); mBtnStart = (Button)findViewById(R.id.btn_start); mBtnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //正常的建立intent,TimeDemoActivity是我要啟動的活動 Intent intent = new Intent(TimeActivity.this,TimeDemoActivity.class); long time = System.currentTimeMillis()+5*1000;//得到當前時間並且增加5秒,表示我們在5秒後觸發定時器 //建立PendingIntent封裝了intent PendingIntent pi = PendingIntent.getActivity(TimeActivity.this,0,intent,0); AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);//得到系統AlarmManager服務 //設定了AlarmManager型別引數,時間值,PendingIntent manager.set(AlarmManager.RTC_WAKEUP,time,pi); } }); }
這樣就完成了,下面我們來看看效果:
廣播接收
必需靜態廣播
廣播接收器:
<receiver android:name=".ui.MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.xxx.xxx.MyReceiver"/> </intent-filter> </receiver>
建立定時器:
mFormat = new SimpleDateFormat("yyyy年MM月dd日 : HH時mm分ss秒");
long time1 = System.currentTimeMillis();
Log.e(TAG, "TIME1: "+time1);
Intent intent = new Intent(TimeActivity.this,MyReceiver.class);
intent.setAction("com.xxx.xxx.MyReceiver");
PendingIntent pt = PendingIntent.getBroadcast(TimeActivity.this,0,intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);
manager.set(AlarmManager.RTC_WAKEUP,time1+60*1000,pt);
Log.e(TAG, "定時器啟動 time="+mFormat.format(time1+60*1000));