JobService和JobScheduler机制在Android5.0以上保活

我们知道在Android5.0之前,Android源代码还是有不小漏洞的,导致非常多不光明的手段来进行++保活++。但是在Android5.0之后。非常多都是能够被APP杀死的。Android5.0之后Android提供了JobService和JobScheduler这两的类。我们能够通过这个JobScheduler来进行保活。

JobScheduler

JobScheduler是Job的调度类。负责运行。取消任务等逻辑。详细看下JobScheduler的获取和类代码。

  1. JobScheduler jobScheduler = (JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE)
  1. /*
  2. *參数:JobInfo採用Builder的设计模式,对须要运行的Job任务信息进行的封装。
  3. *返回值:RESULT_SUCCESS=1 RESULT_FAILURE=0 表示运行成功或失败
  4. */
  5. public abstract int schedule(JobInfo job);
  6. /**通过指定的jobId取消Job任务*/
  7. public abstract void cancel(int jobId);
  8. /**取消全部的Job任务*/
  9. public abstract void cancelAll();
  10. /**获取全部的未运行的Job任务*/
  11. public abstract @NonNull List<JobInfo> getAllPendingJobs();
  12. /**获取指定的Job未运行的任务*/
  13. public abstract @Nullable JobInfo getPendingJob(int jobId);

JobService

JobService中的代码实现不多,内部使用AIDL + Handler的方式来传递消息,当中重要的就是这几个方法。

  1. /*
  2. *须要重写,開始jobScheduler的方法
  3. */
  4. public abstract boolean onStartJob(JobParameters params);
  5. /*
  6. *停止JobScheduler的方法
  7. */
  8. public abstract boolean onStopJob(JobParameters params);
  9. /*
  10. *完毕JobScheduler的方法
  11. */
  12. public final void jobFinished(JobParameters params, boolean needsReschedule) {
  13. ensureHandler();
  14. Message m = Message.obtain(mHandler, MSG_JOB_FINISHED, params);
  15. m.arg2 = needsReschedule ? 1 : 0;
  16. m.sendToTarget();
  17. }

在JobService中,这几个方法都是通过Handler发送Message。在Handler中调用了IJobCallback的底层的实现。

JobInfo

  1. // jobId每一个Job任务的id
  2. int jobId = 1;
  3. // 指定你须要运行的JobService
  4. ComponentName name = new ComponentName(getPackageName(), MyJobService.class.getName()));
  5. JobInfo.Builder builder = new JobInfo.Bulider(jobId, name);
  6. builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE); //设置须要的网络条件,默认NETWORK_TYPE_NONE
  7. builder.setPeriodic(3000);//设置间隔时间
  8. builder.setMinimumLatency(3000);// 设置任务运行最少延迟时间
  9. builder.setOverrideDeadline(50000);// 设置deadline,若到期还没有达到规定的条件则会開始运行
  10. builder.setRequiresCharging(true);// 设置是否充电的条件,默认false
  11. builder.setRequiresDeviceIdle(false);// 设置手机是否空暇的条件,默认false
  12. builder.setPersisted(true);//设备重新启动之后你的任务是否还要继续运行
  13. JobInfo info = builder.build();

演示样例代码实现

在MainActivity中运行JobScheduler的scheduler()方法

  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. Button button = (Button) findViewById(R.id.btn);
  7. button.setText(getClass().getSimpleName());
  8. button.setOnClickListener(new View.OnClickListener() {
  9. @Override
  10. public void onClick(View v) {
  11. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  12. JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
  13. JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(getPackageName(), MyJobService.class.getName()))
  14. .setPeriodic(2000)
  15. .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
  16. .build();
  17. jobScheduler.schedule(jobInfo);
  18. }
  19. }
  20. });
  21. }
  22. }

MyService类

  1. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)//API须要在21及以上
  2. public class MyJobService extends JobService {
  3. private Handler handler = new Handler(new Handler.Callback() {
  4. @Override
  5. public boolean handleMessage(Message msg) {
  6. Toast.makeText(MyJobService.this, "MyJobService", Toast.LENGTH_SHORT).show();
  7. JobParameters param = (JobParameters) msg.obj;
  8. jobFinished(param, true);
  9. Intent intent = new Intent(getApplicationContext(), MainActivity.class);
  10. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  11. startActivity(intent);
  12. return true;
  13. }
  14. });
  15. @Override
  16. public int onStartCommand(Intent intent, int flags, int startId) {
  17. return START_STICKY;
  18. }
  19. @Override
  20. public boolean onStartJob(JobParameters params) {
  21. Message m = Message.obtain();
  22. m.obj = params;
  23. handler.sendMessage(m);
  24. return true;
  25. }
  26. @Override
  27. public boolean onStopJob(JobParameters params) {
  28. handler.removeCallbacksAndMessages(null);
  29. return false;
  30. }
  31. }

