gpt4 book ai didi

android - 是什么让 singleTask Activity 有 2 个实例?

转载 作者:行者123 更新时间:2023-12-04 23:39:15 32 4
gpt4 key购买 nike

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

重新创建问题的步骤

步骤1

在 Android Studio 3.3.1 中创建一个新项目,Add No Activity,将其命名为 singleTaskBug,(包 com.example.singletaskbug),使用 Java 语言,最低 API 级别为 21,不支持即时应用程序。

第2步

通过编辑 AndroidManifest.xml 手动添加新 Activity 然后在 app 中创建一个新的 Java 类⯈ javacom.example.singletaskbug命名为 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的内容:
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();
}
}

第 3 步

转至 RunEdit Configurations...Launch Options部分设置 Launch:Specified Activity , 和 Activity: com.example.singletaskbug.LauncherActivity ,然后点击 OK , 和 Run 'app' ShiftF10。

第4步

等到 Activity 变得可见。现在在测试设备(在我的情况下为 API 21)上,转到设置以将此应用程序设置为默认启动器。然后按主页按钮。此时您将在 Logcat 中看到:
02-15 17:22:01.906 26429-26429/com.example.singletaskbug D/STB: Constructed instance 1.
02-15 17:22:01.916 26429-26429/com.example.singletaskbug D/STB: Created instance 1.
02-15 17:22:24.228 26429-26429/com.example.singletaskbug D/STB: Constructed instance 2.
02-15 17:22:24.248 26429-26429/com.example.singletaskbug D/STB: Created instance 2.

最佳答案

一个 Android 应用程序可以有多个任务。每个任务可以有多个 Activity 。 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
}

关于android - 是什么让 singleTask Activity 有 2 个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54712162/

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