在Android 6.0上,警报管理器无法在后台运行

时间:2015-12-20 07:05:03

标签: android android-intent android-broadcast android-alarms android-broadcastreceiver

这是我的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>

以上代码在后台成功执行MarshMallow之前设备上的BroadcastReceiver,但在MarshMallow设备上,BroadcastReceiver未执行。有谁知道这里会发生什么?感谢。

3 个答案:

答案 0 :(得分:23)

有几件事你可以尝试,当协同使用时,应该能够切断所有空闲/待机/打盹模式(无论操作系统版本如何)。

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。 Alarm manager for background services

2。 A flowchart for background work, alarms, and your Android app

答案 1 :(得分:7)

原因可能是在Android 6.0 Marshmallow中引入Doze mode。使用setAlarmclock()代替set()。它专为闹钟而设计,可能能够通过打瞌睡。您可以使用一些adb命令手动将手机置于打盹或应用待机模式:

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

如果无法唤醒你的应用程序,那么肯定的方法setExactAndAllowWhileIdle()旨在将手机从打瞌睡中唤醒,无论如何。最糟糕的情况是,您可以使用此方法唤醒您的应用程序并使用唤醒来安排下一个警报。

<强>参考: How to make Alarm Manager work when Android 6.0 in Doze mode?

答案 2 :(得分:0)

在我的实验中,AlarmManagerCompat + setAlarmClock稳定可在打ze模式下唤醒。我使用的是使用MIUI的小米设备。

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

如果对您有好处,请投票支持!