Android Jobservice正在被销毁

Android Jobservice正在被销毁,android,job-scheduling,Android,Job Scheduling,我办了一个就业服务来做一些事情。出于测试目的,我让它每30秒运行一次。为了找到问题,我将服务缩减为不做任何事(!)。 我知道,一项工作可以被系统停止;如果onStopJob方法返回true,它将重新启动。这种情况会发生,而且效果很好,不过我想知道,这种情况发生的频率和时间(在半夜,当手机刚刚放在桌子上时!)。 为了检查所有这些,我使用SharedReferences,跟踪停止和重新启动。 然而,我发现,这项工作不仅停止了,有时甚至完全被破坏了。 然后,我在OnDestroy方法中设置了一个重启例

我办了一个就业服务来做一些事情。出于测试目的,我让它每30秒运行一次。为了找到问题,我将服务缩减为不做任何事(!)。 我知道,一项工作可以被系统停止;如果onStopJob方法返回true,它将重新启动。这种情况会发生,而且效果很好,不过我想知道,这种情况发生的频率和时间(在半夜,当手机刚刚放在桌子上时!)。
为了检查所有这些,我使用SharedReferences,跟踪停止和重新启动。
然而,我发现,这项工作不仅停止了,有时甚至完全被破坏了。 然后,我在OnDestroy方法中设置了一个重启例程。这是行不通的。作业正在重新启动,但立即又被销毁。 所以我有一些问题:
为什么它首先被摧毁了?
为什么不能重新启动它?
我能做些什么使它更稳定?
在Android 5.0.1下的Galaxy S4和6.0下的XPeria Z2上试用
根据MinSDK 5.0和TargetSDK 6.0编译。
以下是我的JobSchedulerService的代码:

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) {
}
}
以下是我的主要活动(简称):

@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myCnt=这个;
initGoogleAppClient();
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
viewPager=(viewPager)findViewById(R.id.viewPager);
设置viewPager(viewPager);
tabLayout=(tabLayout)findViewById(R.id.tabs);
if(tabLayout!=null)
tabLayout.setupWithViewPager(viewPager);
mJobScheduler=(JobScheduler)getSystemService(Context.JOB\u SCHEDULER\u SERVICE);
//.......
public void startJob(){
SharedPreferences=PreferenceManager.getDefaultSharedPreferences(此);
SharedReferences.Editor=prefs.edit();
putString(“启动”,“自动更新由用户启动!”);
编辑器.putBoolean(“stoppedByUser”,false);
editor.apply();
JobSchedulerService jss=new JobSchedulerService();//用于“首次运行”作业,因此用户没有等待时间
jss.doJob(myCnt);
JobInfo.Builder=新的JobInfo.Builder(1,
新组件名(getPackageName(),JobSchedulerService.class.getName());
建筑商定期(30*1000);
builder.setPersisted(true);

如果(mJobScheduler.schedule(builder.build())经过长期研究,我发现以下问题: 在我的

我有一个异步任务。但是,根据谷歌的说法,这只在UI线程中工作(请参阅:)。
在我的JobSchedulerService中包含此内容会导致它在一段时间后被销毁。
我现在使用一个(常规的)单独的线程在服务中“做一些事情”,它可以工作

    @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();
    }
}
// do something here