要保持记录periodicScanJobId和immediateScanJobId,你可以使用Android Beacon Library提供的JobScheduler来调度扫描任务,然后使用SharedPreferences来保存这两个id。
首先,确保你已经在项目中添加了Android Beacon Library的依赖。在build.gradle文件中添加以下代码:
implementation 'org.altbeacon:android-beacon-library:2+'
然后,创建一个名为BeaconUtil的辅助类来处理扫描任务和保存id。在BeaconUtil类中,你可以使用以下代码示例:
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import org.altbeacon.beacon.BeaconManager;
public class BeaconUtil {
private static final String PREF_PERIODIC_SCAN_JOB_ID = "periodic_scan_job_id";
private static final String PREF_IMMEDIATE_SCAN_JOB_ID = "immediate_scan_job_id";
public static void startPeriodicScanJob(Context context, int scanPeriodMillis) {
BeaconManager beaconManager = BeaconManager.getInstanceForApplication(context);
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
ComponentName jobService = new ComponentName(context, BeaconScanJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(getNextPeriodicScanJobId(context), jobService);
builder.setPeriodic(scanPeriodMillis);
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
builder.setPersisted(true);
jobScheduler.schedule(builder.build());
}
public static void startImmediateScanJob(Context context) {
BeaconManager beaconManager = BeaconManager.getInstanceForApplication(context);
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
ComponentName jobService = new ComponentName(context, BeaconScanJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(getNextImmediateScanJobId(context), jobService);
builder.setMinimumLatency(0);
builder.setOverrideDeadline(0);
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
builder.setPersisted(true);
jobScheduler.schedule(builder.build());
}
private static int getNextPeriodicScanJobId(Context context) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
int jobId = preferences.getInt(PREF_PERIODIC_SCAN_JOB_ID, 0);
preferences.edit().putInt(PREF_PERIODIC_SCAN_JOB_ID, jobId + 1).apply();
return jobId;
}
private static int getNextImmediateScanJobId(Context context) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
int jobId = preferences.getInt(PREF_IMMEDIATE_SCAN_JOB_ID, 0);
preferences.edit().putInt(PREF_IMMEDIATE_SCAN_JOB_ID, jobId + 1).apply();
return jobId;
}
}
在上面的代码中,我们创建了一个BeaconUtil类,并提供了两个方法来启动定期扫描任务(startPeriodicScanJob)和立即扫描任务(startImmediateScanJob)。这些方法使用JobScheduler来调度扫描任务,并使用getNextPeriodicScanJobId和getNextImmediateScanJobId方法来获取下一个可用的job id。
请确保在Manifest文件中声明BeaconScanJobService:
最后,在你的代码中,你可以使用以下代码来启动扫描任务:
BeaconUtil.startPeriodicScanJob(getApplicationContext(), 10000); // 10秒扫描一次
BeaconUtil.startImmediateScanJob(getApplicationContext());
这样,你就可以同时记录和使用periodicScanJobId和immediateScanJobId了。