我正在开发一个应用程序,其中包含两个活动:LoginActivity
和MainActivity
。当用户第一次打开应用程序时,他将登录并且他的凭据(用户名和令牌)将保存在Preferences
中。
现在,如果用户再次打开应用程序,则应启动MainActivity
。 我尝试在Application类中在这些活动之间切换,并从清单中删除了 LAUNCHER_ACTIVITY 的 intent-filter,但是它不起作用。
是否有任何方法根据保存的首选项在程序上动态地切换启动器活动?
我正在开发一个应用程序,其中包含两个活动:LoginActivity
和MainActivity
。当用户第一次打开应用程序时,他将登录并且他的凭据(用户名和令牌)将保存在Preferences
中。
现在,如果用户再次打开应用程序,则应启动MainActivity
。 我尝试在Application类中在这些活动之间切换,并从清单中删除了 LAUNCHER_ACTIVITY 的 intent-filter,但是它不起作用。
是否有任何方法根据保存的首选项在程序上动态地切换启动器活动?
是否有任何方法可以根据保存的偏好设置在编程时在启动器活动之间进行切换?
你可以尝试以下步骤:
第1步:将LoginActivity
正常地拥有LAUNCHER
<intent-filter>
,而MainActivity
则没有<intent-filter>
。
第2步:在清单中添加一个指向MainActivity
的<activity-alias>
元素,该元素具有LAUNCHER
<intent-filter>
。
第3步:在<activity-alias>
上放置android:enabled="false"
,因此默认情况下禁用它,因此当首次安装应用程序时,唯一的启动器图标是LoginActivity
。
步骤 #4:当用户登录时,您想要更改 MainActivity
为启动器活动时,请使用 PackageManager
和 setComponentEnabledSetting()
来启用 <activity-alias>
并禁用 LoginActivity
。
并非所有主屏幕都会即时检测到此更改,对于这些情况,设备很可能需要重新启动才能拾取更改。因此,最好坚持使用单个启动器活动。如果您想要,该启动器活动可以具有 Theme.NoDisplay
,并在 onCreate()
中简单地路由到正确的“真实”活动,就像 Fahim 的答案一样。
简而言之,您无法更改默认启动的Activity
。更新:根据CommonsWare在另一个答案中所述,有一种替代方法。
但是,有合理的解决方案。在您的MainActivity
中,您可以检查用户是否已登录,并立即将其重定向到LoginActivity
。这具有自动在登录后返回MainActivity
的额外好处。
或者,您可以始终先进入LoginActivity
,如果用户已经登录,则将其发送到MainActivity
(重写Intent历史记录以删除返回到LoginActivity
或在清单中设置noHistory标志)。
最简单的方法是像往常一样将MainActivity设置为启动活动。
然后在MainActivity#onCreate(Bundle)
中通过SharedPreferences
检查用户是否已经登录,如果没有,则立即启动LoginActivity
。当用户登录时,在SharedPreferences
中保存表示用户已登录的布尔标志,并完成MainActivity
。
//LoginActivity
onCreate(Bundle bundle)
{
/* ... */
//Or whatever you use to login (it could also go inside a thread or an AsyncTask
if (login())
{
//Intent
Intent intent = new Intent(this, MainActivity.class);
//Start Activity
startActivity(intent);
//Finish this activity, so when user pressed back the login activity will not come forth and the app will exit
//this looks like when a user has logged in once, the login screen will not be visible to him (unless you want to)
finish();
}
}
您还可以将其配置为仅在登录成功时保存用户名和令牌,这意味着上述代码可以修改如下:
if (getUsername() != null)
{
/* Start Main Activity */
}
这不会尝试登录,但它知道凭据是正确的,因为至少已经使用它们登录过一次。
如果您的应用程序行为与这些方法不同,无法正常工作,请随时说明,我可以提供更多信息。
你可以在OnCreate后面添加Intent到你想要在APP开头显示的XML中。
public class LoginActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//add some code to detect if user is logged in
if (user != null){
Intent in = new Intent(LoginActivity.this, YourDesiredActivity.class);
startActivity(in);
}
..........
...........