23

我正在开发一个有两个活动的应用程序:LoginActivityMainActivity。当用户第一次打开应用程序时,他将登录并且他的凭据(用户名和令牌)保存在Preferences.

现在,如果用户再次打开应用程序,那么MainActivity应该启动。我尝试在 Application 类中的这些活动之间切换,并从清单中删除了 LAUNCHER_ACTIVITY 的意图过滤器,但它不起作用。

有没有办法根据保存的偏好以编程方式在启动器活动之间切换?

4

6 回答 6

26

有没有办法根据保存的偏好以编程方式在启动器活动之间切换?

你可以试试这个:

步骤#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()

于 2015-04-08T14:35:14.450 回答
18

长话短说,您无法更改Activity默认启动的内容。更新: CommonsWare在另一个答案中描述了另一种选择。

但是,有一些合理的解决方法。在您的MainActivity中,您可以检查用户是否已登录并立即将他们重定向到LoginActivity. MainActivity这具有在您登录后自动返回的额外好处。

或者,您始终可以先转到LoginActivity,如果用户已经登录,则将它们发送到MainActivity(重写 Intent 历史记录以删除返回LoginActivity或在清单中设置noHistory标志)。

于 2015-04-08T14:21:56.997 回答
3

最简单的方法是像往常一样使 MainActivity 启动器活动。
然后MainActivity#onCreate(Bundle)通过检查SharedPreferences用户是否已经登录,如果没有,LoginActivity立即开始。当用户登录时,保存表示用户已登录的布尔标志SharedPreferences并完成MainActivity

于 2015-04-08T14:22:09.227 回答
3

据我所知,以编程方式更改启动器是不可能的,但这也没有意义。

在您的 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 */
}

这不会尝试登录,但它知道凭据是正确的,因为它至少与他们一起登录过一次。

如果您的应用程序的行为方式与这些方法不起作用的方式不同,请随时这么说,我也许可以提供更多信息

于 2015-04-08T14:48:01.533 回答
2

活动不一定需要 UI,因此您可以使用清单中的启动器活动来启动您想要的任何活动。

于 2015-04-08T14:21:03.247 回答
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);
       } 
   ..........
   ...........
于 2016-09-22T19:48:13.590 回答