如何在android中以编程方式配置Launcher活动?

时间:2015-04-08 14:17:43

标签: android android-activity android-applicationinfo

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

现在,如果用户再次打开应用,则应启动MainActivity。我试图在Application类中切换这些活动,并从manifest中删除了LAUNCHER_ACTIVITY的intent-filter,但它不起作用。

是否有任何方法可以根据保存的首选项以编程方式在Launcher活动之间切换?

6 个答案:

答案 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成为启动器活动时,请使用MainActivityPackageManager启用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);
       } 
   ..........
   ...........