0

我已经为此苦苦挣扎了几天。我想要做的是定期运行服务,大约相隔 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);
}
4

1 回答 1

2

发生的事情是,AlarmManager 按其应有的方式工作,它触发接收者获取并定期执行 onReceive 的 Intent,正如它应该的那样。但是,它仅在第一次执行该服务。第一次之后,警报仍然响起,但服务没有执行。

您在安排闹钟时打了startService()一次电话。你根本没有. 然而,您正在通过. 因此,当警报响起时,不会向服务发送命令,因为您没有向它发送命令。startService() BroadcastReceiverBroadcastReceiver

我从有类似问题的人那里阅读了一些主题,其中一个提到 PendingIntent 仅持续一次发送。

仅当您使用FLAG_ONE_SHOT.

有人知道什么可以帮助我吗?

startService()从您的方法调用onReceive(),而不是从您的方法调用setAlarm()。此外,添加所有WakeLock管理逻辑,因为您正在使用_WAKEUP警报并且您无法使用 my WakefulIntentService.

于 2013-03-03T12:47:49.640 回答