service的簡單使用--後臺執行的定時任務
阿新 • • 發佈:2019-01-25
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);
}
}