Android 11-按下主屏幕按钮时会触发前台服务的onTaskRemoved

问题描述

我在 Pixel 4XL(Android 11)上看到一些奇怪的行为。 我的前台服务的onTaskRemoved被意外调用。 在其他任何设备上都不会发生这种情况,但是我没有其他任何Android 11设备,并且模拟器无法执行BLE。

我的应用程序使用正在进行的BLE连接与另一个非Android设备进行通信。 前台服务用于确保程序保持活动状态以从设备接收BLE通信。

这种情况并非总是会发生,但是在大多数情况下(75%的时间)在按下主屏幕(从Pixel 4XL的屏幕底部向上滑动)后,这将导致调用前台服务的onTaskRemoved。

几乎可以保证在我的应用程序中打开其他活动(即MainActivity以外的活动)。

通知栏中打开设置,然后向内滑动仍然会触发此操作,因此,并不是因为我在设置应用程序处于焦点时向上滑动会意外杀死该应用程序。

据我了解,仅当用户通过在任务切换器中滑动应用程序来终止应用程序时,才应触发此方法

如果我返回任务切换器,则该服务被终止后,我的应用仍然可用,并显示上一次打开的活动及其状态。切换到它会恢复到正确的位置,因此应用程序本身一定不能终止。 手机已插入充电功能,因此不应该具有打ze /睡眠功能。 启动应用程序后60秒钟内就会发生这种情况,这不是30分钟的事情。

这到底是怎么回事? 我唯一能想到的就是由于某种原因它不被视为前台服务。在onTaskRemoved前后,logcat中没有错误。我没有在代码中的任何地方调用onTaskRemoved。

我尝试遵循dumpsys in this post,但似乎有所不同,找不到任何提及的参考。

通知本身如下所示:

$ adb shell dumpsys activity services | grep foreground
isForeground=true foregroundId=13459 foregroundNoti=Notification(channel=xxxService shortcut=null contentView=null vibrate=null sound=null tick defaults=0x0 flags=0x62 color=0x00000000 actions=1 vis=PRIVATE)

是的,我在清单中设置了前台权限:

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

BLEService onCreate方法(已删除一些不相关的内容):

@Override
public void onCreate()
{
    BLEManager.getInstance(getApplicationContext());

    startForeground(
            NotificationHandler.NOTIFICATION_BTCONNECTION_ID,NotificationHandler.getInstance(getApplicationContext()).createConnectionNotification(getApplicationContext(),MainActivity.class,R.drawable.navigation_tab,R.drawable.baseline_clear_black_24,getString(R.string.myDevice_text_disconnect),getString(R.string.app_name),getString(R.string.bleService_text_connected),getString(R.string.bleService_text_connected))
    );
}

通知频道:

        NotificationChannel serviceChannel;
        serviceChannel = new NotificationChannel(
                NOTIFICATION_SERVICE_CHANNEL_ID,serviceNotificationChannelLabel,notificationmanager.IMPORTANCE_HIGH
        );

        serviceChannel.setDescription(serviceNotificationChannelDescription);
        serviceChannel.enableLights(false);
        serviceChannel.setShowBadge(false);
        serviceChannel.enableVibration(false);

        mnotificationmanager.createNotificationChannel(serviceChannel);

通知

    NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(context,NOTIFICATION_SERVICE_CHANNEL_ID)
            .setSmallIcon(icon)
            .setContentTitle(contentTitle) 
            .setContentText(contentText) 
            .setContentIntent(pLaunchIntent)
            .setTicker(tickerText) 
            .setPriority(NotificationCompat.PRIORITY_MAX)
            .setongoing(true)
            .setAutoCancel(false)
            .addAction(icButton1,button1Text,actionPendingIntent); 

    return nBuilder.build();

解决方法

对我来说,将活动启动模式从singleInstance更改为已解决问题。

更改

        android:launchMode="singleInstance"

        android:launchMode="singleTop"

或将其完全删除

显然,拥有singleInstance是有充分理由的,这仍然是意外的行为,但是现在这是一个有效的解决方法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...