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

}

電話がオンになっているとき、アラームは正常に機能します。

私に何ができる?

ありがとうございました!

4

3 に答える 3

7

ええ、問題は電話が再起動したときにアプリが実行されていないことです。BOOT_COMPLETEDメッセージを受信できるBroadcastReceiverを登録して、電話の再起動時にメッセージを受信できるようにする必要があります。次に、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>
于 2012-09-02T05:31:59.177 に答える
4

電話の電源を切って再起動するとアラームはクリアされますが、BOOT_COMPLETEDを受信できるBroadcastReceiverを使用してアラームを開始できます

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

  }

}

于 2015-07-10T20:49:47.083 に答える
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" }
}

これは、次の場所にあるデフォルトの時計アプリのAndroidソースコードからコピーされます。DeskClock/src/com/android/deskclock/alarms/AlarmStateManager.java

ソースコードでこの関数を検索し、同様にどのように機能するかを確認します。基本的に、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関数を呼び出します。今からアラームを鳴らすまでの時間をミリ秒単位で指定します。たとえば、2分で:

 setPowerOffAlarm(context, 120000)
于 2022-01-29T15:30:28.087 に答える