Android BroadcastListener重启循环

时间:2016-06-07 16:45:39

标签: java android broadcastreceiver alarmmanager android-broadcastreceiver

我正在尝试实现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>

1 个答案:

答案 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);