功能:實現通過按鈕開啟服務,在服務中延遲10秒去開啟廣播,在廣播接收中又去開啟服務,實現循環
主要是通過AlarmManager實現延遲 (警告管理)
通過按鈕開啟服務:
/** * 實現定時功能 用於指定 AlarmManager的工作類型,有四種值可選 ELAPSED_REALTIME: 表示讓定時任務的觸發時間從系統開機開始算起,但不會喚醒 CPU。 ELAPSED_REALTIME_WAKEUP: 同樣表示讓定時任務的觸發時間從系統開機開始算起,但會喚醒 CPU。 RTC : 表示讓定時任務的觸發時間從 1970 年 1月 1 日 0 點開始算起,但不會喚醒 CPU RTC_WAKEUP: 表示讓定時任務的觸發時間從1970 年 1 月 1 日 0 點開始算起,但會喚醒 CPU。 使用 SystemClock.elapsedRealtime()方法可以獲取到系統開機至今所經歷時間的毫秒數,(所以與ELAPSED_REALTIME_WAKEUP模式一起使用) 使用 System.currentTimeMillis()方法可以獲取到 1970 年 1 月 1 日 0 點至今所經歷時間的毫秒數。(所以與RTC_WAKEUP模式一起使用) new Date().toString());//獲取當前時間(包括日期,詳細信息) */ public class MainActivity2_Text extends Activity { private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main2_layout); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity2_Text.this,AlarmService.class); startService(intent);//開啟服務 } }); } }
服務類:
public class AlarmService extends Service{ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { new Thread(new Runnable(){ @Override public void run() {//可以在該線程中做需要處理的事 System.out.println("當前時間:"+new Date().toString());//獲取日期時間 stopSelf();//關閉服務 } }).start(); AlarmManager manger=(AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent i=new Intent(this,AlarmReceiver.class);//廣播接收 //PendingIntent pendingIntent=PendingIntent.getActivity(MainActivity2_Text.this, 0, intent, 0);//意圖為開啟活動 PendingIntent pendingIntent=PendingIntent.getBroadcast(this, 0, i, 0);//意圖為開啟廣播 long triggerAtTime = SystemClock.elapsedRealtime();//開機至今的時間毫秒數 triggerAtTime=triggerAtTime+10*1000;//比開機至今的時間增長10秒 manger.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);//設置為開機至今的模式,時間,PendingIntent return super.onStartCommand(intent, flags, startId); } }
說明:以上在子線程中只是打印了一條當前時間,你也可以去執行你想要做的事
另外需要注意的是,從 Android 4.4 版本開始,Alarm 任務的觸發時間將會變得不准確,
有可能會延遲一段時間后任務才能得到執行。這並不是個 bug,而是系統在耗電性方面進行
的優化。系統會自動檢測目前有多少 Alarm 任務存在,然后將觸發時間將近的幾個任務放在
一起執行,這就可以大幅度地減少 CPU 被喚醒的次數,從而有效延長電池的使用時間。
當然,如果你要求 Alarm 任務的執行時間必須准備無誤,Android 仍然提供了解決方案。
使用 AlarmManager 的 setExact()方法來替代 set()方法,就可以保證任務准時執行了。
上面代碼中服務類開啟的廣播接收器:
public class AlarmReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { System.out.println("接收到意圖開啟的廣播,當前時間為:"+new Date().toString()); Intent i=new Intent(context,AlarmService.class); context.startService(i);//開啟AlarmService服務 } }
由於用到了廣播與服務,所以需要注冊,如下:
<service android:name="com.example.ts.service.AlarmService"></service>
<receiver android:name="com.example.ts.service.AlarmReceiver"></receiver>
輸出效果如圖:

