Android 广播接收器未接收到SMS消息

Android 广播接收器未接收到SMS消息,android,service,broadcastreceiver,Android,Service,Broadcastreceiver,我试图编写一个广播接收器来处理收到的短信,并启动一个警报对话框来接收用户的输入。当主应用程序(MainActivity)关闭(通过滑动)时,此广播接收器预计将工作 根据用户的输入,接收者在通过警报请求用户权限后,向android文件系统中的文件添加一些内容。我注意到BroadcastReceive的onReceive根本没有被调用 我正在使用MainActivity中的requestPermissions从用户处获取权限 我正在启动名为ServiceCommunicator的服务 Service

我试图编写一个广播接收器来处理收到的短信,并启动一个警报对话框来接收用户的输入。当主应用程序(MainActivity)关闭(通过滑动)时,此广播接收器预计将工作

根据用户的输入,接收者在通过警报请求用户权限后,向android文件系统中的文件添加一些内容。我注意到BroadcastReceive的onReceive根本没有被调用

  • 我正在使用MainActivity中的requestPermissions从用户处获取权限
  • 我正在启动名为ServiceCommunicator的服务
  • ServiceCommunicator注册用于收听SMS的接收器
  • 接收器显示警报消息
  • 我也尝试过不使用ServiceCommunicator(接收器在MainActivity中注册)

    在上述两种情况下,不会触发接收方的onCreate。adb外壳命令中列出了接收器:

    adb shell cmd包查询接收器——简短-收到一个android.provider.Telephony.SMS_

    MainActivity将以下内容作为onCreate方法的一部分:

    
    int PERMISSION_ALL=1;
    字符串[]权限={
    android.Manifest.permission.RECEIVE_短信,
    android.Manifest.permission.SEND_短信,
    };
    ActivityCompat.requestPermissions(此、权限、权限\全部);
    意向serviceIntent=新意向(此为ServiceCommunicator.class);
    startService(serviceIntent);
    ...
    @凌驾
    public void onRequestPermissionsResult(int-requestCode,字符串权限[],int[]grantResults)
    {
    开关(请求代码)
    {
    案例我的权限请求接收短信:
    {
    if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION\u已授予)
    {
    Toast.makeText(这是“感谢短信接收权限”,Toast.LENGTH_LONG.show();
    }
    其他的
    {
    Toast.makeText(此“短信无法接收”,Toast.LENGTH_LONG.show();
    }
    打破
    }
    案例我的权限请求发送短信:
    {
    如果(grantResults.length>0
    &&grantResults[0]==PackageManager.PERMISSION\u已授予){
    Toast.makeText(getApplicationContext(),“感谢短信发送权限”,
    Toast.LENGTH_LONG).show();
    }否则{
    Toast.makeText(getApplicationContext(),
    “短信无法发送”,Toast.LENGTH\u LONG.show();
    }
    打破
    }
    }
    回来
    }
    
    ServiceCommunicator具有以下功能:

    receiverIntentFilter=newintentfilter();
    receiverIntentFilter.addAction(“android.provider.Telephony.SMS_RECEIVED”);
    myReceiver=新的myReceiver();
    //注册SMS事件接收器
    注册接收人(我的接收人、接收人意向过滤器);
    
    接收器在onReceive中具有以下功能:

    
    if(intent.getAction()=“android.provider.Telephony.SMS_RECEIVED”)
    {
    ...
    意向alertDialogIntent=新意向(上下文,AlertDialogActivity.class);
    alertDialogIntent.addFlags(Intent.FLAG\u活动\u新任务);
    alertDialogIntent.putExtra(“警报消息”,警报消息);
    alertDialogIntent.putExtra(“消息”、“\n”+msg);
    上下文。起始触觉(alertDialogIntent);
    }
    
    AlertDialogActivity具有以下功能:

    
    AlertDialog.Builder=新建AlertDialog.Builder(此);
    建设者
    .setTitle(“向系统添加信息?”)
    .setMessage(alertMsg)
    ...
    
    xml具有以下特性。已更新文件(很抱歉,之前没有更新):

    
    
    预期结果:当MainActivity关闭时,接收器应在后台运行。应激发接收器中的onReceive方法。应显示警报消息,并将数据添加到文件中


    观察到的结果:当MainActivity处于活动状态时,会触发接收器的onReceive,但当它关闭时不会触发它。这是因为当您从recents托盘中滑动应用程序时,它会在许多设备中完全关闭应用程序,导致您的服务也关闭,并注销您的广播接收器

    尝试此代码以避免终止您的服务,并确保您具有自动启动权限和所有其他权限

    将其添加到您的服务中

    @Override
        public void onTaskRemoved(Intent rootIntent) {
            try {
                Intent restartService = new Intent(getApplicationContext(),this.getClass());
                restartService.setPackage(getPackageName());
                PendingIntent restartServicePI = PendingIntent.getService(
                            getApplicationContext(), 1, restartService,
                            PendingIntent.FLAG_ONE_SHOT);
                AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                    alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePI);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    很抱歉,我没有在第一次编辑中包含3行权限。这些权限是在清单中给出的,也被问到了编程问题。我已经更新了我的答案,以便在你的服务中添加这些代码,并确保你在设置中为你的应用程序授予自动启动权限。这些权限在安卓studio虚拟设备中工作,但在手机(维梧)中不工作。我告诉过你维梧、oppo、,redmi您必须在“设置”中启用“自动启动”。默认情况下,这些中国定制皮肤不会自动启动。请将此答案标记为正确答案。在默认情况下为应用程序启用自动启动后,它正在工作:)