是什么使singleTask活动具有2个实例?

时间:2019-02-15 15:12:36

标签: android android-activity android-task

根据docs,singleTask活动不能有多个实例。我的应用程序唯一的活动是singleTask,它同时具有2个实例。

重新创建问题的步骤

步骤1

在Java Studio中使用最低API级别21的Java语言在不支持即时应用的情况下,在Android Studio 3.3.1中创建一个新项目,不添加任何活动,将其命名为singleTaskBug(程序包com.example.singletaskbug)。

步骤2

手动编辑新活动,方法是编辑AndroidManifest.xml,然后在名为app的{​​{1}}⯈java named com.example.singletaskbug中创建一个新的Java类。

LauncherActivity的内容:

AndroidManifest.xml

<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".LauncherActivity" android:excludeFromRecents="true" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> 的内容:

LauncherActivity.java

步骤3

转到package com.example.singletaskbug; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.util.Log; public class LauncherActivity extends Activity { static int instanceCounter = 0; final int instanceId; final String TAG = "STB"; public LauncherActivity() { instanceId = ++instanceCounter; Log.d(TAG, "Constructed instance " + instanceId + "."); } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "Created instance " + instanceId + "."); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Log.d(TAG, "New intent to instance " + instanceId + "."); } @Override protected void onDestroy() { Log.d(TAG, "Destroyed instance " + instanceId + "."); super.onDestroy(); } } Run,然后在Edit Configurations...部分中将Launch Options设置为Launch:Specified Activity Activity:,然后单击com.example.singletaskbug.LauncherActivityOK Shift F10

步骤4

等待直到活动可见。现在,在测试设备(本例中为API 21)上,转到设置将此应用设置为默认启动器。然后按主页按钮。此时,您将在Logcat中看到以下内容:

Run 'app'

1 个答案:

答案 0 :(得分:0)

一个 Android 应用程序可以有多个任务。每个任务可以有多个活动。 singleTasksingleInstance 控制任务内 Activity 的行为(其唯一性),但可能会发生应用程序具有两个或多个内部具有相同 Activity 的任务。

这是这里实际看到的内容,一个包含两个任务的应用程序,其中包含一个 LauncherActivity,每个任务一个。作为解决方法,请确保应用程序中始终只有一项任务。在 LauncherActivity onCreate 上添加:

val appTasks = getSystemService(ActivityManager::class.java).appTasks
if (appTasks.size >= 2) {
    appTasks.dropLast(1).forEach { it.finishAndRemoveTask() }
    appTasks.last().moveToFront()
    return
}