web-dev-qa-db-ja.com

Android 6.0では、アラームマネージャーがバックグラウンドで機能しません

これは私の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は実行されません。ここで何が起こっているのか誰か知っていますか?ありがとう。

12
Parag Kadam

試してみることができることがいくつかあります。これらを組み合わせて使用​​すると、すべてのアイドル/スタンバイ/ドーズモードを切り抜けることができます(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(...);
}
_

参照:

1。バックグラウンドサービスのアラームマネージャ

2。バックグラウンド作業、アラーム、およびAndroid app

23
Y.S

理由は Doze mode in Android6.0Marshmallow。Use setAlarmclock()set()。目覚まし時計用に特別に設計されており、居眠りをカットできる場合があります。手動で電話を居眠りモードまたはアプリスタンバイモードにするために使用できるadbコマンドがいくつかあります。

https://developer.Android.com/preview/features/power-mgmt.html

それでもアプリをウェイクアップできない場合は、surefireメソッドがあります setExactAndAllowWhileIdle() は、何があっても電話を居眠りからウェイクアップするように設計されています。最悪のシナリオでは、この方法でアプリをウェイクアップし、ウェイクアップを使用して次のアラームをスケジュールできます。

参照:DozeモードでAndroid 6.0の場合にアラームマネージャーを機能させる方法は?

7
Shahzeb

私の実験では、AlarmManagerCompat + setAlarmClockは安定しており、居眠りモードでウェイクアップします。 MIUIを使用したxiaomiデバイスを使用しています。

AlarmManagerCompat.setAlarmClock(alarmManager, time, showIntent, pendingIntent)
0
wiz165