На Oreo Work Manager перестает работать, когда я очищаю приложение от недавней задачи.Как это решить? - PullRequest
0 голосов
/ 15 февраля 2019

Я устанавливаю менеджер работы на определенное время.Это работает с другой версией Android, как 25 или ниже.Но когда я запускаю его по API 28, он перестает запускаться, когда я очищаю приложение от последних приложений.

Я запланировал так в действии:

 OneTimeWorkRequest mywork =
                new OneTimeWorkRequest.Builder(MyWorker.class)
                        .setInitialDelay(15, TimeUnit.SECONDS)
                        .build();
        WorkManager.getInstance().enqueue(mywork);

Это мой класс Worker:

public class MyWorker extends Worker {
    @NonNull
    @Override
    public Worker.WorkerResult doWork() {
        // Do the work here
        Mylogger.getInstance().printLog("MyWorr","doWork()");
        //fire broadcast from here
        Intent broadcastIntent = new Intent(getApplicationContext(), 
TimeMatchingBroadcastReceiver.class);
        getApplicationContext().sendBroadcast(broadcastIntent);
        CommonUtils.scheduleWorkManager();
        // Indicate success or failure with your return value:
        return WorkerResult.SUCCESS;

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to try again.)
    }
}

Я хочу запустить Диспетчер работ, даже если закрою или очисту приложение из недавнего списка на всех версиях Android.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Согласно ответу ankuranurag2, это правда, что некоторые бренды андроидов принудительно закрывают приложение после недавних убийств.проверьте эту проблему в диспетчере работ google tracker https://issuetracker.google.com/issues/110745313 для тега № 2.

Даже я также пытался запустить задание в фоновом режиме после недавнего удаления приложения (устройство - HUAWEI BKL-L09), но не может этого сделать.

Проверен параметр автозапуска после изменения его вручную, после чего он работал нормально.Но это не очень хорошая идея для UX, чтобы сказать пользователю об изменении опции автозапуска, и мы не можем определить, включена она или выключена.

После поиска я дал исправление патча, я думаюэто не лучшее решение, но можно проверить, что оно работает для меня.

1-й Создайте службу, которая идентифицирует уничтожение процесса приложения, на который я ссылался по этому URL https://stackoverflow.com/a/42856811/8264148

UserKillingService

class UserKillingService : Service() {

    override fun onBind(intent: Intent?)= null

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int)= Service.START_NOT_STICKY

    override fun onDestroy() {
        super.onDestroy()
    }

    override fun onTaskRemoved(rootIntent: Intent?) {
        val i = Intent(this,StartUpActivity::class.java)
        i!!.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        i!!.putExtra("USER_KILLED", "USER_KILLED")
        startActivity(i)
        //stop the service
        stopSelf()
    }
}

Настройка службы в манифесте

<service android:name=".UserKillingService"
            android:stopWithTask="false"/>

Эта служба вызывает StartUpActivity в onTaskRemoved и останавливает службу, которая вообще не требуется.

это действие является основным действием средства запускабез пользовательского интерфейса

StartUpActivity

<activity android:name=".StartUpActivity"
            android:theme="@android:style/Theme.NoDisplay">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

или вы можете использовать android: theme = "@android: style / Theme.Translucent.NoTitleBar"

Inside onCreate of StartUpActivity

if (intent.hasExtra("USER_KILLED")) {
//finish the instance
            finish()
        } else {
          SplashActivity::class.start(this@StartUpActivity,finish = true)
        }

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

Внутри SplashActivity onCreate вызывает UserKillingService

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O)
        startService(Intent(baseContext,UserKillingService::class.java))

Пожалуйста, сообщите мне, если вы найдете какое-либо лучшее решение.Извините за мой английский

0 голосов
/ 20 февраля 2019

Если вы пройдете через ССЫЛКА , вы найдете:

К сожалению, некоторые устройства реализуют уничтожение приложения из меню «Последние» в качестве принудительной остановки.Сток Android не делает этого.Когда приложение принудительно останавливается, оно не может выполнять задания, получать сигналы тревоги или широковещательные сообщения и т. Д. Поэтому, к сожалению, мы не можем решить эту проблему - проблема заключается в ОС, а обходного пути нет.

Это известная проблема.Чтобы сэкономить заряд батареи, многие производители принудительно закрывают приложение, отменяя, таким образом, все задачи периода, аварийные сигналы, радиовещательные приемники и т. Д. Основными производителями являются OnePlus (у вас есть возможность переключения), Redmi, Vivo, Oppo, Huwaei.

Каждое из этих устройств имеет менеджеры оптимизации типа AutoStartManager / AutoLaunch / StartManager.Которые мешают фоновым действиям начинать заново.Вам нужно будет вручную попросить пользователя внести в белый список ваше приложение, чтобы приложение могло автоматически запускать свои фоновые процессы.Для получения дополнительной информации перейдите по ссылке THIS и THIS .

Методы, добавляемые в белый список для разных производителей, приведены в в ответе на этот стек .Даже после добавления в белый список ваше приложение может не работать из-за режима DOZE, для этого вам придется игнорировать раздражения батареи

Также, если вам интересно, такие приложения, какGmail / Hangout / WhatsApp / Slack / LinkedIn и т. Д. Уже включены в белый список этих менеджеров автозапуска.Следовательно, нет никакого влияния на их фоновые процессы.Вы всегда получаете своевременные обновления и уведомления.

PS: скопировано из моего собственного ответа ЗДЕСЬ

...