简体   繁体   English

Activites如何在Android Studio上互相关注?

[英]How do Activites follow eachother on Android studio?

So I am trying to learn some android Dev too and I am saving my data to sql and I am trying to save data on the signup but when data is successful it loads a different activity instead of main Activity this is my code. 因此,我也尝试学习一些Android Dev,并将数据保存到sql,并尝试在注册时保存数据,但是当数据成功时,它将加载其他活动,而不是main活动,这是我的代码。 I want my method onSignupSuccess to open MainActivity.class I am not getting any Errors It instead opens 我希望我的方法onSignupSuccess打开MainActivity.class我没有收到任何错误,而是打开了

DisplayLogoActivity"

Manifest 表现

<activity android:name=".activities.DisplayLogoActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".activities.MainActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".activities.LoginActiviy"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.Dark" />
        <activity
            android:name=".activities.SignupActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.Dark" />

My onSignupSuccess Method 我的onSignupSuccess方法

  public void onSignupSuccess(int userId) {
        signUpBT.setEnabled(true);

        Session session = new Session(getBaseContext());
        session.setuserId(userId);
        setResult(RESULT_OK, null);
        finish();
    }

My MainActivity 我的主要活动

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

        Session session = new Session(getBaseContext());
        if (session.getuserId() == 0) {
            startActivity(new Intent(this, LoginActivity.class));
        }

My Session 我的会议

public class Session {

    private SharedPreferences prefs;

    public Session(Context cntx) {
        prefs = PreferenceManager.getDefaultSharedPreferences(cntx);
    }

    public void setuserId(int userId) {
        prefs.edit().putInt("userId", userId).commit();
    }

    public int getuserId() {

        return prefs.getInt("userId", 0);
    }

    public void logout() {
        prefs.edit().remove("userId").commit();
    }
}

You are starting the LoginActivity on your DisplayLogoActivity, when you finish the LoginActivity, the android will pop the "activity stack", so, the activity that will be shown is the DisplayLogoActivity. 您正在DisplayLogoActivity上启动LoginActivity,当您完成LoginActivity时,Android将弹出“活动堆栈”,因此,将显示的活动为DisplayLogoActivity。

To solve this, you can start your LoginActivity waiting for a result, with the startActivityForResult and, when you receive the result, if it's a OK, you start the MainActivity, or do whatever you want to do if the user is not logged in. 为了解决这个问题,您可以使用startActivityForResult启动LoginActivity等待结果,并且在收到结果后(如果可以)启动MainActivity,或者如果用户未登录则执行任何操作。

Another approach is to start your MainActivity on the DisplayLogoActivity instead of the Login. 另一种方法是在DisplayLogoActivity而不是Login上启动MainActivity。 And use this code you have, to check if the user is logged in when the MainActivity is created, to start(or not) the LoginActivity. 并使用此代码,检查在创建MainActivity时是否已登录用户,以启动(或不启动)LoginActivity。

To have a complete picture, 要了解完整情况,

if you have activities A (DisplayLogoActivity), B (LoginActivity), C (MainActivity) 如果您有活动A(DisplayLogoActivity),B(LoginActivity),C(MainActivity)

And if you call finish() method on B activity, just that activity will disappear from history stack, and last activity that has been opened before activity with finish() call, will be opened. 而且,如果您在B活动上调用finish()方法,则该活动将从历史记录堆栈中消失,并且在调用finish()的活动之前打开的最后一个活动将被打开。

So in your case, 所以就你而言

you have three possibilities to solve this problem (two from @Massita), and another one is to call finish() method also when you start B activity from A, something like this flow: 您有三种方法可以解决此问题(两种方法来自@Massita),另一种方法是从A启动B活动时也调用finish()方法,如下所示:

  1. Open DisplayLogoActivity 打开DisplayLogoActivity
  2. Start activity LoginActivity from DisplayLogoActivity and call FINISH() 从DisplayLogoActivity启动活动LoginActivity并调用FINISH()
  3. On LoginActivity check is OK data for that user if yes, then start activity MainActivity and call FINISH() 如果是,则在LoginActivity上检查该用户的OK数据是否正确,然后启动Activity MainActivity并调用FINISH()

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

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