[Android] 開機後(Boot up)自動啟動Service


(How to start a service on boot)

某些情況我們需要在系統開機完成後啟動程式(通常是Service)執行特定任務,例如:下載/更新檔案、向後端查詢資訊…等。

Broadcast Receiver Component讓APP即使不是在執行的狀態下也能接收由系統或是其它APP所廣播的Intent訊息,要實現boot up完成自動執行Service就必須針對開機完成這項動作註冊一個Broadcast Receiver,讓它在接收Intent之後啟動目標Service即可。

以下將透過一個簡單的例子說明實作方法,讓系統開機後自動啟動一個Service發送歡迎通知給使用者。

程式碼說明

1. 建立Broadcast Receiver以及設定其Intent-filter針對android.intent.action.BOOT_COMPLETED動作進行註冊,並記得在use-permission tag加入android.permission.RECEIVE_BOOT_COMPLETED,使其可以接收System broadcast intent。
package com.bootupServiceDemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootUpReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context c, Intent intent) {

if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
  Intent sIntent = new Intent(c,BootUpService.class);
  c.startService(sIntent);
}

}

}
2. 建立發送歡迎訊息的Service,在其onCreate方法發送一個歡迎訊息至Status Bar。
package com.bootupServiceDemo;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;

public class BootUpService extends Service {
 
@Override
public void onCreate(){
 Notification msg=new Notification(R.drawable.icon,"Welcome",System.currentTimeMillis());
 
 Intent nIntent=new Intent(this,DemoActivity.class);
 
 PendingIntent pIntent=PendingIntent.getActivity(this,0,nIntent,0);
 
 msg.setLatestEventInfo(this,"Title","content",pIntent);
  
 NotificationManager manager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
 
 manager.notify(1,msg);
}
 
@Override
public IBinder onBind(Intent arg0) {
 return null;
}

}
3. 安裝至Device,重新開機後將會看到上方自動發送一個歡迎通知,boot up completely自動啟動的Service就大功告成了。


留言

這個網誌中的熱門文章

【海外婚紗】道具行李篇

[Android] layout_weight的妙用-讓View的大小以百分比率顯示(proportionate size)