私はいくつかのことをするために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();
}
}