当手机关闭时如何使用AlarmManager - ANDROID

7

我正在制作一个警报系统,但遇到一个问题,当手机关闭时警报不会响。

我是按照以下方式设置警报的:

    public void doIntents(Context context, long milis, Tratam trat){
    cal=Calendar.getInstance();
    alarmManager = (AlarmManager) context.getSystemService(Service.ALARM_SERVICE);

    cal.setTimeInMillis(milis);
    Intent intent = new Intent(context, OnAlarmReceiver.class);


    pendingIntent = PendingIntent.getBroadcast(context, trat.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager.set(AlarmManager.RTC_WAKEUP,milis ,pendingIntent);

}

手机开机时,闹钟可以正常运行。

我应该怎么办呢?

谢谢!


1
你希望它做什么?是在手机重新开机时打开手机还是触发闹钟? - ta.speot.is
即使手机关机,我也希望闹钟能响起。 - Héctor Ortiz
2
这是不可能的,因为它是Linux系统,它在这方面的行为就像你的Linux桌面一样。 - nandeesh
3个回答

8

是的,问题在于您的应用程序在电话重新启动时无法运行。您需要注册一个BroadcastReceiver,可以接收BOOT_COMPLETED消息,以便在手机重新启动时接收消息。然后,在BroadcastReceiver中,您可以重新安排这些闹钟或其他操作。但我认为您无法做任何关于在手机关闭时触发闹钟的事情(例如使手机开机)。

<receiver android:name="MyBootReceiver"
        android:enabled="true"
        android:exported="true"
        android:label="BootReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"></action>

        </intent-filter>
    </receiver>

谢谢,我知道..但是..安卓闹钟是如何工作的?它不使用AlarmManager吗? - Héctor Ortiz
3
据我理解,手机关闭时无法发出声音。 - LuxuryMode
8
当设备完全关机、电池被拆除或被大锤砸坏时,设备上的任何东西都不会运行。 - CommonsWare
10
是的,安卓设备可以播放音乐、流媒体视频、定位到你的位置准确到米级、发送电子邮件、拍摄照片/视频等。但诺基亚1100甚至在关机状态下也能触发闹钟,所以......比安卓好多了。 - LuxuryMode
3
当手机关机时,Android同样可以触发闹钟响起。你可以尝试设置一个闹钟,手机会自动开机。问题是,我该如何自己实现呢? - Juan José Melero Gómez
显示剩余5条评论

4

当手机关闭并重新启动时,闹钟会被清除,但您可以使用BroadcastReceiver启动闹钟,该接收器可以接收BOOT_COMPLETED。

In Manifest.xml:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  <application ...>
 <receiver android:name="com.example.receiver.AlarmMonitorReceiver"
              android:enabled="true"
              android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
</application>

Java:

public class AlarmMonitorReceiver extends BroadcastReceiver{
  public void onReceive(Context context,Intent intent) { 
    if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
      AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
      Intent intentAlarm = new Intent(context, ExampleReceiver.class); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentAlarm, 0);
      Calendar time = Calendar.getInstance();
      time.setTimeInMillis(System.currentTimeMillis());
      time.add(Calendar.SECOND, 10);
      alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),10000,pendingIntent);         
    }  

  }

}


1
您可以使用以下类似的内容:

您可以像下面这样使用:

private val ACTION_SET_POWEROFF_ALARM = "org.codeaurora.poweroffalarm.action.SET_ALARM"
private val ACTION_CANCEL_POWEROFF_ALARM = "org.codeaurora.poweroffalarm.action.CANCEL_ALARM"
private val POWER_OFF_ALARM_PACKAGE = "com.qualcomm.qti.poweroffalarm"
private val TIME = "time"

private fun setPowerOffAlarm(context: Context, timeInMillis: Long) {
    val intent = Intent(ACTION_SET_POWEROFF_ALARM)
    intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
    intent.setPackage(POWER_OFF_ALARM_PACKAGE)
    val rightNow = Calendar.getInstance()

    rightNow.set(Calendar.SECOND, 0);
    rightNow.set(Calendar.MILLISECOND, 0);

    intent.putExtra(TIME, rightNow.timeInMillis + timeInMillis)

    context.sendBroadcast(intent)
    Log.i { "PWR STATE: pwr off Alarm is set" }
}

这是从位于DeskClock/src/com/android/deskclock/alarms/AlarmStateManager.java的默认时钟应用程序的Android源代码中复制的。
在源代码中搜索此函数并查看它们如何执行类似操作。我们基本上向com.qualcomm.qti.poweroffalarm包发送广播,该包将创建一个关机闹钟,就像您在DeskClock应用程序中所做的那样。
如果我们查看com.qualcomm.qti.poweroffalarm的反编译源代码,我们会发现清单声明大致如下:
    <receiver android:name="com.qualcomm.qti.poweroffalarm.PowerOffAlarmDialog$ShutDownReceiver" android:permission="org.codeaurora.permission.POWER_OFF_ALARM">
        <intent-filter>
            <action android:name="org.codeaurora.poweroffalarm.action.ALARM_POWER_OFF"/>
        </intent-filter>
    </receiver>

这意味着我们需要此权限,以便qcom包接受广播的意图。因此,我们在AndroidManifest.xml文件中进行了设置:
<uses-permission android:name="org.codeaurora.permission.POWER_OFF_ALARM" />

然后也请求它:

    private val PERMISSION_POWER_OFF_ALARM = "org.codeaurora.permission.POWER_OFF_ALARM"

private val CODE_FOR_ALARM_PERMISSION = 1

        if (ContextCompat.checkSelfPermission(this, PERMISSION_POWER_OFF_ALARM)
        != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
            arrayOf(PERMISSION_POWER_OFF_ALARM), CODE_FOR_ALARM_PERMISSION);
    }

最后我们想要调用SetAlarm函数。我们指定从现在起到闹钟响起的时间,以毫秒为单位。例如,在两分钟内:

 setPowerOffAlarm(context, 120000)

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