我正在为我的公司开发一个Android应用程序(只是我公司的人在使用它)。
登录后,用户按下签入按钮,此按钮将启动跟踪作业。此作业每小时向我们的服务器发送位置,只有当他们离开该位置(按下结帐按钮)或到达出发时间时才停止。
问题是,这项工作使用的数据是用户第一次登录时下载的,如果他们清除应用程序数据(设置-> app -> my App name -> clear ),我的工作不会停止,下一次触发它时,应用程序会崩溃(因为它没有找到登录后下载的数据)。我处理这个问题的方式是使用共享首选项变量“跟踪”,这样,如果清除了应用程序数据,跟踪默认值将是假的,作业将停止。有更好的方法来处理这件事吗?我能知道我的应用程序的数据是否被清除了吗?
我把我的工作安排成这样(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 ...发布于 2018-01-17 15:55:51
我认为您应该使用数据库来满足这类需求,因为当您清除app的数据时,它将清除所有的数据库,或者您可以根据您的需要进行管理。
共享偏好是一种更好的方法,但我相信数据库(Sqlite),否则将是一个更好的方法。你对这件事怎么说?
https://stackoverflow.com/questions/48304790
复制相似问题