利用Service實現——定時任務


功能:實現通過按鈕開啟服務,在服務中延遲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>

輸出效果如圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM