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

JobService和JobScheduler机制在Android5.0以上保活 我们知道在Android5.0之前,Android源代码还是有不小漏洞的,导致很多不光明的手段来进行 ++保活++ 。但是在Android5.0之后,很多都是可以被APP杀死的。Android5.0之后Android提供了JobService和JobSchedu

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 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

android:permission="android.permission.BIND_JOB_SERVICE">

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

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

Android之JobScheduler运行机制源码分析

在Android 5.0中使用JobScheduler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值