【发布时间】: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