java - 广播接收器不在后台工作
问题描述
我正在创建一个应用程序,它可以检测到 android 手机的传入短信,但应用程序无法在后台运行。
这是我的 mainactivity.java,我在其中请求用户允许访问读取短信。
package com.example.times;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Switch;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final int READ_SMS_PERMISSION=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED)
{
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECEIVE_SMS))
{
// do nothing
}
else
{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, READ_SMS_PERMISSION);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
{
switch(requestCode)
{
case READ_SMS_PERMISSION:
{
if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED)
{
Toast.makeText(this, "Thankyou for granting access", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(this, "No problem", Toast.LENGTH_LONG).show();
}
}
}
}
}
这是 myreciver.java,我在其中检测到传入的短信并制作该消息。
打开应用程序后,它可以正常工作,但是当我退出应用程序时,它没有检测到任何短信。
package com.example.times;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED="android.provider.Telephony.SMS_RECEIVED";
private static final String TAG="SmsBroadcastReceiver";
String msg, phoneNo ="";
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
// throw new UnsupportedOperationException("Not yet implemented");
Log.i(TAG, "Intent Received: " +intent.getAction());
if (intent.getAction()==SMS_RECEIVED)
{
Bundle dataBundle = intent.getExtras();
if (dataBundle!=null)
{
Object[] mypdu=(Object[])dataBundle.get("pdus");
final SmsMessage[] message = new SmsMessage[mypdu.length];
for (int i =0; i<mypdu.length; i++)
{
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M)
{
String format= dataBundle.getString("format");
message[i] = SmsMessage.createFromPdu((byte[])mypdu[i],format);
}
else
{
message[i] = SmsMessage.createFromPdu((byte[]) mypdu[i]);
}
msg =message[i].getMessageBody();
phoneNo= message[i].getOriginatingAddress();
}
Toast.makeText(context, "Message: " +msg +"\nNumber: " +phoneNo, Toast.LENGTH_SHORT).show();
}
}
}
}
如果我做错了什么,请告诉我。
解决方案
确保你的 Android Mainfest.xml 中有这些
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
以及以下
<receiver
android:name=
"com.example.times.MyReceiver"
android:enabled="true"
android:exported="true">
</receiver>
编辑
当您的应用程序关闭或在后台时,您需要一个意图服务来读取短信。
意图服务 - 在后台运行
脚步:
- 创建意图服务
- 添加它清单
- 通过 Intent 从您的广播接收器 onReceive() 方法调用它
推荐阅读
- mapreduce - 喜欢什么gridmix输入格式?
- c# - 实现接口 B 的接口 D 的列表不能被识别为 List
- python - 无法使用 anaconda 在虚拟环境中导入包
- javascript - 在滚动上加载更多数据
- javascript - 了解移动设备上的方向、纵横比和 CSS 像素
- glassfish - 如何在 GlassFish Cluster (Glassfish 4) 中为每个实例添加单独的 Java 选项?
- javascript - 是否有一种安全的方式让 Web 扩展在选项卡中包含 ui?
- javascript - 如何使用输入类型=文件对接受的文件类型没有限制?
- java - 卡片视图中未显示图像和文字
- project-reactor - 反应堆中的单声道doOnEmpty?