应用程序数据清除后如何停止作业?

时间:2018-01-17 15:38:20

标签: java android

我正在为我的公司开发一个Android应用程序(只是我公司的人正在使用它)。

登录后,用户按签入按钮,此按钮启动跟踪作业。此作业每小时将位置发送到我们的服务器,并且只有当他们离开该地点(按结帐按钮)或达到出发时间时才会停止。

问题是,此作业使用的是用户首次登录时下载的数据,以及是否清除了应用数据(设置 - &gt;应用 - >我的应用名称 - &gt;清除数据< / em>),我的Job不会停止,下次触发时,应用程序将崩溃(因为它没有找到登录后下载的数据)。我正在处理此问题的方法是使用共享首选项变量“跟踪”,这样,如果清除了应用数据,则跟踪默认值将为false,作业将停止。有没有更好的方法来处理这个?我可以知道我的应用数据是否已被清除?

我正在安排我的工作(Utilities.java):

public static void scheduleTrackingJob(Context context, PersistableBundle extraData){
    ComponentName serviceComponent = new ComponentName(context, TrackingJob.class);
    JobScheduler jobScheduler = (JobScheduler) context.getSystemService(
            Context.JOB_SCHEDULER_SERVICE
    );

    assert jobScheduler != null;

    jobScheduler.cancel(TrackingJob.JOB_ID);
    jobScheduler.schedule(
            new JobInfo.Builder(TrackingJob.JOB_ID, serviceComponent)
                    .setPeriodic(TimeUnit.HOURS.toMillis(1))
                    .setExtras(extraData)
                    .setPersisted(false)
                    .build()
    );

    // Sets PREF_TRACKING (String "Tracking") = true on SharedPreferences
    setBoolean(context, PREF_TRACKING, true);
}

public static void stopTrackingJob(Context context, int jobID){
    JobScheduler jobScheduler = (JobScheduler) context.getSystemService(
            Context.JOB_SCHEDULER_SERVICE
    );

    assert jobScheduler != null;

    jobScheduler.cancel(jobID);
    setBoolean(context, PREF_TRACKING, false);
}

这里我启动locationServices,或者如果跟踪是假的,我会停止工作(TrackingJob.java)

// ... some code ...
@Override
public boolean onStartJob(JobParameters jobParameters) {
    // if Tracking is true, start location services
    if (Utilities.getBoolean(getApplicationContext(), Utilities.PREF_TRACKING)) {
        createLocationCallback(jobParameters);
        createLocationRequest();
        buildLocationSettingsRequest();
        startLocationServices(jobParameters);
        return true; // async call
    } else {
        Utilities.stopTrackingJob(getApplicationContext(), JOB_ID);
        return false;
    }
}
// ... more code ...

1 个答案:

答案 0 :(得分:0)

我认为您应该使用数据库来满足此类要求,因为当您清除应用程序数据时,它将清除所有数据库,或者您可以根据需要进行管理。

共享偏好是一种更好的方式,但我相信数据库(Sqlite)或其他将是一个更好的方法。你对此有何看法?