JobService和JobScheduler机制在Android5.0以上保活
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还有待深入。这里推荐几篇比較好的博客。
- 顶
- 5
- 踩
- 0
- 个人资料
- 訪问:307553次
- 积分:5290
- 等级:
- 排名:第5924名
- 原创:232篇
- 转载:7篇
- 译文:2篇
- 评论:55条
- 博客专栏
设计模式
文章:23篇 阅读:7545 |
图解HTTP读书笔记
文章:10篇 阅读:6366 |
- 文章搜索
- 文章分类
- 文章存档
-
阅读排行
- android studio生成签名文件。以及SHA1和MD5值(20691)
- DataBinding的基本使用(一)(11672)
- Android 6.0在执行时申请权限解释与实例(10853)
- JobService和JobScheduler机制在Android5.0以上保活(10790)
- MYSQL数据库语句之多表操作(三)(8425)
- Android中使用GPS和NetWork获取定位信息(8362)
- Android Studio gradle配置具体解释(8354)
- DataBinding的基本使用(五)(7369)
- Android应用图标上的小红点Badge实现(6738)
- Toolbar和Menu的结合(6284)
- 评论排行
- 最新评论
-
Android 6.0在执行时申请权限解释与实例
lin_dianwei: 封装了一个动态申请权限的简洁优雅方式。这样更简单http://blog.csdn.net/lin_d...
-
Android 6.0在执行时申请权限解释与实例
lin_dianwei: 封装了一个动态申请权限的简洁优雅方式。这样更简单http://blog.csdn.net/lin_d...
-
Android ORM框架介绍之greenDao注解及加密(三)
SnowWitch: 加密后别人直接把数据库拷贝出去。是不是看不到数据?还有就是不是非常理解怎么加密
-
TextView的textIsSelectable属性和setMovementMethod()
Fight_destiny: 大佬,MovementMethod怎么写的,你的博客里面图片都没有了,看不到,急求急求......
-
Android ORM框架介绍之greenDao封装(二)
qq_29645511: 0.0
-
Android中使用GPS和NetWork获取定位信息
qq_34383952: gps定位点击没反应
-
Android应用图标上的小红点Badge实现
xhq456: 怎么成功过一次,就再也没显示过。在小米手机上
-
ThreadPoolExecutor中的submit()方法具体解说
qq_33689414: @abcjinzi:写的不太好。见笑了
-
ThreadPoolExecutor中的submit()方法具体解说
abcjinzi: 有点虎头蛇尾哦
-
Python爬虫之静态页面爬取
ximmenqing: 你这个获取出来的url没实用的啊