Android 广播接收器未接收到SMS消息
我试图编写一个广播接收器来处理收到的短信,并启动一个警报对话框来接收用户的输入。当主应用程序(MainActivity)关闭(通过滑动)时,此广播接收器预计将工作 根据用户的输入,接收者在通过警报请求用户权限后,向android文件系统中的文件添加一些内容。我注意到BroadcastReceive的onReceive根本没有被调用Android 广播接收器未接收到SMS消息,android,service,broadcastreceiver,Android,Service,Broadcastreceiver,我试图编写一个广播接收器来处理收到的短信,并启动一个警报对话框来接收用户的输入。当主应用程序(MainActivity)关闭(通过滑动)时,此广播接收器预计将工作 根据用户的输入,接收者在通过警报请求用户权限后,向android文件系统中的文件添加一些内容。我注意到BroadcastReceive的onReceive根本没有被调用 我正在使用MainActivity中的requestPermissions从用户处获取权限 我正在启动名为ServiceCommunicator的服务 Service
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您必须在“设置”中启用“自动启动”。默认情况下,这些中国定制皮肤不会自动启动。请将此答案标记为正确答案。在默认情况下为应用程序启用自动启动后,它正在工作:)