これは私のActivity
コードです。
Long time = new GregorianCalendar().getTimeInMillis()+20000;//Setting alarm after 20 sec
Intent intentAlarm = new Intent("alarm");
intentAlarm.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intentAlarm.putExtra("req_code",10);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,10, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
これらはすべて、アプリで持っている権限です。
<uses-permission Android:name="Android.permission.VIBRATE" />
<uses-permission Android:name="Android.permission.INTERNET"/>
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission Android:name="Android.permission.GET_ACCOUNTS"/>
<uses-permission Android:name="com.myapp.pack.permission.SET_ALARM"/>
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
これは私のBroadcastReceiver
コードです。
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences sharedPreferences =
context.getSharedPreferences( "mydata", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("elligible",true);
editor.apply();
}
マニフェストにBroadcastReceiver
を登録しました。
<receiver Android:name="com.myapp.pack.AlarmReciever" Android:enabled="true">
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED" />
<action Android:name="alarm" />
</intent-filter>
</receiver>
上記のコードは、バックグラウンドでマシュマロ以前のデバイスでBroadcastReceiver
を正常に実行しますが、マシュマロデバイスでは、BroadcastReceiver
は実行されません。ここで何が起こっているのか誰か知っていますか?ありがとう。
試してみることができることがいくつかあります。これらを組み合わせて使用すると、すべてのアイドル/スタンバイ/ドーズモードを切り抜けることができます(OSのバージョンに関係なく)。
1。通常のWakefulBroadcastReceiver
の代わりに BroadcastReceiver
を使用します。正しく使用するには、 _WAKE_LOCK
_ 権限が含まれていることを確認してください。
2。setExactAndAllowWhileIdle()
メソッド(API 23以降)を使用してIntent
レシーバーの場合:
_if(Build.VERSION.SDK_INT < 23){
if(Build.VERSION.SDK_INT >= 19){
setExact(...);
}
else{
set(...);
}
}
else{
setExactAndAllowWhileIdle(...);
}
_
参照:
理由は Doze mode in Android6.0Marshmallow。Use setAlarmclock()set()
。目覚まし時計用に特別に設計されており、居眠りをカットできる場合があります。手動で電話を居眠りモードまたはアプリスタンバイモードにするために使用できるadbコマンドがいくつかあります。
https://developer.Android.com/preview/features/power-mgmt.html
それでもアプリをウェイクアップできない場合は、surefireメソッドがあります setExactAndAllowWhileIdle() は、何があっても電話を居眠りからウェイクアップするように設計されています。最悪のシナリオでは、この方法でアプリをウェイクアップし、ウェイクアップを使用して次のアラームをスケジュールできます。
私の実験では、AlarmManagerCompat + setAlarmClockは安定しており、居眠りモードでウェイクアップします。 MIUIを使用したxiaomiデバイスを使用しています。
AlarmManagerCompat.setAlarmClock(alarmManager, time, showIntent, pendingIntent)