我正在编写一个 Android 应用程序来监听传入的文本消息,然后与后端同步。到目前为止,该应用程序运行正常,但过了一段时间后,除非我再次打开该应用程序,否则该应用程序不会收到任何传入消息。已经探索了各种建议实现 JobService 或只是服务的选项,但我做的研究越多,我就越感到困惑。对于 JobService,我可以看到它只意味着在一段时间后安排作业,一旦作业完成,服务可能会被终止。我需要有关解决问题的最佳方法的帮助。下面是我的广播接收器类代码;
公共(public)类 MessageReceiver 扩展 BroadcastReceiver {
private static MessageListener messageListener;
Handler mHandler;
private static final String TAG = "MessageReceiver";
public MessageReceiver() {
}
@TargetApi(Build.VERSION_CODES.M)
@Override
public void onReceive(final Context context, Intent intent) {
if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) {
final Bundle data = intent.getExtras();
HandlerThread bgHandlerThread=new HandlerThread("MyCoolBackgroundThread");
bgHandlerThread.start();
mHandler=new Handler(bgHandlerThread.getLooper());
Runnable backgroundRunnable = new Runnable() {
@Override
public void run() {
passReceivedMsg(data);
}
};
mHandler.post(backgroundRunnable);
}
}
我已经实现了一个接口(interface),我在其中传递接收到的 TextMessage 对象,
private void passReceivedMsg(final Bundle bundleData) {
if (bundleData !=null ){
try {
final Object[] pdusObj = (Object[]) bundleData.get("pdus");
if (pdusObj != null) {
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage =
SmsMessage.createFromPdu((byte[]) pdusObj[i]);
Log.d(TAG, "run: currentMessage: "+currentMessage);
messageListener.getReceivedMessage(currentMessage);
Log.d(TAG, "handleMessage: message "+currentMessage);
}
}
}
catch (Exception e){
Log.d(TAG, "onReceive: Error occurred "+e);
}
}
}
public static void bindListener (MessageListener listener){
messageListener = listener;
}
MessageListener 如下;
public interface MessageListener {
void getReceivedMessage(SmsMessage message);
}
下面是我的 list
<receiver
android:name=".utils.MessageReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
最佳答案
我不知道您认为您的 MessageListener
对象来自哪里。
请理解您的申请流程不会永远运行下去。一旦您的应用程序的用户界面移至后台,Android can terminate your process at any time .这摆脱了可能存在的任何 MessageListener
对象。
因此,很可能发生的情况是您设置了此 MessageListener
,它会工作一段时间,直到原始进程终止。 future 的 SMS 消息将为您的应用启动一个全新的流程,但您不再拥有 MessageListener
,因此您的工作没有完成。
相反,摆脱 MessageListener
以及您用来保存对它的引用的任何 static
字段。让你的 BroadcastReceiver
使用 WorkManager
做它的后台工作,你的 Worker
可以自己处理一切,而不依赖于你的任何 Activity 等应用必须在当前进程中运行。
关于android - 如何确保广播接收器保持运行并监听传入的文本消息而不会被操作系统杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58472837/