1. 程式人生 > >service的簡單使用--後臺執行的定時任務

service的簡單使用--後臺執行的定時任務

    service在安卓中能實現在後臺中持久化執行,一個service的典型使用方法,就是在程式第一次執行時啟動服務,服務啟動後傳送一條廣播,廣播接收器接到廣播後再次啟動服務,這樣就可以保證服務在後臺及時更新資料,持久化執行。

   我們寫一個簡單的例子:

在程式執行後,我們啟動服務。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startService(new Intent(this,MyService.class));
    }
}

在服務啟動後執行onStartCommond方法,因為服務是預設執行在主執行緒中的,所以我們啟動一個執行緒來執行耗時操作,在這裡服務啟動後我們列印現在的時間。Alarm類似於java中的timer類,是用來執行定時操作的,首先我們從系統服務中取得alarmmanager物件,manager物件有一個set方法,這個方法有三個引數,第一個引數是Alarm的種類,

我們選用的這個種類是指是從1970年1月1日開始計算時間,第二個引數是1970年1月1日到現在的毫秒數加上我們選擇的延時時間,這裡我選擇延時10000毫秒傳送一次廣播。

第三個引數是一個pendingintent,用來發送廣播。這樣我們在每次執行服務後的10000毫秒,就會發送一條廣播。

public class MyService extends Service {
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
         return  null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.i("MyService","time is"+ new Date().toString());
            }
        }).start();
        AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
        int sec = 10000;
        long time = 1000+ SystemClock.currentThreadTimeMillis();
        intent = new Intent(this,MyReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this,1,intent,0);
        manager.set(AlarmManager.RTC_WAKEUP,time,pendingIntent);
        return super.onStartCommand(intent, flags, startId);
    }
}

在接到服務發出的廣播後,我們又開啟服務,這樣就可以保證每10000毫秒,服務就重新執行一次。

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        intent = new Intent(context,MyService.class);
        context.startService(intent);
    }
}