有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

  1. 吐司
  2. 铃声管理器
  3. 意图
  @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();

    }


现在我们有两个案子

  1. 当我们在onReceive方法(toast、ringtone manager和intent)中包含所有三项时,toast和ringtone将分别播放和显示,而活动不会开始
  2. 当我们从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) 个答案