我正在设置工作经理一段时间。它与其他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上的最近列表中的应用程序。
根据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)
}
请告诉我你是否有更好的解决方案。对不起我的英语不好
如果你通过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 LINK和THIS链接,了解更多信息。
添加到不同制造商的白名单的方法在THIS中给出。即使添加到白名单后,由于DOZE模式,您的应用可能无法正常工作,因为您必须使用this stackoverflow answer
如果您可能想知道,Gmail / Hangout / WhatsApp / Slack / LinkedIn等应用程序已经被这些AutoStart Manager列入白名单。因此,对他们的背景过程没有影响。您始终可以及时收到更新和通知。
P.S:复制自我自己的答案ignore battery otimizations