Android-JobScheduler

使用JoeScheduler实现后台任务调度,替代AlarmManager快捷控制定时

原文地址

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

JobScheduler

JobScheduler是Job的调度类,负责执行,取消任务等逻辑,具体看下JobScheduler的获取和类代码。

 JobScheduler jobScheduler = (JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE)
  • 1
/*
*参数: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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

示例代码实现

在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);
                }
            }
        });
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

Mainfiest.xml中注册MyServcie

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

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

猜你喜欢

转载自blog.csdn.net/qxf5777404/article/details/78269591