启动服务之后就可以看到效果。
当手机处于Doze模式的时候(Android6.0开始,用户长时间不用时会进入Doze模式),Alarm任务会变得不准时,此时调用AlarmManager的setAndAllowWhileIdle()或setExact-AndAllowWhileIdle()方法就可以在Doze模式下正常执行了。这两个方法的区别和set() setExact()的方法之间的区别是一样的。
package com.example.a13_alarmtest;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;
import android.widget.Toast;
public class MyAlarmService extends Service {
long triggerAtTime;
public MyAlarmService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public int onStartCommand(Intent intent,int flags,int startId){
new Thread(new Runnable() {
@Override
public void run() {
// Toast.makeText(MyApplication.getContext(),"gggggg",Toast.LENGTH_SHORT).show();
Log.d("sun","gggggggggggg"+triggerAtTime);
}
}).start();
AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);
int anHour = 5 * 1000;
//SystemClock.elapsedRealtime()是获取到系统开机至今所经历时间的毫秒数
triggerAtTime = SystemClock.elapsedRealtime()+anHour;
Intent i = new Intent(this,MyAlarmService.class);
PendingIntent pi = PendingIntent.getService(this,0,i,0);
manager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pi);
return super.onStartCommand(intent,flags,startId);
}
}