我需要我的应用程序检查它是否第一次运行。如果是第一次,则应该启动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
?
答案 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
来决定是否需要像这样开始LoginActivity
或MainActivity
:
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>