我正在开发一个有两个活动的应用程序:LoginActivity
和MainActivity
。当用户第一次打开应用程序时,他将登录并且他的凭据(用户名和令牌)保存在Preferences
.
现在,如果用户再次打开应用程序,那么MainActivity
应该启动。我尝试在 Application 类中的这些活动之间切换,并从清单中删除了 LAUNCHER_ACTIVITY 的意图过滤器,但它不起作用。
有没有办法根据保存的偏好以编程方式在启动器活动之间切换?
我正在开发一个有两个活动的应用程序:LoginActivity
和MainActivity
。当用户第一次打开应用程序时,他将登录并且他的凭据(用户名和令牌)保存在Preferences
.
现在,如果用户再次打开应用程序,那么MainActivity
应该启动。我尝试在 Application 类中的这些活动之间切换,并从清单中删除了 LAUNCHER_ACTIVITY 的意图过滤器,但它不起作用。
有没有办法根据保存的偏好以编程方式在启动器活动之间切换?
有没有办法根据保存的偏好以编程方式在启动器活动之间切换?
你可以试试这个:
步骤#1:有LoginActivity
正常的LAUNCHER
<intent-filter>
,MainActivity
没有<intent-filter>
。
步骤#2:在清单中有一个<activity-alias>
元素指向MainActivity
具有LAUNCHER
<intent-filter>
.
步骤#3:放上android:enabled="false"
,<activity-alias>
所以它默认是禁用的,所以当第一次安装应用程序时,唯一的启动器图标是LoginActivity
。
步骤#4:当用户登录时,您想要更改MainActivity
启动器活动,使用和PackageManager
启用和禁用.setComponentEnabledSetting()
<activity-alias>
LoginActivity
并非所有主屏幕都会即时检测到此更改,对于那些,设备很可能需要重新启动才能获取更改。因此,最好坚持使用单个启动器活动。如果您愿意,根据 Fahim 的回答,该启动器活动可以具有Theme.NoDisplay
并简单地路由到 中正确的“真实”活动。onCreate()
长话短说,您无法更改Activity
默认启动的内容。更新: CommonsWare在另一个答案中描述了另一种选择。
但是,有一些合理的解决方法。在您的MainActivity
中,您可以检查用户是否已登录并立即将他们重定向到LoginActivity
. MainActivity
这具有在您登录后自动返回的额外好处。
或者,您始终可以先转到LoginActivity
,如果用户已经登录,则将它们发送到MainActivity
(重写 Intent 历史记录以删除返回LoginActivity
或在清单中设置noHistory标志)。
最简单的方法是像往常一样使 MainActivity 启动器活动。
然后MainActivity#onCreate(Bundle)
通过检查SharedPreferences
用户是否已经登录,如果没有,LoginActivity
立即开始。当用户登录时,保存表示用户已登录的布尔标志SharedPreferences
并完成MainActivity
。
据我所知,以编程方式更改启动器是不可能的,但这也没有意义。
在您的 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 */
}
这不会尝试登录,但它知道凭据是正确的,因为它至少与他们一起登录过一次。
如果您的应用程序的行为方式与这些方法不起作用的方式不同,请随时这么说,我也许可以提供更多信息
活动不一定需要 UI,因此您可以使用清单中的启动器活动来启动您想要的任何活动。
您可以在 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);
}
..........
...........