Java 无法从broadCastReceiver的onReceive方法启动活动

Java 无法从broadCastReceiver的onReceive方法启动活动,java,android,android-intent,broadcastreceiver,alarmmanager,Java,Android,Android Intent,Broadcastreceiver,Alarmmanager,我正在开发一个报警应用程序。 在这里,我使用的是广播接收器和报警管理器。当警报关闭时,会调用onReceive方法,然后从onReceive方法调用startActivity来启动一个意图 但我面临的问题是,在某些设备中,当应用程序处于后台或被终止时,活动无法启动 在onReceive方法中,我有三件事: 吐司 铃声管理器 意图 现在我们有两个案子 当我们在onReceive方法(toast、ringtone manager和intent)中包含所有三项时,toast和ringtone将分别播放

我正在开发一个报警应用程序。 在这里,我使用的是广播接收器和报警管理器。当警报关闭时,会调用onReceive方法,然后从onReceive方法调用startActivity来启动一个意图

但我面临的问题是,在某些设备中,当应用程序处于后台或被终止时,活动无法启动

在onReceive方法中,我有三件事:

  • 吐司
  • 铃声管理器
  • 意图
  • 现在我们有两个案子

  • 当我们在onReceive方法(toast、ringtone manager和intent)中包含所有三项时,toast和ringtone将分别播放和显示,而活动不会开始
  • 当我们从onReceive方法(toast和intent)中删除铃声管理器时,toast也不会显示(活动也不会启动)
  • 注意到这个问题的设备有GioneeF9、MotorolaG5S和Redmi k20 pro。此外,诺基亚7 Plus有时也会发生同样的情况

    请告诉我代码有什么问题,或者当收到广播时,启动活动的最佳方式是什么

    测试1

    我没有启动活动,而是尝试按注释中的显示和建议显示全屏通知,但由于错误,无法从静态上下文引用非静态方法startForeground(int,notification)

    测试2

    我还尝试直接从onReceive方法启动前台服务,但与启动活动出现相同的问题。我还尝试通过在服务的onCreate方法上放置断点进行调试,但onCreate从未被这些设备调用(GioneeF9、MotorolaG5s和Redmi k20 pro)

    如有任何建议,将不胜感激


    谢谢你

    这不是你应该处理警报的方式,你应该使用。你在舱单上注册了你的接收器吗?@ianhanniballake谢谢你的建议,我正在尝试让我们看看works@RavenYang是的,我已经注册了manifest@ianhanniballake我按照你的建议试过了,但没有成功。请看一下编辑过的问题
      @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();
    
        }
    
    
    
    @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 
        }
    
    
        @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);
        }