使用WorkManager保活,即使应用被杀掉,也是可以继续执行代码的,目前运行环境是模拟器,具体国内各厂商能否执行,未经过实际测试,就不说了。
我们首先定义Worker类,用来发送通知,然后点击通知可以打开Activity,当然我们也可以做其他的操作。
public class UploadWorker extends Worker {
public UploadWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@RequiresApi(api = Build.VERSION_CODES.O)
@NonNull
@Override
public Result doWork() {
Log.e("workmanager","UploadWorker dowork");
NotificationChannel channel = new NotificationChannel("1","study", NotificationManager.IMPORTANCE_HIGH);
NotificationManager manager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);
Intent intent = new Intent(getApplicationContext(), WorkManagerTestActivity.class);
intent.setPackage("com.example.jetpacktest");
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),1,intent,PendingIntent.FLAG_UPDATE_CURRENT);
Icon icon = Icon.createWithResource(getApplicationContext(),R.mipmap.address);
Notification.Action action = new Notification.Action.Builder(icon,"学习",pendingIntent)
.build();
Notification.Builder notification = new Notification.Builder(getApplicationContext(),"1").setSmallIcon(icon)
.addAction(action);
manager.notify(1,notification.build());
return Result.success();
}
}
然后在Activity中调用Worker
/**
* 使用workmanager
*/
public class WorkManagerTestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_work_manager_test);
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.NOT_REQUIRED)
.setRequiresBatteryNotLow(true).build();
PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(UploadWorker.class,300, TimeUnit.MILLISECONDS)
.setConstraints(constraints).build();
OneTimeWorkRequest workRequest1 = new OneTimeWorkRequest.Builder(UploadWorker.class).setConstraints(constraints)
.setInitialDelay(200,TimeUnit.MILLISECONDS)
.build();
OneTimeWorkRequest workRequest2 = new OneTimeWorkRequest.Builder(UploadWorker.class).setConstraints(constraints)
.setInitialDelay(400,TimeUnit.MILLISECONDS)
.build();
OneTimeWorkRequest workRequest3 = new OneTimeWorkRequest.Builder(UploadWorker.class).setConstraints(constraints)
.setInitialDelay(400,TimeUnit.MILLISECONDS)
.build();
WorkManager.getInstance(this).beginWith(workRequest1).then(workRequest2).then(workRequest3).then(workRequest3).enqueue();
WorkManager.getInstance(this).getWorkInfoByIdLiveData(request.getId())
.observe(this, new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
Log.e("workmanager","onchanged");
}
});
}
}
结果图:

11:23:15.691这个时间点时候,app并未被杀掉,这个时间点之后app才被杀掉,杀掉之后,等到了11:38:16.445这个时间,第二个Worker才开始启动,间隔了15min,所以也不是很及时的操作,但是完全是可以复活app的。
经过实际测试,直接杀掉app后,确实是能收到通知,但是存在一个问题,执行的时间是不确定的,关闭app之后,间隔15min才会调用Worker的doWork方法,因此肯定是要间隔一段时间才会重启app。

本文介绍了如何使用WorkManager在Android应用被杀死后仍能执行代码,例如发送通知并重新激活应用。通过创建Worker类并在Activity中调用,即使应用被杀掉,也能在一段时间后恢复执行。实测显示,虽然启动时间不固定,但确实能实现app的复活。然而,实际运行效果可能因设备和厂商而异。
4944

被折叠的 条评论
为什么被折叠?



