从 BroadcastReceiver 调用 Activity 方法

Call Activity Method from BroadcastReceiver

我正在尝试从我的 BroadcastReceiver(ReceiverSchedule) 调用我的 Activity(ViewScheduleActivity) 中的一个方法 (CancelSchedules)。我遇到的主要问题是 Activity 在 onReceive 上变为空。我想我只是把它传递给了错误的意图。我尝试了以下 link: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;

现在在创建时我想调用我的 ViewSchedule 中的方法 CancelSchedulesActivity:

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 为空导致我无法调用它。

我有以下代码来传递 Activity,并在 Activity 中创建 ReciverSchedule 作为成员:

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

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

你的 Activity 很可能在 AlarmManager 触发你的 BroadcastReceiver 时早已被杀死。发生这种情况时,Android 将为您的应用程序创建一个新进程,实例化您的 BroadcastReceiver 并调用 onReceive()。这就是为什么变量 viewScheduleActivitynull.

正如@Athena 所建议的,您不需要回拨您的 Activity 来取消警报。