Android 9(Pie)专用:Context.startForegroundService()未调用Service.startForeground(),但在Oreo上正常工作。

21
我们调整了我们在奥利奥系统上的持续通知,效果非常好。但是现在,在Pie系统上(奥利奥设备上没有发生),我们遇到了标题错误。在Pie系统中,前台服务是否有所改变,我错过了什么吗?
下面是前台服务的onCreate代码 ->
override fun onCreate() {
    super.onCreate()

    val notification: Notification = NotificationCompat.Builder(this, packageName)
            .setSmallIcon(R.drawable.status_notification_icon)
            .setContentTitle(getString(R.string.ongoing_notify_temp_title))
            .setContentText(getString(R.string.ongoing_notify_temp_message))
            .setGroup(AppConstants.NOTIFICATION_GROUP_ONGOING)
            .setColor(ContextCompat.getColor(this, R.color.custom_blue))
            .build()

    startForeground(ONGOING_NOTIFY_ID, notification)

    appSettings = AppSettings(this)

    weatherLookUpHelper = WeatherLookUpHelper()
    MyRoomDatabase.getInstance().invalidationTracker.addObserver(onChange)

    retrieveCurrentLocation()
    createAlarmManager()
}

正如您所看到的,我们只是创建通知,然后调用startForeground。有什么想法,为什么这段代码会生成标题错误?

旁注:Fabric Crashlytics 仅显示在运行 Pie 的 Pixel 设备(像素,像素 xl,像素2,像素2 xl)上发生此崩溃。

编辑: 我们在清单中拥有前台权限。

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

你的清单文件中有写入 Manifest.permission.FOREGROUND_SERVICE 权限吗? - May Rest in Peace
@MayRestinPeace 是的,我们有。 - Psest328
你解决了这个问题吗? - Knowledge Drilling
很遗憾,我现在已经换了工作,所以我不会再跟进这个问题了。我的当前项目没有这个问题,所以我怀疑我不会再关注它。抱歉:( - Psest328
4个回答

15

如在此处背景服务限制中所述,应用程序/服务有五秒钟的时间来调用startForeground(),如果应用程序在时限内没有调用startForeground(),那么系统将停止该服务并声明该应用程序为ANR。

有一些可能性:

  1. 在调用startForeground()方法之前,你的前台服务可能已被销毁/完成。
  2. 或者如果前台服务已经被实例化并再次被调用,则不会调用onCreate方法,而是会调用onStartCommand。然后将你的逻辑移动到onStartCommand以调用startForeground()方法。
  3. startForeground中的通知ID不能为0,否则也会导致崩溃。

1
将 startForeground 放在 onStartCommand 中会冒重复调用的风险吗? - Psest328
1
不,onStartCommand 只会在启动服务时在 onCreate 之后被调用一次。但是,如果您多次启动服务,那么 onStartCommand 当然会被多次调用。 - Arshad Mehmood

2

@Psest328,你能分享一下你的日志和问题吗? - AskNilesh
@Psest328,这里有一个问题,请查看https://issuetracker.google.com/issues/76112072。 - AskNilesh
@Psest328,你能分享一下你的 ONGOING_NOTIFY_ID 的值吗? - AskNilesh

1
我回到使用startService()而不是startForeground()解决了我的问题。

1
这里也有同样的问题...在添加API > Oreo检查并使用startForegroundService(intent)后,即使我在服务的onStartCommand中使用startForeground(0, builder.build());,仍会导致崩溃。 - DIRTY DAVE

0

ONCREATE中实现以下代码后,我停下来查看错误。

Intent intent1 = new Intent(this, YourActivity.class);
          try {
                startService(intent1);
            }catch ( Exception e1){
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    this.startForegroundService(intent1);
                }else {
                    Crashlytics.log("crash for first time, trying another.");
                    this.startService(intent1);
                }
            }

对我来说,听起来有点奇怪,但是运行得很好,没有崩溃。

1
当应用程序从API > Android Oreo关闭时,它不会崩溃,但只是服务(非前台)将无法工作。 - Kostya M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接