13

これは私の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>

上記のコードは、BroadcastReceiverMarshMallow 以前のデバイスではバックグラウンドで正常に実行されますが、MarshMallow デバイスではBroadcastReceiver実行されません。ここで何が起こっているのか知っている人はいますか?ありがとう。

4

3 に答える 3

26

いくつかの方法を試すことができます。これらを組み合わせて使用​​すると、(OS のバージョンに関係なく) アイドル/スタンバイ/居眠りモードのすべてを切り抜けることができます

1.WakefulBroadcastReceiver通常の の代わりに a を使用しますBroadcastReceiverWAKE_LOCK正しく使用するための許可が含まれていることを確認してください。

2.メソッド (API 23 以降) を使用して、レシーバーのsetExactAndAllowWhileIdle()スケジュールを設定します。Intent

if(Build.VERSION.SDK_INT < 23){
    if(Build.VERSION.SDK_INT >= 19){
        setExact(...);
    }
    else{
        set(...);
    }
}
else{
    setExactAndAllowWhileIdle(...);
}

参考文献:

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

2. バックグラウンド作業、アラーム、および Android アプリのフローチャート

于 2015-12-20T10:24:08.670 に答える
7

その理由は、Android 6.0 Marshmallow で導入されたDoze モードにある可能性があります。の代わりにsetAlarmclock()を使用してくださいset()。目覚まし時計用に特別に設計されており、居眠りを切り抜けることができる場合があります。電話を手動で居眠りモードまたはアプリ スタンバイ モードにするために使用できる adb コマンドがいくつかあります。

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

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

参考: Android 6.0のDozeモードでAlarm Managerを動作させるには?

于 2015-12-20T07:13:43.643 に答える