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>

上面的代码在后台成功执行了BroadcastReceiverpre-MarshMallow 设备,但在 MarshMallow 设备上,BroadcastReceiver并没有被执行。有谁知道这里会发生什么?谢谢。

4

3 回答 3

26

您可以尝试一些事情,当它们一起使用时,应该能够切断所有空闲/待机/打盹模式(无论操作系统版本如何)。

1. 用aWakefulBroadcastReceiver代替普通的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 应用程序的流程图

于 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 处于打盹模式时如何让闹钟管理器工作?

于 2015-12-20T07:13:43.643 回答
0

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

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

如果这对您有好处,请投票,干杯!

于 2020-02-27T15:32:24.707 回答