【问题标题】:BroadcastReceiver repeats without changeBroadcastReceiver 重复而不改变
【发布时间】:2024-01-05 21:01:01
【问题描述】:

我从 Activity 调用 BroadcastReceiver

Intent alarmIntent = new Intent(MainActivity.this, AlarmRec.class);
            alarmIntent.putExtra("lol",0);
            pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, 0);
            AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            manager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5000, pendingIntent);

它的onReceive方法是这样的:

        int lol=intent.getExtras().getInt("lol");
    Toast.makeText(context, "I'm running "+lol, Toast.LENGTH_SHORT).show();
    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    lol++;
    Intent alarmIntent = new Intent(context, AlarmRec.class);
    alarmIntent.putExtra("lol",lol);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
    manager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5000, pendingIntent);

基本上,每次调用 Receiver 时,它都应该显示一个 Toast It's Running 加上一个递增的值(1、2、3 等)。但是,它总是显示 It's Running 0。我做错了什么?

【问题讨论】:

  • 检查我的答案

标签: android android-intent broadcastreceiver


【解决方案1】:

因为lol 没有增加!

你的概念完全错误~

int lolString lol 是不同的对象。您必须在两个区域中传递相同的对象,如下所示。

第 1 类:(活动)

....
AlarmManager manager =...
....
manager.setRepeating(.....); //use to repeat + don't need to pass lol

第 2 类:(接收者)

.... 
public static int LOL = 0;
....
onReceive(....){
LOL++;
Toast.makeText(....,(String)LOL,....).show();
}

否则

在 Class 1 中增加 lol,然后将值发送到 Class 2。只需在 Class 2 中实现 toast。

点赞:

int lol =0
for(;;) {   //a forever loop which runs until your device die
sendToClass2(lol++);
}

private void sendToClass2(int foe){
....
alarmIntent.putExtra("lol",foe);
....
manager.setExact(...); // If you really love to use seExact use this
}

除此之外,为什么您要尝试从代码中启动第二类本身存在?这不是一个糟糕而复杂的想法,即使没有按照您的问题所建议的那样工作。

【讨论】:

  • 第一个解决方案不起作用,广播接收器在onReceive之后被销毁,下一个调用也将从0开始。我不确定你在第二个解决方案中在做什么,但我认为它会创建相同的问题。我使用 setExact 来确保代码经常按时发生,我不知道 setRepeating 什么时候会执行。基本上,我有兴趣将来自 gps 的位置与前一个位置进行比较,这段代码是一个测试,看看如何在调用之间保存值。我知道我应该使用 locationManger/fusedlocationAPI 但结果有问题
  • 您想在两次调用之间保存值吗?那为什么是变量呢?请使用 SharedPreference 并且您的概念是错误的:只要注册上下文有效,上下文注册的接收器就会接收广播(来自文档),因此,在 onReceived 之后,BroadcastReceiver 不会被销毁致电:进一步检查我的答案:*.com/a/50628103/8572503
  • 你的程序太复杂了,你的工作可以轻松完成
  • 所以,如果我手动注册一个接收器,它的变量将保留。谢谢你
  • @Orcha,不客气。随时寻求进一步的帮助。