在我从最近的任务中清除应用程序时,Oreo工作管理器停止触发。怎么解决?

问题描述 投票:0回答:2

我正在设置工作经理一段时间。它与其他Android版本如25或更低版本一起使用。但是,当我在API 28上运行它时,当我从最近的应用程序中清除应用程序时,它正在停止触发。

我在活动中安排了这样的事情:

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

这是我的工人类:

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上的最近列表中的应用程序。

android android-service android-lifecycle android-jetpack android-workmanager
2个回答
3
投票

根据ankuranurag2的答案,确实有些Android品牌在最近的杀戮后强制停止应用程序。在标签#2的工作管理器谷歌问题跟踪器https://issuetracker.google.com/issues/110745313中检查此问题。

甚至我也试图在最近杀死应用程序(设备 - HUAWEI BKL-L09)之后在后台运行该作业但是无法做到这一点。

在将其更改为手动后检查自动启动选项,然后它正常工作。但是,对于UX而言,告诉用户更改自动启动选项不是一个好主意,我们无法确定它是打开还是关闭。

在搜索之后我给了一个修补程序,我认为它不是一个更好的解决方案,但可以检查它是否适合我。

1st创建一个标识杀死应用程序进程的服务IS引用此url qazxsw poi

UserKillingService

https://stackoverflow.com/a/42856811/8264148

在清单中配置服务

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()
    }
}

此服务调用onTaskRemoved中的StartUpActivity并停止根本不需要的服务。

此活动是主要的启动器活动,没有UI

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

或者你可以使用android:theme =“@ android:style / Theme.Translucent.NoTitleBar”

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>

此Startupactivity将在不强制停止应用程序的情况下完成。此活动在未从UserKillingService触发时调用splashActivity。

在SplashActivity内部onCreate调用UserKillingService

Inside onCreate of StartUpActivity

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

请告诉我你是否有更好的解决方案。对不起我的英语不好


0
投票

如果你通过if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) startService(Intent(baseContext,UserKillingService::class.java)) ,你会发现:

不幸的是,一些设备实现了从最近的菜单中杀死应用程序作为强制停止。股票Android不会这样做。当一个应用程序被强制停止时,它无法执行作业,接收警报或广播等。所以不幸的是,我们解决它是不可行的 - 问题在于操作系统并且没有解决方法。

这是一个众所周知的问题。为了节省电池,许多制造商强制关闭应用程序,从而取消所有期间任务,警报和广播接收器等。主要制造商是OnePlus(您可以选择toogle),Redmi,Vivo,Oppo,Huwaei。

这些设备中的每一个都具有AutoStartManagers / AutoLaunch / StartManager类型的优化管理器。这会阻止后台活动重新开始。您必须手动要求用户将您的应用程序列入白名单,以便该应用程序可以自动启动其后台处理。关注THE LINKTHIS链接,了解更多信息。

添加到不同制造商的白名单的方法在THIS中给出。即使添加到白名单后,由于DOZE模式,您的应用可能无法正常工作,因为您必须使用this stackoverflow answer

如果您可能想知道,Gmail / Hangout / WhatsApp / Slack / LinkedIn等应用程序已经被这些AutoStart Manager列入白名单。因此,对他们的背景过程没有影响。您始终可以及时收到更新和通知。

P.S:复制自我自己的答案ignore battery otimizations

© www.soinside.com 2019 - 2024. All rights reserved.