私はクラッシュセーフでなければならないアプリをやっています。何かが間違ってクラッシュしたとしても、それが再び始まるべきであるという意味。これを実装するJobServiceによって開始されたIntentSeviceはすぐに破棄されます。どうすればこれを防ぐことができますか?
I次の操作を行います。私は作業スレッドを開始し、仕事をしてサービスMyIntentService
を働いてきた
。
また、作業スレッドが有効かどうかを確認するJobService
をスケジュールします。そうでない場合 - JobService
はIntent
を現用サービスに送信します。スレッドがクラッシュし、JobService
コールstartService()
を作業する場合、作業サービス のonCreate()
が呼び出され、onDestroy()
よりはすぐに呼び出されます。
すべては一つのことを除いて完璧に動作します。私がNotification
を作って、働いているサービスのためにstartForeground()
に電話しても。
再起動後に稼働中のサービスが動作するように状況を変更するにはどうすればよいですか?
は、ここに私のスケジューラです:
はpublic class CheckAliveJService extends JobService {
private static final String TAG = CheckAliveJService.class.getSimpleName();
private static final int JOB_SCHEDULE_ID = 1;
public CheckAliveJService() {
}
@Override
public boolean onStartJob(JobParameters jobParameters) {
Log.i(TAG, "onStartJob()");
startService(new Intent(this, TransactionService.class)
.setAction(TransactionService.ACTION_WAKEUP));
jobFinished(jobParameters, true);
return false;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
return false;
}
public static void scheduleService(Context context, long millisecPeriod){
Log.i(TAG, "scheduleService()");
if(millisecPeriod <= 0){
return;
}
JobInfo.Builder builder =
new JobInfo.Builder(JOB_SCHEDULE_ID,
new ComponentName(context, CheckAliveJService.class))
.setPeriodic(millisecPeriod)
.setPersisted(true);
JobScheduler tm = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
tm.schedule(builder.build());
}
public static void unscheduleService(Context context){
Log.i(TAG, "unscheduleService()");
JobScheduler tm = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
tm.cancel(JOB_SCHEDULE_ID);
}
}
ここでワーキングサービス
public class MyIntentService extends IntentService {
private static final String TAG = MyIntentService.class.getSimpleName();
@Override
protected void onHandleIntent(Intent intent) {
Intent notificationIntent = new Intent(this, MyIntentService.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle("setContentTitle")
.setContentText("let's dance")
.setSmallIcon(android.R.drawable.stat_sys_download)
.setContentIntent(pendingIntent)
.setTicker("setTicker");
startForeground(2208, builder.build());
if (System.currentTimeMillis() - mLastThreadCall >= WAKEUP_TIMEOUT) {
startWorkingThread();
}
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
}
@Override
public void onDestroy() {
Log.i(TAG, "onDestroy()");
}
}