Mainfiest.xml中注冊MyServcie

  1. <service
  2. android:name=".MyJobService"
  3. android:permission="android.permission.BIND_JOB_SERVICE">

在大多数Android5.0以上手机杀死APP进程后,仍然能够唤醒,手机重新启动在部分手机但是能够唤醒APP的。

JobScheduler还有待深入。这里推荐几篇比較好的博客。

Android之JobScheduler运行机制源代码分析

在Android 5.0中使用JobScheduler

5
0

JobService和JobScheduler机制在Android5.0以上保活的更多相关文章

  1. Android5.0和Android6.0适配

    gradle配置项 compileSdkVersion 用哪个 Android SDK 版本编译你的应用.因此我们强烈推荐总是使用最新的 SDK 进行编译.在现有代码上使用新的编译检查可以获得很多好处 ...

  2. android5.0联系人 sort_key改成phonebook_label

    项目中用到了联系人根据字母排序,在android4.0手机上是可以的,但是在android4.4以上的手机排序是乱的,一般字母排序都是根据sort_key这个拼音进行排序,而android5.0这个字 ...

  3. ANdroid5.0不能隐式启动service,必须显示,解决办法,加服务端包名

    Intent intent = new Intent(); intent.setAction("com.viaembedded.veonvif.RemoteService");// ...

  4. 一个Activity掌握Android5.0新控件 (转)

    原文地址:http://blog.csdn.net/lavor_zl/article/details/51279386 谷歌在推出Android5.0的同时推出了一些新控件,Android5.0中最常 ...

  5. android5.0 编译

    android5.0编译需要jdk1.7版本,将来本地可能需要同时维护两套jdk版本,请参考: 在线安装openjdk1.7 sudo apt-get install openjdk-7-jre op ...

  6. Eclipse搭建Android5.0应用开发环境 “ndk-build”:launchingfailed问题解决

    Eclipse搭建Android5.0应用开发环境 "ndk-build":launchingfailed问题解决 详细参考http://blog.csdn.net/loongem ...

  7. 友情提醒:欲开发android5.0以上应用,请全部更新开发工具至最新

    周末帮人完成一个项目,android5.0以上版本,谁知道被开发工具折腾的死去活来.我的开发环境是adt-bundle-windows-x86-20140702.zip版本,也是目前能找到的adt-b ...

  8. Android Material Design Ripple Effect在Android5.0(SDK=21)以下Android版本崩溃问题解决

    Android Material Design Ripple Effect在Android5.0(SDK=21)以下Android版本崩溃问题解决 附录1的Android Ripple Effect水 ...

  9. ANDROID5.0触摸屏校准

    1.校准原理: 1)首先生成校准用的参数,可以适用tslib生成校准参数,也可以使用校准app生成:使用校准app进行校准对使用者要求比较低,使用者可以不用学习复杂的命令:本文使用app方式 2)生成 ...

随机推荐

  1. 通过 chroot 重新设置 root 密码

    实例:通过 chroot 重新设置 root 密码 忘记了 root 密码该怎么办?接下来的 demo 将演示如何通过 chroot 命令重新设置 centos7 中被忘记了的 root 密码.sys ...

  2. CMDB学习之五服务端api

    服务端api 对发送来的数据进行处理,并返回结果,首先要创建一个Django项目 第一步,就是写URL路由在分支中写url api 主路由 from django.conf.urls import u ...

  3. Objective-C ,ios,iphone开发基础:UIAlertView使用详解

    UIAlertView使用详解 Ios中为我们提供了一个用来弹出提示框的类 UIAlertView,他类似于javascript中的alert 和c#中的MessageBox(); UIAlertVi ...

  4. Hyperic

    https://my.oschina.net/hyperichq/blog/525590

  5. 洛谷 P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...

  6. RGB 颜色空间转 HSI 颜色空间的matlab程序实现

    RGB 颜色空间转 HSI 颜色空间的matlab程序实现 2014.10.20之前的内容有误,这里依据wikipedia更新了算法内容. 算法以wiki为准 https://en.wikipedia ...

  7. ArcGIS Api For Flex 动态画点和线

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  8. Windows 下 Sublime Text 默认打开方式问题解决办法

    Sublime Text 2 是很受ACMer喜爱的文本编辑器 但是绿色版删除后无法设置为默认打开方式...而且网上也没有给出明确的解决办法 注册表的解决办法: 删除 HKEY_CURRENT_USE ...

  9. Python Unittest模块测试执行

    记录一下Unittest的测试执行相关的点 一.测试用例执行的几种方式 1.通过unittest.main()来执行测试用例的方式: if __name__ == "__main__&quo ...

  10. html中的瀑布流是什么

    html中的瀑布流是什么 一.总结 1.瀑布流: 从左往右排列,哪一列现在的总高度最小,就优先排序把item(单元格)放在这一列.这样排完所有的单元格后,可以保证每一列的总高度都相差不大 2.看效果图 ...