Android定时关机,定时重启。这个需求主要分为两部分1.定时2.关机/重启。定时直接使用系统的定时服务(AlarmManager);关机/重启虽然系统提供了相应的api,但是该api只对系统级的应用开放,普通的应用无法使用。使用此api需要把app打包成系统应用,因此开关机功能只能在一些定制的系统中使用。
打包成系统应用方式:
1.系统对应的公钥文件platform.pk8和私钥文件platform.x509.pem以及签名工具signapk.jar;
2.将需要打包的apk和第一步里面提到的三个文件放到统一个文件夹下;
3.打开cmd进入第二步里的文件夹下执行命令:java -jar signapk.jar platform.x509.pem platform.pk8 app-release.apk new.apk
如果满足上面的条件就可以轻松实现(定时)关机重启的功能了
关机:
Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
//是否显示关机提示dialog,true显示false不显示直接关机
intent.putExtra("android.intent.extra.KEY_CONFIRM", true);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
定时关机:
Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
//是否显示关机提示dialog,true显示false不显示直接关机
intent.putExtra("android.intent.extra.KEY_CONFIRM", true);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//获取闹钟的id,给定时设置一个随机id,这样可以设置多个定时器,否则会被覆盖掉
int alarmId = getIntRandom();
long intervalMillis = 24 * 3600 * 1000;
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, alarmId, intent, 0);
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
//设置重复定时,intervalMillis重复定时的间隔时间。根据自己的需求来设置定时
manager.setRepeating(AlarmManager.RTC_WAKEUP, time, intervalMillis, pi);
//设置一次定时,根据自己的需求来设置定时
//manager.set(AlarmManager.RTC_WAKEUP, time, pi);
重启:
Intent intent=new Intent(Intent.ACTION_REBOOT);
intent.putExtra("nowait", 1);
intent.putExtra("interval", 1);
intent.putExtra("window", 0);
sendBroadcast(intent);
定时重启:
Intent intent = new Intent(Intent.ACTION_REBOOT);
intent.putExtra("nowait", 1);
intent.putExtra("interval", 1);
intent.putExtra("window", 0);
//获取闹钟的id,给定时设置一个随机id,这样可以设置多个定时器,否则会被覆盖掉
int alarmId = getIntRandom();
long intervalMillis = 24 * 3600 * 1000;
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, alarmId, intent, 0);
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
//设置重复定时,intervalMillis重复定时的间隔时间。根据自己的需求来设置定时
manager.setRepeating(AlarmManager.RTC_WAKEUP, time, intervalMillis, pi);
//设置一次定时,根据自己的需求来设置定时
//manager.set(AlarmManager.RTC_WAKEUP, time, pi);
//manager.setExact(AlarmManager.RTC_WAKEUP, time, pi);
//set()和setExact()两种方法都是设置定时的,区别在于set()方法定时会有误差而setExact()是精确定时