需要使用警报管理器定期重启Android设备

时间:2013-12-27 03:50:57

标签: android android-intent android-alarms

我需要使用警报管理器以实用方式重新启动设备,我正在调用意图,而在意图活动中我正在使用重启功能,而我的设备已根植于其中。我的代码如下

public void onClick(View v) {
            Calendar calNow = Calendar.getInstance();
            Calendar calSet = (Calendar) calNow.clone();

            calSet.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
            calSet.set(Calendar.MINUTE, timePicker.getCurrentMinute());
            calSet.set(Calendar.SECOND, 0); 

            setAlarm(calSet, optRepeat.isChecked());
        }});    

    private void setAlarm(Calendar targetCal, boolean repeat){

    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS_1, intent, 0);
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis() , pendingIntent);

    if(repeat){
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,targetCal.getTimeInMillis(), 
                TimeUnit.MINUTES.toMillis(2),pendingIntent);

    }else{
        alarmManager.set(AlarmManager.RTC_WAKEUP,targetCal.getTimeInMillis(),pendingIntent);
    }
}

在AlarmReceiver.java中,我将代码构建为

public class AlarmReceiver extends BroadcastReceiver {

public void onReceive(Context context, Intent arg1) {
    Toast.makeText(context, "Alarm received!", Toast.LENGTH_LONG).show();
    rebootDevice();
}

在Manifest文件中,我的代码就像

    <activity android:name=".activity.RebootTimer" android:label="@string/app_name" android:theme="@android:style/Theme.Dialog" ></activity>
    <receiver android:name=".service.AlarmReceiver" />

首次我的设备正在重新启动,因为我的设备没有重新启动。当我通过隐藏重启功能保持Toast消息时,每个间隔都会显示Toast消息。

2 个答案:

答案 0 :(得分:1)

请注意,您必须检测设备的重新启动,并且必须再次在onRecieve功能中触发警报,如下所示:

修改

你应该自己尝试一下。无论如何,你可以在这里做:

public void onReceive(Context context, Intent arg1) {

boolean flag = Intent.ACTION_BOOT_COMPLETED.equals(arg1.getAction());

if(flag==true){
//call your set alarm function once again which you do in activity.
setAlarm(<Your Calendar time>, <your repeat boolean value>, context);

}else{

rebootDevice();


}

}

//make this function in your broadcast receiver class

private void setAlarm(Calendar targetCal, boolean repeat, Context ctx){

    Intent intent = new Intent(ctx, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, RQS_1, intent, 0);
    AlarmManager alarmManager = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis() , pendingIntent);

    if(repeat){
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,targetCal.getTimeInMillis(), 
                TimeUnit.MINUTES.toMillis(2),pendingIntent);

    }else{
        alarmManager.set(AlarmManager.RTC_WAKEUP,targetCal.getTimeInMillis(),pendingIntent);
    }

希望这会有所帮助。

答案 1 :(得分:0)

我只是想补充一下,正如@TheLittleNaruto和@Andrew T.指出的那样,问题在于,如文档中所示,当重启设备时,AlarmManager将清除所有警报:

  

设备处于睡眠状态时保留已注册的警报(并且可以   如果它们在那段时间内关闭,可以选择将设备唤醒),但是   如果关闭并重新启动,将被清除。

http://developer.android.com/reference/android/app/AlarmManager.html

正如已经指出的那样,解决方案是在设备重新启动时注册启动接收器以重新配置警报。