需要root权限,放在系统中编译
public static final String ACTION_THREE_CLOCK_REBOOT = "ACTION_THREE_CLOCK_REBOOT";
public static final String ACTION_TIME_SET = "android.intent.action.TIME_SET";
/**
* 3 clock
*/
public void start3Clock(Context context) {
AlarmManager mg = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent mFifteenIntent = new Intent(ACTION_THREE_CLOCK_REBOOT);
PendingIntent p = PendingIntent.getBroadcast(context,
0, mFifteenIntent,PendingIntent.FLAG_UPDATE_CURRENT);
long systemTime = System.currentTimeMillis();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 3);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long selectTime = calendar.getTimeInMillis();
/**如果超过今天的3点,那么定时器就设置为明天3点*/
if (systemTime > selectTime) {
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String selectStr = sdf.format(new Date(calendar.getTimeInMillis()));
Log.i(TAG, "selectStr 3 clock : " + selectStr);
long clockTime = SystemClock.elapsedRealtime();
Log.i(TAG, "selectStr 3 clock : " + (clockTime + calendar.getTimeInMillis() - systemTime) / 1000);
/**RTC_SHUTDOWN_WAKEUP 使用标识,系统进入深度休眠还唤醒*/
mg.setRepeating(AlarmManager.RTC_SHUTDOWN_WAKEUP,clockTime + calendar.getTimeInMillis() - systemTime,AlarmManager.INTERVAL_DAY,p);
}
动态广播的注册和接收
private BroadcastReceiver mReceiver;
/**广播初始化*/
private void initReceiver() {
mReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_THREE_CLOCK_REBOOT);
filter.addAction(ACTION_TIME_SET);
registerReceiver(mReceiver, filter);
}
private void unRegitsterReceiver(){
unregisterReceiver(mReceiver);
}
/**receiver 内部类*/
class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(TextUtils.equals(action,ACTION_THREE_CLOCK_REBOOT)){
/**重启机子*/
reboot();
} else if (TextUtils.equals(action, ACTION_TIME_SET)) {
/**修改时间后,重新设置定时器*/
start3Clock(context)
}
}
}
重启机子
public static void reboot() {
try {
Log.i(TAG, "reboot");
Runtime.getRuntime().exec("am start -a android.intent.action.REBOOT");
} catch (Exception e) {
}
}
需要权限
<uses-permission android:name="android.permission.REBOOT"/>