gpt4 book ai didi

Android 9 (Pie), Context.startForegroundService() 没有调用 Service.startForeground() : ServiceRecord

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:57 38 4
gpt4 key购买 nike

首先,我看了这些;

enter image description here

我有一个近一百万人使用的流媒体应用程序。我正在为播放器使用前台服务。我还没有实现 MediaSession。我有 99.95% 的无崩溃 session 。所以这个应用程序适用于所有版本,但我开始收到 android 9 的崩溃报告 (ANR)。此崩溃仅发生在 Samsung 手机上,尤其是 s9、s9+、s10、s10+、note9 模型。

我试过这些,

  • onCreate()中调用startForeground()方法
  • Context.stopService() 之前调用 Service.startForeground()
  • 类似问题的其他stackoverflow答案

我读了 Google 开发人员的一些评论,他们说这只是预期行为。请问是三星的系统还是安卓系统出现的。有人对此有意见吗?我该如何解决这个问题?

最佳答案

在与这次崩溃进行了太多的斗争之后,我终于完全修复了这个异常并找到了解决方案。

确保在您的服务中完成了这些工作,我将它们列在下面:(其中一些内容是重复的,正如另一个答案中提到的,我只是重新写了一遍)。

1- 调用

startForeground()

onCreateonStartCommand中。(可以多次调用startForeground())

  @Override
public void onCreate() {
super.onCreate();
startCommand();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent == null) {
return START_NOT_STICKY;
}
final int command = intent.getIntExtra(MAIN_SERVICE_COMMAND_KEY, -1);

if (command == MAIN_SERVICE_START_COMMAND) {
startCommand();
return START_STICKY;
}
return START_NOT_STICKY;
}

private void startCommand() {
createNotificationAndStartForeground();
runningStatus.set(STARTED);
}

2- 停止您的服务使用

context.stopService()

,无需调用 stopForeground()stopSelf()

  try {
context.stopService(
new Intent(
context,
NavigationService.class
)
);
} catch (Exception ex) {
Crashlytics.logException(ex);
LogManager.e("Service manager can't stop service ", ex);
}

3- 开始您的服务使用

ContextCompat.startForegroundService()

它将处理不同的 API 版本。

   ContextCompat.startForegroundService(
context,
NavigationService.getStartIntent(context)
);

4- 如果您的服务有操作(需要待处理的 Intent),则使用广播接收器处理您的待处理的 Intent,而不是您当前的服务(它将调用您的服务Create() 并且可能很危险,或者使用 PendingIntent.FLAG_NO_CREATE) ,使用特定的广播接收器来处理您的服务通知操作是一个很好的做法,我的意思是使用 PendingIntent.getBroadcast() .

    private PendingIntent getStopActionPendingIntent() {
final Intent stopNotificationIntent = getBroadCastIntent();

stopNotificationIntent.setAction(BROADCAST_STOP_SERVICE);

return getPendingIntent(stopNotificationIntent);
}

private PendingIntent getPendingIntent(final Intent intent) {
return PendingIntent.getBroadcast(
this,
0,
intent,
0
);
}

new NotificationCompat.Builder(this, CHANNEL_ID)
.addAction(
new NotificationCompat.Action(
R.drawable.notification,
getString(R.string.switch_off),
getStopActionPendingIntent()
)
)

5- 始终在停止您的服务之前确保您的服务已创建并启动(我创建了一个具有我的服务状态的全局类)

  if (navigationServiceStatus == STARTED) {
serviceManager.stopNavigationService();
}

6- 将您的 notificationId 设置为一个长数字,例如 121412。

7- 使用 NotificationCompat.Builder 将处理不同的 API 版本,您只需要为构建版本创建通知 channel >= Build.VERSION_CODES.O。(这不是解决方案,只是让您的代码更具可读性)

8- 添加

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

许可您的 list 。 (这个在android文档中提到) Android Foreground Service

希望对您有所帮助:))

关于Android 9 (Pie), Context.startForegroundService() 没有调用 Service.startForeground() : ServiceRecord,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55894636/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com