- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于新的后台执行限制,我们的应用在Android O上崩溃了。我们使用的是Firebase版本10.2.1,该版本添加了对Android O的支持。
好像是Firebase的问题?还是需要一些更改来支持我们这一点?
java.lang.IllegalStateException: Not allowed to start service Intent { act=com.google.firebase.INSTANCE_ID_EVENT pkg=my.package.name cmp=my.package.name/my.package.name.MyFcmIdService (has extras) }: app is in background uid UidRecord{30558fa u0a327 RCVR idle procs:1 seq(0,0,0)}
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1505)
at android.app.ContextImpl.startService(ContextImpl.java:1461)
at android.content.ContextWrapper.startService(ContextWrapper.java:644)
at android.support.v4.content.WakefulBroadcastReceiver.startWakefulService(WakefulBroadcastReceiver.java:99)
at com.google.firebase.iid.zzg.b(zzg.java:9)
at com.google.firebase.iid.zzg.a(zzg.java:72)
at com.google.firebase.iid.zzg.a(zzg.java:2)
at com.google.firebase.iid.FirebaseInstanceIdService.a(FirebaseInstanceIdService.java:23)
at com.google.firebase.iid.FirebaseInstanceIdService.a(FirebaseInstanceIdService.java:34)
at com.google.firebase.iid.FirebaseInstanceId.<init>(FirebaseInstanceId.java:31)
at com.google.firebase.iid.FirebaseInstanceId.getInstance(FirebaseInstanceId.java:47)
at com.google.firebase.iid.FirebaseInstanceId.a(FirebaseInstanceId.java:4)
at com.google.firebase.iid.FirebaseInstanceIdService.a(FirebaseInstanceIdService.java:19)
at com.google.firebase.iid.FirebaseInstanceIdService.b(FirebaseInstanceIdService.java:35)
at com.google.firebase.iid.zzb$zza$1.run(zzb.java:24)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
最佳答案
@KaMyLL是正确的。我的应用程序存在相同的问题,可以通过用JobIntentService替换IntentService(我们在onTokenRefresh()
中开始)来解决它。
因为我发现JobScheduler
和JobIntentService
文档有些混乱,所以我想用一些代码片段来介绍所有内容。我希望这对遇到此问题的每个人都清楚。
是什么导致此问题?
由于Android 8的新版Background Execution Limits,当应用程序可能在后台运行时,您不应再启动后台服务:
当应用程序处于前台时,它可以自由创建和运行前台和后台服务。当应用进入后台时,它会显示几分钟的窗口,在该窗口中仍允许其创建和使用服务。在该窗口结束时,该应用程序被认为是空闲的。这时,系统停止应用程序的后台服务,就像该应用程序已调用服务的Service.stopSelf()方法一样。
并且:
在许多情况下,您的应用程序可以用JobScheduler作业替换后台服务。
因此,对于Android 7.x及更低版本,(据我所知)在后台运行应用程序时使用startService()是没有问题的。但是在Android 8中,这会导致崩溃。因此,您现在应该使用JobScheduler
。 JobScheduler
和IntentService
在行为上的区别是IntentService立即执行。另一方面,不能保证排队到JobScheduler的作业立即执行。 Android OS将确定何时有适当的时间这样做,以提高能源效率。因此可能会有延迟。到目前为止,我还不知道需要多长时间。
因此,一种解决方案是检查操作系统版本并使用if-else分支代码。幸运的是,支持库可以帮助我们以更优雅的方式解决此问题,而无需复制任何代码:JobIntentService
,这基本上是在后台为您完成的。
如何重现该问题?
上面的第一句引述指出,该应用程序“仍具有几分钟的窗口,仍可在其中创建和使用服务。”,以便重现和调试问题(以Firebase中的onTokenRefresh()
为例) ,您可以在使用startService()
启动服务之前设置一个断点。关闭应用程序,然后在那里等待5-10分钟。继续执行,您将在此问题中看到IllegalStateException
。
能够将问题重现为基础,以确保我们的修复程序能够真正解决问题。
如何将我的IntenService迁移到JobIntentService?
我以FirebaseInstanceIdService.onTokenRefresh()
为例:
a)将BIND_JOB_SERVICE权限添加到您的服务中:
<service android:name=".fcm.FcmRegistrationJobIntentService"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE"/>
IntentService
扩展,而是从
android.support.v4.app.JobIntentService
扩展,将
onHandleIntent(Intent)
方法重命名为
onHandleWork(Intent)
,并添加enqueueWork(Context,Intent)便捷函数:
public class FcmRegistrationJobIntentService extends JobIntentService
{
// Unique job ID for this service.
static final int JOB_ID = 42;
// Convenience method for enqueuing work in to this service.
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, FcmRegistrationJobIntentService.class, JOB_ID, work);
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
// the code from IntentService.onHandleIntent() ...
}
}
enqueueWork()
便捷功能开始作业:
public class ComfyFirebaseInstanceIdService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
Intent intent = new Intent(this, FcmRegistrationJobIntentService.class);
// startService(intent);
FcmRegistrationJobIntentService.enqueueWork(this, intent);
}
}
FirebaseInstanceIdService
,我们应该将其从代码中删除,而应使用
FirebaseMessagingService
中的
onNewToken。
关于firebase - 由于后台执行限制,FirebaseMessagingService在Android O上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46117554/
我想使用 FirebaseMessagingService 来处理来自服务器的推送通知。但是没有叫onCreate功能在开始。我认为该服务在应用程序启动时会自动初始化。此外,我开始从 firebase
我正在开发接收 FCM(火基消息云)的 android 应用程序,当应用程序在后台或关闭时 android 系统接收通知并正确显示它,但是当应用程序进入前台时不显示通知,我检查了扩展 Firebase
我正在使用 Firebase 接收推送通知。我的问题是我想为用户提供一个选项,他们可以在其中禁用这些通知。
FCM 消息可以包含data、notification 或两者之一。系统使用notification 生成的通知缺乏功能,所以我删除了notification 并只发送了data。因此,我必须自己创建
FirebaseMessagingService 是否在后台运行,类似于 IntentService 的运行方式? 我看到 FirebaseMessagingService extents Servi
我正在尝试将 Firebase Cloud Messaging 集成到 Android 应用程序中,但在我们的类中扩展 FirebaseMessagingService 时遇到问题。 它显示无法解析符
我是 Firebase 的新手,我想实现 FCM 以从 Firebase 控制台发送通知。我在我的应用程序中创建了 FirebaseMessagingService,我唯一的问题是 FirebaseM
这个问题在这里已经有了答案: Does FirebaseMessagingService run in the background by default? (2 个答案) 关闭 4 年前。 Fir
我需要从 onMessageRecieved() 调用挂起函数,但此服务不提供作用域。所以我不知道从哪里调用 job.cancel()。这种情况下如何使用挂起功能? 最佳答案 FirebaseMess
我刚刚开始使用 Firebase Cloud Messaging,并在 Manifest 中设置了所有依赖项、Firebase 服务及其服务标签。 从控制台发送消息时,会检测到目标用户,但应用程序不会
我是 android studio 的新手,我正在尝试设置 firebase 消息传递,但我一直在消息接收器类中收到错误消息: cannot resolve FirebaseMessagingServ
我正在尝试将 Firebase Messaging 连接到我的 Android 应用程序,我创建了一个扩展 FirebaseMessagingService 的类,它一直在提示 Cannot reso
我在使用 FCM 通知的应用程序中工作,当应用程序运行时(前台或后台)收到通知,但是当我从最近的应用程序中清除该应用程序时,我没有收到任何通知我正在使用 FirebaseMessagingServic
我有一个应用程序,它使用 FCM 发送和接收消息。我已经按照文档中的建议实现了所有内容。 现在在生成 token 时,我想将其保存到共享首选项中。但它给出了错误。 考虑类名是这样的 public cl
我正在构建一个图书馆项目,其中有一个 FirebaseMessagingService。我的应用程序中也有一个 FirebaseMesagingService。我看到的是,每当从服务器发送 FCM 时
我正在尝试在收到来自 Firebase 控制台的推送通知后更新应用程序数据库。它在应用程序运行时有效,但是当应用程序在后台或进程被终止时,我无法更改 SharedPreferences 中的数据。 但
我有一个实现服务的类: public class myFirebaseMessagingService extends FirebaseMessagingService { @Override
我想将服务的 onMessageReceived 中收到的所有消息保存在 SQLite 数据库中。 我正计划打开数据库,插入数据并关闭数据库。这将适用于 Intent 服务,因为所有对 onMessa
最初,在设置自定义 ListView 后,没有更多的项目被添加,即显示在 ListView 中,尽管从 FirebaseMessagingService 添加了对象项目。我已将 listView 声明
在我的 android 项目中,我包括了 Firebase 云消息传递。我在 SDK 21 (Android 5) 上。 我的 Intent 是重写 MyFirebaseMessagingServic
我是一名优秀的程序员,十分优秀!