我已经为此苦苦挣扎了几天。我想要做的是定期运行服务,大约相隔 2-3 分钟。我有一个负责界面和设置第一个警报的活动。
警报由 BroadcastReceiver 配置,如下所示:
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String message = "Alarm worked";
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
setAlarm(context);
}
public void setAlarm(Context context){
AlarmManager am = (AlarmManager) context.
getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, Receiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context,
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Intent dailyUpdater = new Intent(context, DiscoveryService.class);
context.startService(dailyUpdater);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
+ (1000 * 30) , pi);
}
}
我已经尝试将 setRepeating 用于 AlarmManager,但它仍然具有相同的效果。发生的事情是,AlarmManager 按它应该的方式工作,它会触发接收者获取的 Intent,并定期执行 onReceive,这是它应该的。但是,它仅在第一次执行该服务。第一次之后,警报仍然响起,但服务没有执行。
我从有类似问题的人那里阅读了一些主题,其中一个提到 PendingIntent 仅持续一次发送。因此,我选择不每次都设置警报,这样我就可以设置pendingIntent 标志以进行每次更新。
我尝试使我的服务成为一个 intentService,这很好,但是我的服务内部的蓝牙扫描仪不起作用,因为 intentService 线程在没有等待我的蓝牙发现完成的情况下终止。
有人知道什么可以帮助我吗?
这是我的服务的一部分:
public class DiscoveryService extends Service {
public void onCreate() {
super.onCreate();
Toast.makeText(this, "MyAlarmService.onCreate()",
Toast.LENGTH_LONG).show();
findEverything();
}
}
编辑:这是我目前拥有的代码。
public void onReceive(Context context, Intent intent) {
String message = "Alarm worked";
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
Intent dailyUpdater = new Intent(context, DiscoveryService.class);
context.startService(dailyUpdater);
}
public void setAlarm(Context context){
// get a Calendar object with current time
AlarmManager am=(AlarmManager)context.
getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, Receiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
(1000 * 30) , pi);
}