我正在开发一个包含两项活动的应用:LoginActivity
和MainActivity
。当用户首次打开应用程序时,他将登录并将其凭据(用户名和令牌)保存在Preferences
中。
现在,如果用户再次打开应用,则应启动MainActivity
。我试图在Application类中切换这些活动,并从manifest中删除了LAUNCHER_ACTIVITY的intent-filter,但它不起作用。
是否有任何方法可以根据保存的首选项以编程方式在Launcher活动之间切换?
答案 0 :(得分:21)
是否有任何方法可以根据保存的首选项以编程方式在Launcher活动之间切换?
你可以试试这个:
第1步:让LoginActivity
正常LAUNCHER
<intent-filter>
,MainActivity
没有<intent-filter>
。
步骤2:让an <activity-alias>
element in the manifest指向MainActivity
LAUNCHER
的{{1}}。
步骤3:将<intent-filter>
放在android:enabled="false"
上,默认情况下已停用,因此首次安装该应用时,唯一的启动器图标适用于<activity-alias>
。
步骤4:当用户登录,并且您想要更改以使LoginActivity
成为启动器活动时,请使用MainActivity
和PackageManager
启用setComponentEnabledSetting()
并禁用<activity-alias>
。
并非所有主屏幕都会动态检测到此更改,对于那些设备,设备需要重新启动才有可能获得更改。因此,坚持使用单个启动器活动会更好。如果您愿意,该启动器活动可以LoginActivity
,只需路由到正确的&#34;真实&#34;根据法希姆的回答Theme.NoDisplay
中的活动。
答案 1 :(得分:14)
简而言之,您无法更改默认启动的Activity
。更新:在另一个答案中有CommonsWare所述的替代方案。
但是,有合理的解决方法。在MainActivity
中,您可以检查用户是否已登录并立即将其重定向到LoginActivity
。这具有在您登录后自动返回MainActivity
的附加好处。
或者,您可以随时首先访问LoginActivity
,如果用户已登录,请将其发送到MainActivity
(重写意图历史记录以删除返回LoginActivity
或者在清单中设置noHistory标志。)
答案 2 :(得分:3)
最简单的方法是像往常一样制作MainActivity启动器活动
然后,如果用户已登录,则通过MainActivity#onCreate(Bundle)
检查SharedPreferences
,如果没有,则立即启动LoginActivity
。当用户登录时,保存布尔标志,指示用户在SharedPreferences
中登录并完成MainActivity
。
答案 3 :(得分:2)
活动并不一定需要用户界面,因此您可以使用清单中的启动器活动来完成您想要的任何活动。
答案 4 :(得分:2)
据我所知,以编程方式更改启动器是不可能的,但它也没有意义。
在您的LoginActivity onCreate
上检查是否已保存用户名和令牌,如果尝试自动登录,则成功重定向到您的MainAcivity。根据您的应用程序的工作方式,您可以使用一个变量来检查用户是否已登录,如果他是LoginActivity,则会将其重定向到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 */
}
这不会尝试登录,但它知道凭证是正确的,因为它已经至少登录过一次。
如果您的应用行为与这些方法不起作用的方式不同,请随意说明,我可以提供更多信息
答案 5 :(得分:0)
您可以将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);
}
..........
...........