首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在应用程序的数据被清除后停止作业?

问如何在应用程序的数据被清除后停止作业?
EN

Stack Overflow用户
提问于 2018-01-17 15:38:20
回答 1查看 232关注 0票数 0

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

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

问题是,这项工作使用的数据是用户第一次登录时下载的,如果他们清除应用程序数据(设置-> app -> my App name -> clear ),我的工作不会停止,下一次触发它时,应用程序会崩溃(因为它没有找到登录后下载的数据)。我处理这个问题的方式是使用共享首选项变量“跟踪”,这样,如果清除了应用程序数据,跟踪默认值将是假的,作业将停止。有更好的方法来处理这件事吗?我能知道我的应用程序的数据是否被清除了吗?

我把我的工作安排成这样(Utilities.java):

代码语言:javascript
复制
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)

代码语言:javascript
复制
// ... 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 ...
EN

回答 1

Stack Overflow用户

发布于 2018-01-17 15:55:51

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

共享偏好是一种更好的方法,但我相信数据库(Sqlite),否则将是一个更好的方法。你对这件事怎么说?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48304790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档