2016-07-18 6 views
1

私はいくつかのことをするためにJobserviceを設置しました。テスト目的のために私は30秒ごとにそれを実行させます。問題を見つけるために、私は何もしないようにサービスを減らしました(!)。 私は、仕事がシステムによって止められることを知っています。 onStopJobメソッドがtrueを返すと、それは再開されます。これは起こり、うまくいっていますが、私は不思議に思っていますが、電話をテーブルに置いている間に、どのくらいの頻度で(夜中に)!
これらをすべて確認するには、SharedPreferencesを使用して、停止と再起動を追跡します。
しかし、仕事は止まっているだけでなく、時には完全に破壊されていることがわかりました。 その後、OnDestroyメソッドで再起動ルーチンを作成します。これは動作しません。ジョブは再開されていますが、すぐに再度破棄されます。 質問があります:
なぜ最初に破壊されたのですか?
なぜそれを再起動できないのですか?
さらに安定させるにはどうすればよいですか?
Android 5.0.1およびXPeria Z2の下でギャラクシーS4を試しました。
MinSDK 5.0、TargetSDK 6.0に対してコンパイルされています。ここで
は私JobSchedulerServiceのコードです:Androidサービスが破壊されています

public class JobSchedulerService extends JobService implements 
    DataApi.DataListener, 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener 
{ 

private boolean stoppedByUser = false; 
public DateFormat formatter; 
String stoptimeText; 
public GregorianCalendar apptTime; 
public Context myCnt; 

@Override 
public boolean onStartJob(JobParameters params){ 
     doJob(this); 
     jobFinished(params, false); 
    return true; 
} 

public void doJob(Context context){ 
    myCnt = context; 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(myCnt); 
    SharedPreferences.Editor editor = prefs.edit(); 
    stoptimeText = prefs.getString("stopped","not yet stopped"); 
    editor.putString("started", "Job was running at " + timeNow()); 
    editor.apply(); 
    // do something here 
} 

@Override 
public boolean onStopJob(JobParameters params){ 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    stoppedByUser = prefs.getBoolean("stoppedByUser", false); 
    SharedPreferences.Editor editor = prefs.edit(); 
    stoptimeText += "Job stopped autom. at " + timeNow(); 
    editor.putString("stopped", stoptimeText); 
    editor.apply(); 
    if (stoppedByUser){ 
     stoppedByUser = false; 
     editor.putBoolean("stoppedByUser", false); 
     stoptimeText += "OnStopJob called by user-stop at " + timeNow(); 
     editor.putString("stopped", stoptimeText); 
     editor.apply(); 
     return false; 
    } 
    else return true; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    stoppedByUser = prefs.getBoolean("stoppedByUser", false); 
    SharedPreferences.Editor editor = prefs.edit(); 
    stoptimeText += "Job was destroyed at "+ timeNow(); 
    editor.putString("stopped", stoptimeText); 
    editor.apply(); 
    if (!stoppedByUser){ 
     JobInfo.Builder builder = new JobInfo.Builder(1, 
       new ComponentName(getPackageName(), JobSchedulerService.class.getName())); 
     builder.setPeriodic(30 * 1000); 
     builder.setPersisted(true); 
     stoptimeText += "Job rest. after dstr. at " + timeNow(); 
     editor.putString("stopped", stoptimeText); 
     editor.putString("started", "Auto update started after destroy! Check if really running!"); 
     editor.apply(); 
    } 
    else { 
     stoptimeText += "OnDestroy called by user-stop at " + timeNow(); 
     editor.putString("stopped", stoptimeText); 
     editor.apply(); 
    } 
} 

public String timeNow(){ 
    apptTime = (GregorianCalendar) GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC")); 
    formatter = new SimpleDateFormat("EEE, dd./HH:mm", Locale.ENGLISH); 
    formatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
    return formatter.format(apptTime.getTimeInMillis()); 
} 

@Override 
public void onDataChanged(DataEventBuffer dataEvents) { 
} 

@Override 
public void onConnected(Bundle connectionHint) { 
} 

@Override 
public void onConnectionFailed(ConnectionResult arg0) { 
} 

@Override 
public void onConnectionSuspended(int arg0) { 
} 
} 

そして、ここでは私のMainActivityです(短縮):

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    myCnt = this; 

    initGoogleApiClient(); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    if (tabLayout != null) 
     tabLayout.setupWithViewPager(viewPager); 

    mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); 

//....... 

public void startJob(){ 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    SharedPreferences.Editor editor = prefs.edit(); 
    editor.putString("started", "auto updates started by user!"); 
    editor.putBoolean("stoppedByUser", false); 
    editor.apply(); 

    JobSchedulerService jss = new JobSchedulerService(); // used to "first run" the job, so there is no waiting time for the user 
    jss.doJob(myCnt); 

    JobInfo.Builder builder = new JobInfo.Builder(1, 
      new ComponentName(getPackageName(), JobSchedulerService.class.getName())); 
    builder.setPeriodic(30 * 1000); 
    builder.setPersisted(true); 

    if (mJobScheduler.schedule(builder.build()) <= 0) { 
     Toast.makeText(MainActivity.this, "Failure starting Jobservice!", Toast.LENGTH_LONG).show(); 
    } 
} 

答えて

1

長い研究の後、私は次のことが問題であることが判明:私の

私は非同期タスクを持っていました。しかし、Googleによると、これはUIスレッドでのみ機能しています(https://developer.android.com/reference/android/os/AsyncTask.html参照)。
これを私のJobSchedulerServiceで実行すると、しばらくしてから破棄されました。
私は現在、サービスで「何か」するために(通常の)別のスレッドを使用しています。

関連する問題