Android WorkManager让app保活

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

使用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。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值