Wakelock、AlarmManager、JobScheduler实例分析

后台定时唤醒App做指定任务实例

public class MainActivity extends Activity implements View.OnClickListener {

    private Button btnStartalarm;

    private SyncDataRecevier mSyncDataRecevier = new SyncDataRecevier();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnStartalarm = (Button)findViewById(R.id.btn_startalarm);
        btnStartalarm.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_startalarm:
                mSyncDataRecevier.setAlarm(this);
                break;
        }
    }

    public void stopAlarm(View view){
        mSyncDataRecevier.cancelAlarm(this);
    }

}

上面的这个实例是一个经典的用AlarmManager的过程,可以看到我们甚至可以在应用休眠的时间执行代码,唤醒CPU,那说明它一定用到了WakeLock锁。可以注意到我们用了WakefulBroadcastReceiver这个新的广播接收者。

分析代码可以知道这个这个Recevier里面有PowerManager.WakeLock,也就是说当AlarmManager被激活后,它会唤起一个PendingIntent。而这个PendingIntent会唤醒这个SyncDataRecevier,这个SyncDataRecevier会拥有CPU锁60s,也就是说,我们的任务应该在60s内完成,为什么非要加这个SyncDataRecevier,虽然我们有AlarmManager可以被执行,但是如果此时AP处理器正在休眠,它依然无法执行代码,也就是说,我们BP是一直是活着的,到一个点之后,它想办法唤醒AP才能执行代码。

JobScheduler在指定规则下执行任务

Last updated

Was this helpful?