如果应用程序首次运行,则启动登录活动而不是MainActivity

时间:2016-08-28 09:28:20

标签: android android-intent

我需要我的应用程序检查它是否第一次运行。如果是第一次,则应该启动LoginActivity而不是MainActivity。如果它不是第一次运行,它应该像往常一样显示MainActivity

我使用SharedPreference值来检查它是否可用,然后app决定它没有运行它的第一次运行。

这是我到目前为止所尝试的

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Set default values into settings
        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

        // Check if the app is running on its first run
        SharedPreferences fRun = getPreferences(MODE_PRIVATE);

        if(fRun.getBoolean("firstrun", true)){

            SharedPreferences.Editor editX=fRun.edit();
            editX.putBoolean("firstrun", false);
            editX.apply();

            // Login activity stuff here
            // Goto login screen

            Intent loginIntent=new    Intent(getApplicationContext(),LoginActivity.class);
            startActivity(loginIntent);

            //finish();

        } else {
            setContentView(R.layout.activity_main);
        }
    }
}

我的问题是,当我运行我的应用时,它会突然崩溃并显示消息Unfortunately, the app has stopped

为什么应用程序会崩溃?是因为LoginActivity中的代码有错误,还是我需要首先加载MainActivity然后调用LoginActivity

3 个答案:

答案 0 :(得分:3)

您可以使用LoginActivity作为LAUNCHER activty并检查用户是否已登录。如果是,请启动MainActivity。

AndroidManifest.xml:

('a1','b1')

LoginActivity:

<activity
    android:name=".LoginActivity"
    android:label="@string/app_name">

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

<activity android:name=".MainActivity"/>

MainActivity:

public class LoginActivity extends ActionBarActivity {
    private static final String LOGIN_KEY = "LOGIN_KEY";

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

        SharedPreferences pref = getPreferences(Context.MODE_PRIVATE);
        if (pref.getBoolean(LOGIN_KEY, false)) {
            //has login
            startActivity(new Intent(this, MainActivity.class));
            //must finish this activity (the login activity will not be shown when click back in main activity)
            finish();
        }
        else {
            // Mark login
            pref.edit().putBoolean(LOGIN_KEY, true).apply();

            // Do something
        }
    }
}

答案 1 :(得分:1)

您需要重新安排Activity课程。确定您的应用程序是否第一次运行并根据此决定启动一些Activity非常简单。我想建议以下架构。

您可以设置LauncherActivity来决定是否需要像这样开始LoginActivityMainActivity

public class LauncherActivity extends Activity {

    private boolean firstLaunch = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent i;

        SharedPreferences pref = getSharedPreferences(Constants.ApplicationTag, MODE_PRIVATE);
        firstLaunch = pref.getBoolean(Constants.FIRST_LAUNCH, true);

        if (firstLaunch) {
            i = new Intent(LauncherActivity.this, LoginActivity.class);
            startActivity(i);
        } else {
            i = new Intent(LauncherActivity.this, MainActivity.class);
            startActivity(i);
        }

        finish();
    }
}

我还有另一个需要解决的问题是在setContentView语句中调用else这是错误的。您需要在setContentView之后super.onCreate(savedInstanceState);放置Activity

如果您将其放在else语句中,则可能无法设置内容视图,这会导致应用程序崩溃。

因此,请从MainActivity移除首次检查的检查,并将该部分移至LauncherActivity,以解决问题。

AndroidManifest.xml的{​​{1}}可能如下所示

LauncherActivity

答案 2 :(得分:1)

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">


        <activity android:name=".Activity.MainActivity" />

        <activity android:name=".Activity.SignupActivity" />

        <activity android:name=".Activity.SigninActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

    </application>