SingleTask 活动在同一个进程中多次创建
Posted
技术标签:
【中文标题】SingleTask 活动在同一个进程中多次创建【英文标题】:SingleTask activity is created multiple times within the same process 【发布时间】:2020-02-12 04:54:03 【问题描述】:我有一个 启动器应用,它有一个 singleTask
活动作为主要入口点。当用户导航到另一个 Activity 或第 3 方应用程序然后点击 主页按钮 时,应该将此 Activity 置于最前面。但是我的经验是仅对于第一次按下主页按钮,会创建另一个实例(创建一个新任务,调用onCreate()
)。与此同时,旧任务仍然存在,包含此活动的原始实例,但无法导航回该任务/活动或将其带到前台。
在第一次按下主页按钮后,下一次按下主页按钮会将这个活动的第二个实例带到前台。不知道为什么不第一次调用第一个实例的 onNewIntent()
方法......所以这只发生一次,之后总是调用第二个实例的 onNewIntent()
方法。这意味着将无法访问原始活动..
我试图将任务带到前台,但没有发生任何事情......就像它从未存在过一样(但任务与活动一起存在,它不会在任何时候被杀死)。我可以从代码中找到任务,也可以使用 shell 脚本。它包含原始活动
这发生在 Android TV(Os: Pie)上。知道这可能是什么原因吗?我真的不明白这是怎么发生的......顺便说一句,如果我将活动设置为singleInstance
,结果是一样的。
活动如下所示:
<activity
android:name=".activities.MainActivity"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:theme="@style/AppTheme">
<intent-filter android:priority="2">
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.ALL_APPS"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
我尝试交替使用上述属性(priority、excludeFromRecents、taskAffinity),也将它们完全删除,它们没有任何效果...
按下主页按钮会发送以下意图:
动作:“android.intent.action.MAIN” 类别: “android.intent.category.HOME” 组件:上述活动它还有一些额外的东西,但我认为它不相关
【问题讨论】:
你在用taskAffinity
吗?
有没有试过都没有效果
你为什么要加android:excludeFromRecents="true"
呢?这将阻止活动显示在任务切换器中,因此如果它不可见,您将无法有效地返回任务。 (我知道你提到过它们,但仍然看起来很奇怪)。
安装后第一次如何启动应用程序?您可能会看到这个讨厌的 Android 错误:***.com/questions/16283079/…
顺便说一句,我想就这个特定问题与你联系,因为我看到你在这个话题上(也)相当不错,但你还是找到了这个问题,所以谢谢!
【参考方案1】:
您正在经历这个长期存在的令人讨厌的 Android 错误:
Re-launch of Activity on Home button, but...only the first time
您在评论中说真实用户不会发生这种情况。这实际上不是真的。如果真正的用户会从 Play 商店安装您的应用,然后立即启动它(安装后单击“打开应用”按钮),那么问题将完全按照您的描述重现。
【讨论】:
【参考方案2】:在过去的几个小时里,我一直在为同样的问题苦苦挣扎,并且我在 *** 上阅读了许多关于此主题/错误的类似问答。直到出于好奇,我才做了以下解决方案。
如果你正在构建一个启动器并在你的 MainActivity 中使用 onNewIntent() (尽管 OP 没有提到他正在使用这种方法),那么只需注释掉这一行:
super.onNewIntent(intent);
卸载您的应用并重新安装。
我不知道这是如何工作的,但是即使您取消注释同一行,它仍然以正确的方式运行,即:应用程序实际上一直只有其主要活动的单个实例。我怎么知道的?我的 MainActivity 正在做一些数据库操作,之前我在我的 Logcat 中看到这些操作每次都进行了两次,但现在它们只进行了一次。
顺便说一句,我在 AndroidManifest.xml 中的 MainActivity 标记并没有什么特别之处:
<activity
android:name=".activities.MainActivity"
android:exported="true"
android:excludeFromRecents="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
【讨论】:
以上是关于SingleTask 活动在同一个进程中多次创建的主要内容,如果未能解决你的问题,请参考以下文章
Android singleTask 还是 singleInstance 启动模式? [关闭]
即使使用 launchMode="singleTask" 也可以启动两次活动