【问题标题】:Issues alarm manager in every 1 min Android?每 1 分钟 Android 发出警报管理器?
【发布时间】:2012-01-25 07:23:01
【问题描述】:

我想每隔 1 分钟提供一次火灾警报管理器的服务..但是 我的闹钟运行一次(仅限第一次)。 我关注Lalit Answer

private class Receiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {

            Toast.makeText(getBaseContext(), "Alarm", Toast.LENGTH_LONG).show();
            NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 
            AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
            Intent i=new Intent(context, ConnectionReceiver.class);
            PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
            mgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1*60*1000, pi);
        }
}

【问题讨论】:

  • 想和你讨论,请回聊天室
  • 你试过Commonsware Example试试这个。
  • 是的,我尝试安装 screen.apk ... [2012-01-25 13:03:30 - screen] 成功! [2012-01-25 13:03:30 - screen] \screen\bin\screen.apk 安装在设备上 [2012-01-25 13:03:30 - screen] 完成!

标签: android alarm


【解决方案1】:

在您的广播接收器的 onReceive 方法中尝试此代码

AlarmManager mgr=(AlarmManager)ctxt.getSystemService(Context.ALARM_SERVICE);
mgr.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                              60000+System.currentTimeMillis(),
                                  getPendingIntent(ctxt));

你可以得到待处理的意图

private static PendingIntent getPendingIntent(Context ctxt) {
    Intent i=new Intent(ctxt, AReceiver.class);
    return(PendingIntent.getBroadcast(ctxt, 0, i, 0));
}

AReceiver 类用于启动服务,如通知 它在我的应用程序中运行良好,所以我希望它可以帮助你

【讨论】:

【解决方案2】:

【讨论】:

  • 又是第一次来
  • 系统每分钟触发一次此操作。只需在清单中为其注册广播接收器。完全不需要设置报警管理器
  • 来自 android doc:“您不能通过清单中声明的​​组件接收此信息,只能通过 Context.registerReceiver() 显式注册它。”
【解决方案3】:

我知道这个问题已经有了答案,但是对于遇到相同问题但需要使用AlarmManager 的其他人。它只运行一次的原因是因为您创建的新PendingIntent 不会重新创建,而是重用它之前的PendingIntent。所以换句话说,你的闹钟之所以只运行一次,是因为它一直在重复使用它。如果有任何应该做的伎俩,使用标志来刷新意图额外,但这也不起作用。

确保它不会重复使用您提供的PendingIntent 和最终Intent 的技巧是使用setAction() 并为其提供一些独特的“操作”。我是这样做的:

intent.setAction("com.yourname."+System.currentTimeMillis());

如您所见,这确保了它的独特性。虽然,以上接受的答案是最好的方法,但如果有人不希望这样做,他们需要了解为什么以及如何解决这个问题。希望它可以帮助其他人。

【讨论】: