我正在尝试实现Android手机每天凌晨4:30重启的功能。为了实现这一点,我使用的是带有作为系统运行的应用程序的root电话。重新启动可以正常工作,但是每次应用程序在启动时再次启动时,它会立即重新启动。
MainActivity.java
// Set the time for the nightly reboot
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 4);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
// Schedule the nightly reboot
Intent rebootIntent = new Intent(this, NightlyReboot.class);
PendingIntent pendingRebootIntent = PendingIntent.getBroadcast(this, 0, rebootIntent, 0);
manager.setRepeating(RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingRebootIntent);
NightlyReboot.java
public class NightlyReboot extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
pm.reboot("Nightly Reboot");
}
}
的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.theoomf.hotspot">
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="10" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.REBOOT"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".WatchDog"
android:enabled="true"
android:exported="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<receiver android:name=".NightlyReboot"
android:permission="android.permission.REBOOT"/>
</application>
答案 0 :(得分:0)
我明白了。应该更好地阅读Android文档。由于我将开始时间设置为过去的时间,如果应用程序启动时凌晨4:30过去,它将根据Android文档立即向接收方发送广播。修改为以下内容以解决问题。
// Set the time for the nightly reboot to 4:30am.
Calendar rebootTime = Calendar.getInstance();
rebootTime.set(Calendar.HOUR_OF_DAY, 4);
rebootTime.set(Calendar.MINUTE, 30);
rebootTime.set(Calendar.SECOND, 0);
rebootTime.set(Calendar.MILLISECOND, 0);
// If reboot time is in the past then add 1 day.
if (rebootTime.before(Calendar.getInstance())) {
rebootTime.add(Calendar.DATE, 1);
}
// Schedule the nightly reboot
Intent rebootIntent = new Intent(this, NightlyReboot.class);
PendingIntent pendingRebootIntent = PendingIntent.getBroadcast(this, 0, rebootIntent, 0);
manager.setRepeating(RTC_WAKEUP, rebootTime.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingRebootIntent);