Приемник трансляции внутри службы не прослушивал после удаления приложения из фона - PullRequest
0 голосов
/ 13 марта 2019

У меня зарегистрирован приемник вещания для получения SMS внутри службы.Целью Приложения является получение SMS-сообщения о получении и сохранение содержимого SMS-сообщения от ожидаемого отправителя в хранилище Sqlite.Приложению необходимо также получать SMS-сообщения, полученные даже в том случае, если приложение не работает в фоновом режиме.

public class SMSService extends Service {

    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        public static final String SMS_BUNDLE = "pdus";
        ContentValues userValues;
        Object[] sms;

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals("android.provider.Telephony.SMS_RECEIVED")) {
                Log.d("~~~ SMS !!!", "~~~ SMS ~~~ SMS ~~~ SMS~~~ SMS ~~~");
                AsyncSmsHandler asyncSmsHandler = new AsyncSmsHandler(context, intent);
                asyncSmsHandler.execute("");
            }
        }


        class AsyncSmsHandler extends AsyncTask<String, Void, String> {

            Context context;
            Intent intent;

            public AsyncSmsHandler(Context context, Intent intent) {
                this.context = context;
                this.intent = intent;
            }

            @Override
            protected String doInBackground(String... params) {

                String smsBody = "", address = "";
                Bundle intentExtras = intent.getExtras();
                SmsMessage smsMessage = null;
                if (intentExtras != null) {
                    sms = (Object[]) intentExtras.get(SMS_BUNDLE);

                    String smsMessageStr = "";
                    for (int i = 0; i < sms.length; ++i) {
                        smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);
                        smsBody = smsBody + smsMessage.getMessageBody();

                   smsMessageStr += smsBody + "\n";
                    }


                    address = smsMessage.getOriginatingAddress();

                    Log.d("SMS RECEIVER NUMBER", " " + smsBody + " -- " + sms.length);

                    //SAVE THE MESSAGE AND NUMBER

                }
                return "";
            }

            @Override
            protected void onPostExecute(String result) {


                // Create an explicit intent for an Activity in your app
                Intent intent = new Intent(context, AquaOrderList.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

                NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "CHANNEL_ID")
                        .setSmallIcon(R.drawable.logo)
                        .setContentTitle(“TITLE”)
                        .setContentText(“Message”)
                        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                        .setContentIntent(pendingIntent)
                        .setAutoCancel(true);

                NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);

                // notificationId is a unique int for each notification that you must define
                notificationManager.notify(1, builder.build());
            }

        }
    };

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }


    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");

        registerReceiver(receiver, filter);
    }

    @Override
    public void onDestroy() {
        unregisterReceiver(receiver);
    }
}

Таким образом регистрируется получатель в методах onCreate и unregisterReceiver для методов onDestroy.

Эта работакак и ожидалось, но когда я убиваю приложение и через некоторое время, если я получаю SMS, оно не срабатывает.Если я снова открою приложение, после этого SMS начнет сохраняться в хранилище.

Служба разрушается?Я проверил в «Запущенных сервисах» на мобильном телефоне и вижу, что сервис запущен.

Я также добавил разрешения в файл манифеста.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xyz.app”>

    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name=".SMSService"
            android:enabled="true"
            android:exported="true"></service>

        <activity
            android:name=".OrderList"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/title_activity_order_list"
            android:theme="@style/FullscreenTheme"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

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

...