我已经尝试了以下解决方案,但它停止了我的推送通知。我只是想阻止我的火力基地服务被打瞌睡模式杀死。我尝试了不同的解决方案,例如发送有效载荷高的优先级,但这也没有奏效。
<service android:name=".backgroundmanager.BackgroundOperationsManagerService" android:enabled="true" android:process="com.hashedin.processname" />
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmBroadCastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,
ALARM_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.SDK_INT >= 23) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 30000, pendingIntent);
}
else if (Build.VERSION.SDK_INT >= 19) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, 30000, pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, 30000, pendingIntent);
}
<receiver android:name=".backgroundmanager.alarmmanager.AlarmBroadCastReceiver"
android:enabled="true"
android:process="com.hashedin.processname"/>
public class AlarmBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
{
PowerManager.WakeLock screenWakeLock;
Toast.makeText(context, "broadcast fired", Toast.LENGTH_LONG).show();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
screenWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
"myapp:ScreenLock tag from AlarmListener");
screenWakeLock.acquire(10*60*1000L /*10 minutes*/);
Intent service = new Intent(context, AppFireBaseMessagingService.class);
startWakefulService(context, service);
screenWakeLock.release();
}
}
}
当应用程序打开时它可以工作,但当它被杀死时它不起作用。
上面提到的代码将阻止您的应用程序进入低电耗模式。确保在推送通知有效负载中发送通知对象。您还可以从电池优化中删除您的应用程序
确保你的应用已从电池优化中排除: 转到"设置",选择"优化电池使用",选择"全部"并确保您的应用程序未选中 另外,转到设置/应用程序/您的应用程序/电池并选中"允许后台活动">
现在有很多设备具有非常激进的省电模式,这可以防止推送传递到您的应用程序,因为操作系统只是在后台杀死您的应用程序。除了谷歌之外,几乎所有制造商的设备都存在此问题。看看这篇文章
我一直在处理同样的事情,我们所做的是检查设备上是否激活了任何电池优化,并向用户发送消息,让他知道他的 Push 体验将因此受到影响。