【问题标题】:How to stop the MainActivity from being called first?如何阻止 MainActivity 首先被调用?
【发布时间】:2019-03-12 15:26:58
【问题描述】:

在我的 AndroidManifest.xml 文件中,我有两个活动:

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

根据我的应用程序的逻辑,如果我登录了,我会直接重定向到MainActivity,否则会重定向到LoginActivity。我第一次打开应用程序时,LoginActivity 被打开,但在后台 MainActivity 也被调用。如何阻止这种情况发生?但是没有把LoginActivity作为主要活动?

【问题讨论】:

  • 对它们都使用 1 个 Activity,然后决定要显示的片段。
  • 您可以使用闪屏来确定用户是否已经登录。在启动画面中做决定并相应地启动下一个屏幕(登录/主)。
  • @EpicPandaForce 所以你基本上说我应该使用包含两个片段的单个活动并根据用户状态(登录或未登录)显示每个片段?有没有其他方法可以停止调用 MainActivity?谢谢!
  • @Ravi 谢谢拉维,我可以做到,但有没有其他我可以在不创建另一个活动的情况下解决这个问题?

标签: android android-activity android-manifest


【解决方案1】:

我一直采用的解决方案是创建第三个ActivitySplashScreenActivity

    <activity
        android:name=".activities.SplashScreenActivity"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

这只不过是一个加载活动,您可以在其中实例化您需要跨应用程序的所有内容,并在其中创建此逻辑。

例如,您可以在SplashActivityOnCreate 中调用它:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(/*logics to see if user is logged*/) {
      startActivity(SplashScreenActivity.this, MainActivity.class);
    }
    else {
      startActivity(SplashScreenActivity.this, LoginActivity.class);
    }
    finish(); //finish the splash activity.
}

另一个小技巧:)

来自 PPartisan 的评论链接:How to implement SplashScreen

我总是这样做activity Layout-less 这样您就不会在第一次启动应用程序时出现烦人的“黑屏闪烁”。为了做到这一点,如您所见,我在该活动的清单中指定了一个theme,我在simply 设置了这个:

<style name="SplashTheme" parent="AppTheme">
    <item name="android:windowBackground">@drawable/background_splash</item>
</style>

该资源只不过是带有backgrounddrawable(例如,白色背景和中间的徽标)。

这样您在运行应用程序时就不会出现黑色闪光。

祝你好运!

【讨论】:

  • 从来没有想过这个。我会尝试实施你的解决方案并让你回来。
  • 指定窗口背景也是splash Activity的推荐技术,而不是膨胀布局 - link
  • 在答案中添加了链接,使其更明显,谢谢! @JohansBormman 祝你好运!让我知道它是否对你有用:)
【解决方案2】:

您应该将以下代码移动到您的登录活动中,但 LoginActivity 将是主要活动:

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

您也可以使用一个内部有片段的活动,并根据登录状态选择向用户显示哪个片段。见https://developer.android.com/guide/components/fragments

最后,正如 cmets 中提到的,您可以创建一个启动屏幕来检查用户是否已经登录。但同样,启动屏幕将是您的主要活动。见https://android.jlelse.eu/right-way-to-create-splash-screen-on-android-e7f1709ba154

最好的

【讨论】:

  • 是的,然后决定在哪里打开MainActivity
  • "但是没有把 LoginActivity 作为主要活动?"
  • @TimCastelijns 这根本不合逻辑。 “主”Activity 是在您的应用打开时启动的 Activity。
  • 嗨,谢谢,我需要不将 LoginActivity 作为主要活动。
  • "“主”Activity 是在您的应用打开时启动的 Activity。" - 他不希望这成为登录活动
猜你喜欢
  • 1970-01-01
  • 2019-06-22
  • 2011-11-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
相关资源
最近更新 更多