我试图从我的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会解决这个问题,但也许这个位置是错误的。感谢任何帮助!
答案 0 :(得分:0)
AlarmManager
触发BroadcastReceiver
时,您的活动可能会被长期杀死并死亡。发生这种情况时,Android会为您的应用创建一个新流程,实例化您的BroadcastReceiver
并致电onReceive()
。这就是变量viewScheduleActivity
为null
的原因。
正如@Athena建议的那样,您无需回复您的活动以取消闹钟。