带有AlarmManager和BroadcastReceiver的LocalNotification无法在Android O中启动(oreo) [英] LocalNotification with AlarmManager and BroadcastReceiver not firing up in Android O (oreo)
问题描述
我的本地通知在SDK 26之前的android系统上运行
但是在Android O中,我有以下内容
But in a Android O I've got the following warning, and the broadcast receiver is not fired.
W/BroadcastQueue: Background execution not allowed: receiving Intent { act=package.name.action.LOCAL_NOTIFICATION cat=[com.category.LocalNotification] flg=0x14 (has extras) } to package.name/com.category.localnotifications.LocalNotificationReceiver
从我阅读的内容来看,在android O中,广播接收器受到更多限制,但是如果是这样,即使主要活动不是
From what I've read broadcast receivers are more restricted in android O, but if so, how should I schedule the broadcast if I want it launching even if the main activity is not running?
我应该使用服务而不是接收器吗?
Should I use services instead of receivers?
这是AlarmManager启动代码:
This is the AlarmManager launch code:
public void Schedule(String aID, String aTitle, String aBody, int aNotificationCode, long aEpochTime)
{
Bundle lExtras = new Bundle();
lExtras.putInt("icon", f.getDefaultIcon());
lExtras.putString("title", aTitle);
lExtras.putString("message", aBody);
lExtras.putString("id", aID);
lExtras.putInt("requestcode", aNotificationCode);
Intent lIntent =
new Intent(LocalNotificationScheduler.ACTION_NAME)
.addCategory(NotificationsUtils.LocalNotifCategory)
.putExtras(lExtras);
PendingIntent lPendIntent = PendingIntent.getBroadcast(f.getApplicationContext(), aNotificationCode,
lIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager lAlarmMgr = (AlarmManager) f.getSystemService(Context.ALARM_SERVICE);
lAlarmMgr.set(AlarmManager.RTC, 1000, lPendIntent);
}
这是接收方代码:
public class LocalNotificationReceiver extends BroadcastReceiver {
public static native void nativeReceiveLocalNotification (String aID, String aTitle, String aMessage, boolean aOnForeground );
/** This method receives the alarms set by LocalNotificationScheduler,
* notifies the CAndroidNotifications c++ class, and (if needed) ships a notification banner
*/
@Override
public void onReceive(Context aContext, Intent aIntent)
{
Toast.makeText(context, text, duration).show();
}
}
Android清单:
Android manifest:
<receiver android:name="com.category.localnotifications.LocalNotificationReceiver">
<intent-filter>
<action android:name="${applicationId}.action.LOCAL_NOTIFICATION" />
<category android:name="com.category.LocalNotification" />
</intent-filter>
</receiver>
推荐答案
Android O到目前为止还很新。因此,我尝试消化并提供尽可能准确的信息。
Android O are pretty new to-date. Hence, I try to digest and provide as accurate possible information.
来自 https://developer.android.com/about/versions/oreo/background.html#broadcasts
- 面向Android 8.0或更高版本的应用无法在其清单中为隐式广播注册广播接收器。
- 应用程序可以在运行时使用
Context.registerReceiver()
为任何人注册接收者广播,无论是隐式还是显式。
- Apps that target Android 8.0 or higher can no longer register broadcast receivers for implicit broadcasts in their manifest.
- Apps can use
Context.registerReceiver()
at runtime to register a receiver for any broadcast, whether implicit or explicit.
另外,在 https://developer.android.com/training/scheduling/alarms.html ,这些示例使用显式广播,并且未提及任何有关Android O的特殊信息。
Also, in https://developer.android.com/training/scheduling/alarms.html , the examples are using explicit broadcast, and doesn't mention anything special regarding Android O.
我可以建议您尝试按以下方式尝试显式广播?
May I suggest you try out explicit broadcast as follow?
public static void startAlarmBroadcastReceiver(Context context, long delay) { Intent _intent = new Intent(context, AlarmBroadcastReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, _intent, 0); AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); // Remove any previous pending intent. alarmManager.cancel(pendingIntent); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + delay, pendingIntent); }
AlarmBroadcastReceiver
AlarmBroadcastReceiver
public class AlarmBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { } }
在
AndroidManifest
,只需将类定义为<receiver android:name="org.yccheok.AlarmBroadcastReceiver" > </receiver>
这篇关于带有AlarmManager和BroadcastReceiver的LocalNotification无法在Android O中启动(oreo)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
- Apps can use
- 应用程序可以在运行时使用