【问题标题】:Is Android app visible during onCreate()?在 onCreate() 期间 Android 应用程序是否可见?
【发布时间】:2017-05-21 06:33:34
【问题描述】:

我计划在MainActivityonCreate 中检查用户的登录状态 - 如果用户已登录 - 立即重定向到其他视图(例如 ProfileActivity

我担心MainActivity 在消失之前会闪烁到用户视图中。这有什么关系吗?

【问题讨论】:

  • No Activity 在 onCreate 期间不可见。它在活动的 onResume() 之后变得可见。
  • 只需在没有视图的情况下创建类似 StartupActivity 的内容,然后根据您拥有的条件从那里启动您想要的任何活动。

标签: android android-lifecycle activity-lifecycle


【解决方案1】:

我建议您将MainActivity 保留为LAUNCHER(在singleTask 模式下)并在将布局传递给它之前检查登录状态。这种方法将避免登录用户等待第二个活动启动。

请注意,在@Nicola De Fiorenze 回答中,Activity 实例在所有情况下都会被杀死。因此,即使对于已经通过登录阶段的用户,您也将创建 2 个 Activity 实例。

代码可能如下所示:

清单:

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

MainActivity:

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    if(!AuthUtils.isLoggedIn()){
        LoginActivity.startActivity(this);
        finish();
        return;
    }

    // Once you know user is logged in, pass layout to activity
    setContentView(resLayoutId);
}

【讨论】:

    【解决方案2】:

    您可以创建一个不可见的活动作为主要活动。

    您可以在其中放置一些逻辑来确定首先向用户显示哪个活动。

    清单声明,noHistory="true"

    <activity
        android:name=".LandingActivity"
        android:launchMode="singleInstance"
        android:noHistory="true" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    

    LandingActivity 类:

    public class LandingActivity extends Activity { 
    
    @Override
    public void onCreate(Bundle savedInstanceState){ 
        super.onCreate(savedInstanceState); 
    
        Intent intent = new Intent(); 
        Class<?> firstActivityClass; 
        try{ 
            String className = getFirtsActivityClassName(); 
            firstActivity = Class.forName(className); 
        } 
        catch (ClassNotFoundException e) { 
            firtsActivity = MainActivity.class; 
        } 
        intent.setClass(getApplicationContext(), firstActivity); 
        startActivity(intent); 
    
        finish(); 
    } 
    
    private String getFirtActivityClassName() {       
        // Here the logic 
    } 
    
    } 
    

    【讨论】:

    • 这通常不是一个好的解决方案,因为用户将花费几秒钟等待活动启动。如果您打算使用这种方法,请至少尝试启动模式,因为它可以让用户知道发生了什么以及为什么他必须等待..
    【解决方案3】:

    它不是恢复开始,但你可以你想要的动作。当Activity被创建时你是允许执行任何改变活动状态的操作,因为它不是停止暂停

    例如,您可以附加fragment 或根据需要更改视图!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2015-02-16
      • 2011-06-16
      • 2011-11-22
      • 1970-01-01
      相关资源
      最近更新 更多