私の質問は、常に実行中のバックグラウンドサービスを作成する方法です。アプリが実行されている限り、バックグラウンドで実行されるIntentServiceを作成しました。ただし、アプリが強制終了されると、サービスも失われます。作成したいのは、常に実行して通知を送信するバックグラウンドサービスを作成することです。 (whatsapp、facebook、またはその他の同様のアプリケーションに似ています。)
通知をクリックすると、アプリケーションも起動するはずです。
どうすればできますか?
これを行うのに最適なのは、インテントサービスではなくサービスを拡張するカスタムサービスを作成することです。サービスで別のスレッドを開始します。アプリの起動でサービスを開始するさらに重要なのは、オブジェクトにバインドしないことです。オブジェクトが破棄されると、サービスが強制終了されます。次に、onStartCommand()メソッドがSTART_STICKYを返します。サンプルの実装を示します。
public class CustomService extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
return START_STICKY;
}
@Override
public void onTaskRemoved(Intent rootIntent) {
// TODO Auto-generated method stub
Intent restartService = new Intent(getApplicationContext(),
this.getClass());
restartService.setPackage(getPackageName());
PendingIntent restartServicePI = PendingIntent.getService(
getApplicationContext(), 1, restartService,
PendingIntent.FLAG_ONE_SHOT);
//Restart the service once it has been killed Android
AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +100, restartServicePI);
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
//start a separate thread and start listening to your network object
}
}
onTaskRemovedは、サービスが強制終了されると100ミリ秒後にサービスを再起動します。 START_STICKYはKitKatでは機能しません。 onTAskRemovedを実装する必要があります。そして、ユーザーがアプリの設定にアクセスしてサービスを停止した場合、もう1つ、サービスを再起動する方法はありません。
Startコマンドを使用してサービスを開始する必要があります。また、サービスのonStartCommmand関数を書き換える必要があります。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("LocalService", "Received start id " + startId + ": " + intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
START_STIKY
は、サービスが自動的に再開されることを意味します( http://developer.Android.com/reference/Android/app/Service.html#START_STICKY )
StartCommandの代わりにbindService関数を使用すると、サービスが停止し、バインドされたすべてのアクティビティが停止します。
それ以上に、デバイスの起動後にサービスを自動起動する場合は、ACTION_BOOT_COMPLETED
インテントを受信するためにBroadcastReceiver
を実装し、サービス開始のためにこのイベントを処理する必要があります。
次のことは、あなたの活動が周りにある限り実行されます。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
残念ながら、アプリが強制終了され、デバイスのリソースが不足すると、強制終了されます。
ただし、サービスを数日間実行し続けたい場合は、サービスをフォアグラウンドで実行していることを確認してください。