在onCreate()和onStartCommand()中使用startForeground()的区别

12
我在Playstore上遇到了许多异常报告。这些异常是由Android P的RemoteServiceException引起的。
我正在创建Android前台服务,然后调用startForeground(使用通道)。
但是99.9%的用户只有9.0(Android P)才会报告RemoteServiceException。我检查了是否为服务创建了通知通道,也检查了在OREO之后是否调用了startForegroundService。
每行代码都没有问题。
但是我发现我正在多次调用startForegroundService(),但Service的onCreate()只在第一次创建时被调用。因此,在onCreate()中调用的startForeground()也只被调用一次。
但是,如果我将startForeground()放在onStartCommand()中,则它将随着我调用startForegroundService()的次数而被调用多次。因为它将在每次调用startService/startForegroundService时被调用(即使已经创建了Service实例)。
您认为这是异常的原因吗?
并且mboy在https://dev59.com/MFUK5IYBdhLWcg3w0Sx1#51251741中的评论也提到了类似的事情。

现在有任何解决方法吗? - Bajrang Hudda
2个回答

0

我也遇到了同样的问题。 在我的情况下,当我更改id时,似乎解决了这个问题。

之前

startForeground(1, notification);

之后

startForeground(100001, notification);

0

onStartCommand()中调用startForeground()之前,您可以尝试此代码块:

try {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NotifyManagerUtils.getNotificationDefaultChannelId());
        builder.setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.app_icon);
        startForeground(YOUR_ID, builder.build());
    }
} catch (Exception e) {
    if (DEBUG) {
        Log.e(TAG, e.getMessage());
    }
}

在编程方面,你应该知道的更多信息是,在服务中onCreate()只会被调用一次,即使你多次调用startService()/startForegroundService(),但onStartCommand()将与你调用的次数相同运行,因此我认为你应该为你的服务添加一个检查,如果这个服务已经存在,那么不要调用startForeground(),也许可以解决这个问题。

如果有相同的问题,请查看this


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