繁体   English   中英

活动中的onCreate会忽略所有调用堆栈序列

[英]onCreate in an Activity ignores all the call stack sequence

MainActivity在AndroidManifest.xml中具有属性android:launchMode="singleInstance"

这是MainActivityonCreate方法

@Override
protected void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);        
    setContentView(R.layout.activity_main);        

    Log.i(TAG,  "onCreate() from MainActivity");

    session = new TempSession(this);

    // check if logged in. If not, take the user back to login activity.
    session.checkLogin(); // <---- HERE

    Toast.makeText(this, "logged in as " + session.getUsername(), Toast.LENGTH_SHORT).show();

    // Prevents screen from turning off when in this Activity.
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    ....

TempSession ,它检查用户是否登录,如果没有登录,它将把用户带到LoginActivity

这是checkLogin()方法

public void checkLogin(){
    // Check login status
    if(!this.isLoggedIn() || getUsername() == null) {
        // user is not logged in redirect him to Login Activity
        Intent i = new Intent(context, LoginActivity.class);

        // Closing all the Activities
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

        // Add new Flag to start new Activity
        i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

        // Staring Login Activity
        context.startActivity(i);
    }
}

据我了解,我在MainActivity中标记<---- HERE的地方,当它调用checkLogin()时,难道它不应该在完成之前完成所有任务吗?

当前,我的应用程序将打开LoginActivity,但仍继续执行下一条指令(例如,使Toast说“以null登录”,并继续在后台运行 )并调用onPause()-> onStop()。

有什么办法可以阻止MainActivity继续运行吗?

这种情况导致从LoginActivity旁路回退到 MainActivity

如果您需要更多信息,请与我们联系。

先感谢您。

有什么办法可以阻止MainActivity继续运行吗?

是。 checkLogin()返回一些值,该值指示MainActivity#onCreate(...)应该return而不是继续执行。

调用startActivity(...)不会启动活动。 将其视为要求Android框架开始活动。 它将此作业放置在UI线程的工作队列的末尾。 这意味着在开始新活动之前,它将完成工作队列中已经存在的所有其他作业,包括当前方法的其余部分以及当前活动的其他生命周期方法。

您的吐司仍然显示出来的原因是,仅开始一项新活动并不会破坏您的旧活动。 它只是被推到了后台。 当然,您可以使用清单中的android:launchMode属性更改此设置。 一个简单的策略可能是在用户登录后从checkLogin()方法简单地返回true,并按如下所示更改onCreate:

if( session.checkLogin() ) {
    Toast.makeText(this, "logged in as " + session.getUsername(), Toast.LENGTH_SHORT).show();

    // Prevents screen from turning off when in this Activity.
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    ....
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM