在应用程序被杀死后,Altbeacon无法继续检测的问题是由于操作系统限制导致的。在这种情况下,可以使用以下解决方法来尽可能保持Altbeacon的检测功能:
public class BeaconService extends Service implements BeaconConsumer {
private BeaconManager beaconManager;
@Override
public void onCreate() {
super.onCreate();
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.bind(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
startForeground(1, createNotification()); // 创建前台服务通知
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
beaconManager.unbind(this);
}
@Override
public void onBeaconServiceConnect() {
beaconManager.addMonitorNotifier(new MonitorNotifier() {
@Override
public void didEnterRegion(Region region) {
Log.i(TAG, "didEnterRegion");
}
@Override
public void didExitRegion(Region region) {
Log.i(TAG, "didExitRegion");
}
@Override
public void didDetermineStateForRegion(int state, Region region) {
Log.i(TAG, "didDetermineStateForRegion");
}
});
try {
beaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null));
} catch (RemoteException e) {
e.printStackTrace();
}
}
private Notification createNotification() {
// 创建前台服务通知
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setContentTitle("Beacon Service")
.setContentText("Running")
.setSmallIcon(R.mipmap.ic_launcher);
return builder.build();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
public class BeaconJobService extends JobService implements BeaconConsumer {
private BeaconManager beaconManager;
@Override
public boolean onStartJob(JobParameters params) {
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.bind(this);
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
beaconManager.unbind(this);
return false;
}
@Override
public void onBeaconServiceConnect() {
// 在这里添加Altbeacon的检测逻辑
}
}
在AndroidManifest.xml中注册JobService:
使用JobScheduler来启动定期执行JobService:
private void scheduleBeaconJob() {
JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
ComponentName componentName = new ComponentName(this, BeaconJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(1, componentName);
builder.setPeriodic(PeriodicIntervalMillis); // 设置执行间隔时间
builder.setPersisted(true); // 设置设备重启后依然执行
jobScheduler.schedule(builder.build());
}
以上是两种解决办法,可以根据具体需求选择适合自己应用的方法。