Android应用程序启动可以启动没有意图过滤器的活动吗?

时间:2017-04-18 05:07:40

标签: android android-activity intentfilter android-launcher

我的Android应用程序中有很多“内部”活动,我只希望通过我编写的代码从应用程序内部启动。这些“内部”活动在Android清单文件中没有intent-filter标记。我有一个名为SplashActivity的活动,我将其用作具有典型启动意图过滤器的启动画面:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

我希望/期望每当Android启动我的应用程序并创建我的自定义Application对象时,它总会启动我的SplashActivity。但是,我的一些用户遇到了启动,其中我的一个“内部”活动没有启动intent-filter。我认为该活动通常是之前调用应用程序时使用的最后一个活动。我自己无法重现这个问题。但是,在某些情况下Android会启动我的应用程序,创建我的自定义Application对象,但启动一个没有intent-filter的内部活动。在什么情况下Android会这样做?

要轻松重现Android应用程序启动启动没有intent-filter的活动的场景,请首先将应用程序打开到任何此类活动。按主页按钮。然后使用Android设备监视器(DDMS)查找正在运行您的应用程序的进程并停止/终止该进程。然后启动您的应用。 Android将创建您的Application对象,但将启动/恢复上次显示的活动,而不是使用MAIN LAUNCHER intent-filter启动活动。

3 个答案:

答案 0 :(得分:2)

Android可以随时终止托管您应用的操作系统进程。通常,当您的应用已经在后台停留一段时间时会发生这种情况(即:用户导航离开您的应用以执行其他操作)。这种情况一直都在发生。

当用户返回到您的应用程序时,Android会为应用程序创建一个新的操作系统进程,并创建一个位于堆栈顶部的Activity的新实例(即:{{1}在应用程序被推送到后台之前显示在屏幕上。)

如果您不希望发生这种情况,可以将以下属性添加到Activity的{​​{1}}声明中:

<activity>

这将迫使Android在您的用户返回时始终从头开始重新启动您的应用。但是,这可能会让您的用户抱怨,因为如果用户正在使用您的应用,然后接听电话,然后返回到您的应用,它将从头开始。

最好是自己检测到问题,并在必要时重定向到SplashActivity (例如:当您的应用需要初始化时,因为该进程已被杀死并重新启动)。为此,请在android:clearTaskOnLaunch="true" 成功初始化应用后,在SplashActivity中声明一个名为static的{​​{1}}变量,并将其设置为initialized。在其他所有SplashActivity中,请在true中执行此操作:

SplashActivity

答案 1 :(得分:0)

当应用程序仍处于活动状态时会发生这种情况。

退出应用程序时,Android不会将其终止。它将保留在那里直到需要内存。 在这种情况下,当使用重新启动它时,他将获得最后一个活动。

答案 2 :(得分:0)

您可以尝试添加

android:clearTaskOnLaunch

表示清单文件中的根活动。