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

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

JobScheduler

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

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

JobService

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

/*
*须要重写,開始jobScheduler的方法
*/
public abstract boolean onStartJob(JobParameters params); /*
*停止JobScheduler的方法
*/
public abstract boolean onStopJob(JobParameters params); /*
*完毕JobScheduler的方法
*/
public final void jobFinished(JobParameters params, boolean needsReschedule) {
ensureHandler();
Message m = Message.obtain(mHandler, MSG_JOB_FINISHED, params);
m.arg2 = needsReschedule ? 1 : 0;
m.sendToTarget();
}

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

JobInfo

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

演示样例代码实现

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

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.btn);
button.setText(getClass().getSimpleName());
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(getPackageName(), MyJobService.class.getName()))
.setPeriodic(2000)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build();
jobScheduler.schedule(jobInfo);
}
}
});
}
}

MyService类

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)//API须要在21及以上
public class MyJobService extends JobService { private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
Toast.makeText(MyJobService.this, "MyJobService", Toast.LENGTH_SHORT).show();
JobParameters param = (JobParameters) msg.obj;
jobFinished(param, true);
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return true;
}
}); @Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
} @Override
public boolean onStartJob(JobParameters params) {
Message m = Message.obtain();
m.obj = params;
handler.sendMessage(m);
return true;
} @Override
public boolean onStopJob(JobParameters params) {
handler.removeCallbacksAndMessages(null);
return false;
}
}

Mainfiest.xml中注冊MyServcie

    <service
android:name=".MyJobService"
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. LuoguP3356 火星探险问题(费用流)

    题目描述 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车.登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动.探测车在移动中还必须采集岩石标本.每一块岩石标本由最先遇到它的探测 ...

  2. SpringMVC框架中的异常解析器-ExceptionHandler和HandlerExceptionResolver

    SpringMVC框架中,处理异常还是挺方便的,提供了一个异常解析器. 处理局部异常 @Controller public class AccessController { /** * 处理这个Con ...

  3. Windows学习总结(4)——Host文件的作用和如何修改Host文件

    本经验将为您介绍,什么是Host文件,Host文件作用,Host文件的位置等信息,以帮忙您了解Host文件. 方法/步骤 什么是HOST文件: Hosts是一个没有扩展名的系统文件,其基本作用就是将一 ...

  4. 洛谷——P2093 零件分组

    https://www.luogu.org/problem/show?pid=2093 题目描述 某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(Wi).现在为了加工需要,要将它们分成若 ...

  5. 洛谷 P1105 平台

    P1105 平台 题目描述 空间中有一些平台.给出每个平台的位置,请你计算从每一个平台的边缘落下之后会落到哪一个平台上.注意,如果某两个平台的某个两边缘横坐标相同,物体从上面那个平台落下之后将不会落在 ...

  6. Android获取当前连接的wifi名称

    首先AndroidMainfest.xml文件里加入权限: <uses-permission android:name="android.permission.ACCESS_NETWO ...

  7. Java IO:SocketChannel和Selector在ZooKeeper中应用

    转载请注明出处:jiq•钦's technical Blog 假设不了解SocketChannel和Selector.请先阅读我的还有一篇博文:点击打开链接 ZooKeeper的启动从QuorumPe ...

  8. theme- 工作原理

    首先看一下theme中的设置,代码如下 <?xml version="1.0" encoding="utf-8"?> <resources&g ...

  9. [NOI.AC#30]candy 贪心

    链接 一个直观的想法是,枚举最小的是谁,然后二分找到另外一个序列对应位置更新答案,复杂度 \(O(NlogN)\) 实际上不需要二分,因为每次当最大的变大之后,原来不行的最小值现在也一定不行,指针移动 ...

  10. thinkphp杂项功能(主干)

    thinkphp杂项功能(主干) 一.总结 1.杂项功能:杂项里面我需要有点印象的是五个:缓存,多语言,图像处理,文件处理,单元测试 二.thinkphp杂项功能(主干) thinkphp扩展杂项功能 ...