Постоянно работает служба на android 9.0 или выше - PullRequest
0 голосов
/ 24 февраля 2020

Мое приложение предназначено для резервного копирования SMS/MMS сообщений.

До сих пор моей идеей было резервное копирование SMS/MMS в XML файл сразу после их поступления или отправки, а затем периодически загружать созданные XML файл в облачное хранилище, даже если приложение не запущено.

Этот подход является единственным, который я нашел достаточно надежным, чтобы не потерять ни одного разговора.

Функции для выполнения все это в основном завершено, но я заметил, что Google не позволяет service быть running continuously на устройстве.

Итак, мой вопрос, есть ли способ заставить service работать в background непрерывно, не будучи убитым через некоторое время. Я не заинтересован в foreground services, поскольку я не хочу, чтобы sh мои пользователи постоянно отображали notification.

Это мое первое приложение в принципе, и я даже не уверен, что мой подход чтобы резервное копирование программного обеспечения было правильным.

Я хотел бы получить некоторую информацию о том, как мне решить эту проблему. Все, что меня волнует в данный момент, - это то, что мое приложение мгновенно создаст резервную копию каждого разговора по send или receive.

.

1 Ответ

1 голос
/ 24 февраля 2020

вы можете использовать android.permission.BIND_NOTIFICATION_LISTENER_SERVICE разрешение в вашем сервисе, но вы должны запросить у пользователя разрешение, а также android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS разрешение для "режима ожидания", а затем использовать Thread в сервисе для вашего BroadCastReceiver. таким образом гарантируется, что ваш сервис будет работать всегда, но это будет стоить батареи. я пробовал и тестировал это для своего приложения с 19-го по 28-й уровень API и никогда не останавливался даже на некоторых устройствах, таких как nokia с отключенной фоновой службой android O, но с помощью этого трюка вы можете сохранить его работоспособным. приложения, такие как Gameboosters или Cleaners, также используют эту уловку, чтобы поддерживать службу alwyase.

ОБНОВЛЕНИЕ:

   <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    <service
        android:name=".Service.NLService"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
        >
        <intent-filter>
            <action android:name="android.service.notification.NotificationListenerService" />
        </intent-filter>
    </service>

Сервис

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public class NLService extends NotificationListenerService {

    private static final String TAG = NLService.class.getSimpleName();

    @Override
    public void onCreate() {
        super.onCreate();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true)
                    try {
                        doSomeThing(NLService.this);
                        Thread.sleep(6000);
                    } catch (Exception ignore) {
                    }
            }
        }).start();

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {

        doSomeThing(this);
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {

        doSomeThing(this);
    }

Запрос Разрешение

private static final String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";

public void askForNotificationServicePermission() {

        context.startActivity(new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS));

}

public void askForDozeModePermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Intent intent = new Intent();
        String packageName = context.getPackageName();
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + packageName));
            context.startActivity(intent);

    }
}

doSomeThing(this); - это какой-то метод, который вы хотите запустить, например, ваш умный приемник.

...