从BroadcastReceiver调用活动方法

时间:2015-03-01 03:28:36

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

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

首先有一个警报管理器将在正确的时间被调用,然后在接收器中我要取消所有警报。以下是设置警报的活动中的代码(此部分可以正常工作)。

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而不是set receiverSchdule。如果我是正确的,我如何将receiverSchedule传递给Alarmmanager?我以为registerReceiver会解决这个问题,但也许这个位置是错误的。感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

AlarmManager触发BroadcastReceiver时,您的活动可能会被长期杀死并死亡。发生这种情况时,Android会为您的应用创建一个新流程,实例化您的BroadcastReceiver并致电onReceive()。这就是变量viewScheduleActivitynull的原因。

正如@Athena建议的那样,您无需回复​​您的活动以取消闹钟。