Activity中的onCreate忽略所有调用堆栈序列

时间:2015-09-12 00:59:04

标签: java android

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

以下是 MainActivity

中的onCreate方法
@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标记&lt; ---- HERE 时,当它调用checkLogin()时,它应该在它进行之前完成所有任务吗?

目前,我的应用程序会打开LoginActivity,但仍会继续执行下一条指令(例如,让Toast说“登录为null”,并继续后台)并调用onPause( ) - &gt; onStop()。

有没有办法阻止 MainActivity 继续保持这一点?

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

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

提前谢谢。

2 个答案:

答案 0 :(得分:3)

  

有没有办法阻止MainActivity继续前进?

是。让checkLogin()返回一些值,表示MainActivity#onCreate(...) return应该startActivity(...)而不是继续。

调用public static void someMethod(java.util.HashSet<Coordinate> invalidPositions) { java.util.HashSet<Coordinate> newSet = SomeClass.getInvalidPositions(x, y); invalidPositions.addAll(newSet); } 不会启动活动。可以把它想象为要求Android框架启动一项活动。它将此作业放在UI线程的工作队列的末尾。这意味着在启动新活动之前,它将完成工作队列中已有的任何其他作业,包括当前方法的其余部分以及当前活动的其他生命周期方法。

答案 1 :(得分:1)

你的吐司仍然出现的原因是因为仅仅开始一项新活动并不会破坏你的旧活动。它只是被推到了后台。当然,您可以使用清单中的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);

    ....
}