Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓报警管理器。重复报警不会触发,一段时间后,会立即触发所有报警_Android_Android Intent_Alarmmanager_Repeatingalarm - Fatal编程技术网

Android 安卓报警管理器。重复报警不会触发,一段时间后,会立即触发所有报警

Android 安卓报警管理器。重复报警不会触发,一段时间后,会立即触发所有报警,android,android-intent,alarmmanager,repeatingalarm,Android,Android Intent,Alarmmanager,Repeatingalarm,这是我见过的最奇怪的案例之一 我有一个应用程序,每5分钟执行一次任务。我使用以下代码设置重复报警: public static final int INTERVAL_SECONDS = 300; public void SetAlarm(Context context) { AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent i = new Intent(co

这是我见过的最奇怪的案例之一

我有一个应用程序,每5分钟执行一次任务。我使用以下代码设置重复报警:

public static final int INTERVAL_SECONDS = 300;

public void SetAlarm(Context context)
{
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, Alarm.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * INTERVAL_SECONDS, pi); // Millisec * Second * Minute
}
因此,我预计每五分钟将运行以下代码:

 @Override
 public void onReceive(Context context, Intent intent) 
 {   
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
    wl.acquire();

    Intent pper = new Intent(context, PushPullService.class);
    context.startService(pper);
    Log.d("AlarmReceiver", "Called context.startService from AlarmReceiver.onReceive");

    wl.release();
 }
我的应用在清单中具有以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

您需要为此处的每个报警设置唯一的id

首先,检查你的舱单,看起来是这样的

<receiver android:name="com.example.Somename.Alarm" >
    <intent-filter>
        <data android:scheme="timer:" />
    </intent-filter>
</receiver>
根据时间戳或其他什么生成唯一ID

编辑

当您使用

am.setRepeating()

这实际上是对操作系统的一种挂起,您在当前时间的基础上增加了300秒,然后恰好在五分钟后,您的接听电话和收到通知…

为什么这很重要?唯一id给了我什么。你认为我每五分钟就收到一次广播,但我的意图没有被激发吗?如果是这样的话,那么到底会发生什么(谁稍后会触发意图)?使用唯一id,您可以设置不同的警报,不会相互覆盖。Android会重用挂起的意图,重写它们携带的有效负载。Irfan是对的,在创建意图时必须使用唯一ID,以防止覆盖。我过去也遇到过这个问题。评论:我应该把这些行放在哪里?在设置报警中还是在接收中?因为您提到了PendingEvent,所以我将它们放在SetAlarm方法中,但它不起作用。有关新的细节,请参阅问题的版本。我想,你可以从这个想法中理解,无论如何,我将更新我的答案!我想问题是广播接收器你们能发布广播接收器类和清单文件吗?你们能解决你们的问题吗?我有一个类似的问题,找不到解决办法
Intent i = new Intent(context, Alarm.class);
i.setData(Uri.parse("timer:" + uniqueId));
PendingIntent pi = PendingIntent.getBroadcast(context, uniqueId, i, Intent.FLAG_GRANT_READ_URI_PERMISSION);
am.setRepeating()