我正在开发一个有两个活动的应用程序: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);
}
..........
...........