java无法从broadCastReceiver的onReceive方法启动活动
我正在开发一个报警应用程序。 在这里,我使用的是广播接收器和报警管理器。当警报关闭时,会调用onReceive方法,然后从onReceive方法调用startActivity来启动一个意图
但我面临的问题是,在某些设备中,当应用程序处于后台或被终止时,活动无法启动
在onReceive方法中,我有三件事:
- 吐司
- 铃声管理器
- 意图
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "In broadcast receiver", Toast.LENGTH_LONG).show();
Bundle args = intent.getBundleExtra(Constants.BROADCAST_RECEIVER_BUNDLE);
Alarms alarms = (Alarms) args.getSerializable(Constants.ALARM_OBJECT);
int alarmRequestCode = args.getInt(Constants.ALARM_REQUEST_CODE);
Intent OpenAppIntent = new Intent();
// I also tried with adding classes in intent object directly eg new Intent(context, MyActivity.class) but no luck
OpenAppIntent.setClass(context,com.example.MyActivity.class);
OpenAppIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
OpenAppIntent.putExtra(Constants.BROADCAST_RECEIVER_BUNDLE , args);
context.startActivity(OpenAppIntent);
Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
if (alarmUri == null) {
alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
}
Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
ringtone.play();
}
现在我们有两个案子
- 当我们在onReceive方法(toast、ringtone manager和intent)中包含所有三项时,toast和ringtone将分别播放和显示,而活动不会开始
- 当我们从onReceive方法(toast和intent)中删除ringtone manager时,toast也不会显示(活动也不会启动)
人们注意到这个问题的设备有Gionee F9、摩托罗拉g5s和Redmi k20 pro。此外,诺基亚7 Plus有时也会发生同样的情况
请告诉我代码有什么问题,或者当收到广播时,启动活动的最佳方式是什么
测试1
我没有启动活动,而是尝试显示全屏通知,如here所示,并在注释中建议显示,但由于错误无法从静态上下文引用非静态方法startForeground(int,notification)
@Override
public void onReceive(Context context, Intent intent) {
Intent notificationIntent = new Intent(context, MyActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(Constants.ALARM_OBJECT , alarms);
notificationIntent.putExtra(Constants.BROADCAST_RECEIVER_BUNDLE , bundle);
PendingIntent pendingIntent = PendingIntent.getActivity(context,
0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
.setContentTitle(Constants.APP_NAME)
.setContentText("Stop the alarm")
.setSmallIcon(R.drawable.logo_inner)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setFullScreenIntent(pendingIntent, true)
.build();
Service.startForeground(1, notification); // Non-static method startForeground(int, notification) cannot be referenced from a static context
}
测试2
我还尝试直接从onReceive方法启动前台服务,但与启动活动出现相同的问题。我还尝试过在onCreate服务方法上设置断点进行调试,但onCreate从未被这些设备调用(Gionee F9、Motorola g5s和Redmi k20 pro)
@Override
public void onReceive(Context context, Intent intent) {
Intent alarmServiceIntent = new Intent(context, AlarmSoundService.class);
Bundle alarmServiceBundle = new Bundle();
alarmServiceBundle.putSerializable(Constants.ALARM_OBJECT , alarms );
alarmServiceIntent.putExtra(Constants.ALARM_BUNDLE , alarmServiceBundle);
// startService(alarmServiceIntent);
ContextCompat.startForegroundService(context, alarmServiceIntent);
}
如有任何建议,将不胜感激
谢谢!
共 (0) 个答案