【问题标题】:Can Android Application Launch Start an Activity That Has No Intent-Filter?Android应用程序启动可以启动没有意图过滤器的活动吗?
【发布时间】:2017-09-13 19:25:11
【问题描述】:

我的 Android 应用程序中有许多“内部”活动,我只想通过我编写的代码从应用程序内部开始。这些“内部”活动在 Android 清单文件中没有意图过滤器标记。我有一个名为 SplashActivity 的活动,我将其用作具有典型启动意图过滤器的初始屏幕:

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

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

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

【问题讨论】:

    标签: android android-activity intentfilter android-launcher


    【解决方案1】:

    Android 可以随时终止托管您应用的操作系统进程。通常,当您的应用程序在后台运行了一段时间(即:用户离开您的应用程序去做其他事情)时,就会发生这种情况。这种情况经常发生。

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

    如果您不希望发生这种情况,可以将以下属性添加到 SplashActivity&lt;activity&gt; 声明中:

    android:clearTaskOnLaunch="true"
    

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

    最好自己检测问题,并在必要时重定向到SplashActivityonly(即:当您的应用程序需要初始化时,因为进程已被杀死并重新启动)。为此,请在 SplashActivity 中声明一个名为 initializedstatic 变量,当您的 SplashActivity 成功初始化应用程序时,您将其设置为 true。在每个其他 Activity 中,在 onCreate() 中执行此操作:

    super.onCreate(savedInstanceState);
    if (!SplashActivity.initialized) {
        // Android killed my process, need to redirect the user to `SplashActivity`
        redirectIntent = new Intent(this, SplashActivity.class);
        startActivity(redirectIntent);
        finish();
        return;
    }
    

    【讨论】:

    • 我不得不将对 super.onCreate() 的调用移动到 if 块中,并将 null 作为 savedInstanceState 传递,因为 super.onCreate() 在一切初始化之前恢复了各种片段。
    • 当然,好的。只要在return 语句之前调用super.onCreate()(否则会崩溃)。
    【解决方案2】:

    当应用程序仍然“活动”时会发生这种情况。

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

    【讨论】:

    • 我很想重现这个问题。你如何“退出”应用程序但让它保持这种状态? Back/Up 在我的应用程序中完成(),但是当我再次启动应用程序时,我看到了我的 SplashActivity。显然我的一些用户没有,我正在尝试弄清楚如何将我的应用程序置于这种状态,以便我可以测试并确保我的应用程序在这种情况下工作。我已经尝试过 Back, Home,最近使用的应用程序。我只是不确定如何将我的应用程序置于这种状态。为了测试和开发目的,我怎样才能将应用置于这种状态?
    • 据我所知,包含一些必要状态的自定义应用程序对象正在被销毁并再次创建。 Android 会重新创建我的自定义应用程序对象但不启动我的启动活动吗?也许这就是 Android 的工作方式,但对我来说这似乎是错误的。
    • 有什么办法可以阻止 Android 启动最后一个活动,而是强制它打开主启动器意图过滤器指定的活动?
    【解决方案3】:

    你可以尝试添加

    android:clearTaskOnLaunch
    

    用于清单文件中的根活动。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多