Как обеспечить работу приемника вещания и прослушивания входящих текстовых сообщений без потери операционной системой - PullRequest
1 голос
/ 20 октября 2019

Я пишу приложение для Android, которое прослушивает входящие текстовые сообщения, а затем синхронизируется с серверной частью. Пока приложение работает нормально, но через некоторое время приложение не получает никаких входящих сообщений, если только я снова не открою приложение. Изучили различные варианты, предлагающие реализовать JobService или просто сервис, но чем больше исследований я делаю, тем больше запутываюсь. Что касается JobService, я вижу, что он предназначен только для планирования работы через некоторое время, и служба может быть уничтожена после завершения работы. Мне нужна помощь, чтобы найти лучший способ решить это. Ниже мой код для класса приемника вещания;

открытый класс MessageReceiver extends 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);

   }

}

Я реализовал интерфейс, в котором я передаю полученный объект 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);
}

Ниже мой манифест

       <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>

1 Ответ

1 голос
/ 20 октября 2019

Я не знаю, откуда, по вашему мнению, ваш MessageListener объект.

Пожалуйста, поймите, что процесс вашего приложения не работает вечно. Как только пользовательский интерфейс вашего приложения переходит в фоновый режим, Android может прервать ваш процесс в любое время . Это избавляет от любого MessageListener объекта, который может существовать.

И поэтому, скорее всего, происходит то, что вы настроили этот MessageListener, и он работает некоторое время, пока этот оригинальный процесс не получитпрекращается. Будущие SMS-сообщения начнут новый процесс для вашего приложения, но у вас больше не будет MessageListener, и ваша работа не будет завершена.

Вместо этого избавьтесь от MessageListener и прочего staticполе, которое вы используете для хранения ссылки на него. Пусть BroadcastReceiver использует WorkManager для выполнения своей фоновой работы, где ваш Worker может справиться со всем сам, не полагаясь на какие-либо действия и т. Д. Вашего приложения, обязательно запущенные в текущем процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...