2017-08-22 13 views
0

私はクラッシュセーフでなければならないアプリをやっています。何かが間違ってクラッシュしたとしても、それが再び始まるべきであるという意味。これを実装するJobServiceによって開始されたIntentSeviceはすぐに破棄されます。どうすればこれを防ぐことができますか?

I次の操作を行います。私は作業スレッドを開始し、仕事をしてサービスMyIntentServiceを働いてきた

また、作業スレッドが有効かどうかを確認するJobServiceをスケジュールします。そうでない場合 - JobServiceIntentを現用サービスに送信します。スレッドがクラッシュし、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()"); 
    } 
} 

答えて

1

のonCreate()ワーキングサービスのと呼ばれ、onDestroyよりも()はすぐに呼ばれています。

いつもそうです。これは、IntentServiceを拡張することを選択したためです。 IntentServiceは、onHandleIntent()が作業を完了するのに十分な長さです。その後、保留中の作業がもうなければ、IntentServicestopSelf()にコールされ、サービスは破棄されます。

再起動後に稼働中のサービスが動作するように状況を変更するにはどうすればよいですか?

onStartCommand()onHandleIntent()からあなたのコードを移動し、Service代わりのIntentServiceを拡張します。

関連する問題