AlarmManager与PendingIntent的使用

4
下面是代码片段:

以下是代码片段...

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ///////////Do something////////////////////////
    showtext.startScan();
    //SEt Alarm
    Intent intent = new Intent(this, TextReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+9000, pi);}

我的接收者:
TextReceiver extends BroadcastReceiver{

    public void onReceive(Context context, Intent intent) {
        ///Show text/////
    }
}

事实是,当我在9秒后运行程序时,出现了一个错误:“应用程序意外停止”。为什么会出现这个错误?
我的目标是每9秒显示文本。在主活动中,AlarmManager的正确使用方法是什么?或者我应该在BroadcastReceiver中设置闹钟?就我的目标而言,am.setRepeatingam.set哪个更合理?
编辑:我如何更改我的闹钟代码以在广播接收器中运行?

哪一行代码导致了“强制关闭”?你需要分析你的logcat来找到原因 - 或者在应用程序崩溃时发布logcat。 - Reed
我认为这行代码是:am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+9000, pi); - Co Koder
我没有看到那行代码会导致强制关闭的任何理由。你能否也发布一下你的logcat日志? - Reed
无法实例化接收器com.co.koder.TextReceiver: java.lang.InstantiationException: com.co.koder.TextReceiver。 - Co Koder
2个回答

8

//试试这个

AlarmManager am=(AlarmManager)getApplicationContext getSystemService(Context.ALARM_SERVICE);

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,  intent, PendingIntent.FLAG_CANCEL_CURRENT);

  am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),(9 * 1000), pendingIntent);

2
PendingIntent.FLAG_CANCEL_CURRENT是我必须使用的标志来解决我的问题。谢谢。 - shkschneider

3
永远不要在设置闹钟的PendingIntents中使用FLAG_CANCEL_CURRENT。
这样做会导致您取消当前由闹钟管理器持有的PendingIntent的有效性,这意味着闹钟管理器无法再告诉任何新设置的闹钟与旧PendingIntent匹配。您最终将拥有旧(无效)闹钟以及新闹钟。如果您一直这样做,系统中可能会注册数百个(或更多!)过时的闹钟,它们实际上什么也不会做,但却占用了内存和CPU。

我不确定自己是否正确理解了这个问题 - 如果现有的 PendingIntent 被取消并创建了一个新的,为什么 AlarmManager 不会注销旧的 PendingIntent? - dev
1
闹钟管理器不知道它持有的PendingIntent已经失效。特别是,当您取消PendingIntent时,会发生一件事情,即.equals()比较将返回false,这会破坏Alarm Manager的“搜索现有警报集以找到我们要替换的警报”的操作,当您使用新的PendingIntent设置警报时,就会出现这种情况。在闹钟时间到达时,被取消的警报是无效的,但在那之前它占用了RAM,而且当它轮到(不)分派时,也浪费了电池。 - ctate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接