从 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()
。这就是为什么变量 viewScheduleActivity
是 null
.
正如@Athena 所建议的,您不需要回拨您的 Activity 来取消警报。
我正在尝试从我的 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()
。这就是为什么变量 viewScheduleActivity
是 null
.
正如@Athena 所建议的,您不需要回拨您的 Activity 来取消警报。