【问题标题】:Call Activity Method from BroadcastReceiver从 BroadcastReceiver 调用 Activity 方法
【发布时间】:2015-03-01 03:28:35
【问题描述】:

我正在尝试从我的 BroadcastReceiver(ReceiverSchedule) 调用以调用我的 Activity(ViewScheduleActivity) 中的方法 (CancelSchedules)。我遇到的主要问题是活动在 onReceive 上变为空。我想我只是把它传递给了错误的意图。我试过以下链接:Call an activity method from a BroadcastReceiver class.

首先有一个警报管理器会在正确的时间被调用,然后在接收器中我想取消所有警报。这是 Activity 中设置闹钟的代码(这部分可以正常工作)。

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
Intent myIntent = new Intent(this, RecieverSchedule.class);
myIntent.setClass(this, recieverSchedule.getClass());
myIntent.putExtra("scheduleJson", gs.toJson(schedule));
myIntent.putExtra("LoginUserAsString", gs.toJson(loginUser));
myIntent.putExtra("PatientAsString", gs.toJson(patientResult));
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, myIntent, i);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
Toast.makeText(ViewScheduleActivity.this, "Set One Time Alarm at: "+ hour +":" + min, Toast.LENGTH_LONG).show();

现在要在我的 BroadCastReceiver 中传递 Activity:

public void setMainActivityHandler(ViewScheduleActivity main) {
    viewScheduleActivity = main;
}

上面有声明:

ViewScheduleActivity viewScheduleActivity = null;

现在在创建时,我想调用 ViewScheduleActivity 中的 CancelSchedules 方法:

public void CancelSchedules()
{
    for (int i =0; i< 10; ++i)
    {
        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        Intent myIntent = new Intent(this, RecieverSchedule.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, myIntent, i);
        alarmManager.cancel(pendingIntent);
    }
}

在 RecieverSchedule 中的 onReceive 中,我有:

public void onReceive(Context context, Intent intent) {
    viewScheduleActivity.CancelSchedules();
}

问题是 viewScheduleActivity 为 null 导致我无法调用它。

我有以下代码来传递带有 ReciverSchedule 作为 Activity 中的成员创建的 Activity:

recieverSchedule = new RecieverSchedule();
recieverSchedule.setMainActivityHandler(this);
IntentFilter callInterceptorIntentFilter = new IntentFilter("android.intent.action.ANY_ACTION");
registerReceiver(recieverSchedule,  callInterceptorIntentFilter);

setMainActivityHandler 将被调用和创建,但我怀疑我传递的是新的 RecevierSchedule 而不是设置的receiverSchdule。如果我是正确的,我如何将receiverSchedule 传递给Alarmmanager?我认为 registerReceiver 会解决这个问题,但可能是放置错误。

【问题讨论】:

  • CancelSchedules 不需要在活动中。把它放在一个单独的帮助类中并使其成为静态的。问题解决了。
  • 您的PendingIntent.getBroadcast() 呼叫有误。您将变量 i 作为 flags 参数传递。这不会做你想做的事。我猜你想用它作为requestCode 参数。

标签: android android-activity broadcastreceiver alarmmanager android-pendingintent


【解决方案1】:

当AlarmManager 触发你的BroadcastReceiver 时,你的Activity 很可能已经被杀死并死掉了。发生这种情况时,Android 将为您的应用程序创建一个新进程,实例化您的BroadcastReceiver 并调用onReceive()。这就是变量viewScheduleActivity 是null 的原因。

正如@Athena 建议的那样,您无需回调 Activity 即可取消警报。

【讨论】:

    猜你喜欢
    • 2011-07-06
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多