android - 如何确保广播接收器保持运行并监听传入的文本消息而不会被操作系统杀死

标签 android broadcastreceiver

我正在编写一个 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/

相关文章:

android - 将引用的分配传递给 Renderscript 根函数?

Android 找不到我的 BroadcastReceiver。我究竟做错了什么?

android - 代号一HTML解析

java - 设计两列 Android 应用程序 - 切换 View ?

java - Signal R native Android 应用程序协商失败

php - 社交 Android 应用程序的通知系统 - 推送与轮询以及如何制作服务器 "Push"

Android 从 Fragment 设置闹钟

android - 在广播接收器中添加自定义监听器会导致 Android 中的 NPE

java - 从 Android BroadcastReceiver 获取 UI

java - BroadcastReceiver 被系统杀死或取消注册