需要使用闹钟管理器定期重新启动安卓设备。

3

我需要使用Alarm Manager来实现设备重启,我正在调用Intent,然后在Intent活动中使用重启函数。我的设备已经root过了。以下是我的代码:

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 消息。


你在logcat中收到任何消息了吗? - TheIT
1
我可以说问题是,在设备重新启动后,您的应用程序(以及您的BroadcastReceiver)未运行,因此无法处理下一个闹钟。相比之下,当您使用Toast时,您的应用程序没有被杀死,它仍在运行,因此仍在显示Toast。我找到的解决方案是在启动时运行一个Service来注册BroadcastReceiver,参考这里。我还没有测试过,但我相信这应该可以解决问题。 - Andrew T.
另外,我能否建议您在应用程序中添加一个按钮,该按钮也调用rebootDevice()方法,以确保它与BroadcastReceiver无关。 - TheIT
@AndrewT 当我在清单文件中处理后重启调用BroadcastReceiver时,由于它只包含重启方法,因此在启动设备后立即进行重启... - kumar Sudheer
2
你需要一个带有ACTION_BOOT_COMPLETED意图过滤器的额外 Service/BroadcastReceiver来注册(但不调用)你的AlarmReceiver - Andrew T.
@AndrewT. 是的,我正在按照你说的尝试,但我没有通过这种方式得到任何结果。您能否请编辑我的代码,根据您对此的想法进行修改? - kumar Sudheer
2个回答

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);
    }

希望这可以帮到您。

嗨,我们无法在另一个活动中调用设置闹钟函数,因为参数即targetCal是从该活动的onclick事件中获取的。 - kumar Sudheer
嗨,我无法在此活动中使用上下文获取该方法,请您帮我看一下以上的代码,谢谢。 - kumar Sudheer
重启后实际上标志为真,但arg1.getAction()获取到null,因此它不会进入循环,因此再次发生重启...为什么每次arg1.getAction()都获取到null。 - kumar Sudheer
你是否在清单文件中像下面这样注册了AlarmReceiver类,并使用intent-filter action_BOOT_COMPLETED?<receiver android:name="AlarmReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" > </action> </intent-filter> </receiver> - TheLittleNaruto
是的,我使用了这个。由于arg1.getAction()获取到了null值,设备再次重启而没有进入循环。我们能否在第一个类中对alarmmanager方法进行任何更改来解决这个问题? - kumar Sudheer
你得自己管理好你的代码,老兄!如果你想在什么情况下执行设备重启,我只是简单地调用了setAlarm()函数。你需要自己处理它。 - TheLittleNaruto

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

注册的警报在设备睡眠时保留(如果它们在此期间触发,则可以选择唤醒设备),但如果设备关闭并重新启动,则会被清除。

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

正如已经指出的那样,解决方案是在设备重新启动时注册一个引导接收器来重新配置闹钟。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接