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

How can I configure Launcher activity programmatically in android?

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

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

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

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

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

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

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

最简单的方法是像往常一样制作 MainActivity 启动器activity。
如果用户已经登录,则通过 SharedPreferences 检查 MainActivity#onCreate(Bundle),如果没有,立即启动 LoginActivity。当用户登录时,保存指示用户登录的布尔标志 SharedPreferences 并完成 MainActivity.

Is there any way of switching between Launcher Activities programmatically on basis of saved preferences ?

你可以试试这个:

第 1 步:LoginActivityLAUNCHER <intent-filter> 正常,MainActivity 没有 <intent-filter>.

第 2 步:让 an <activity-alias> element in the manifest 指向 MainActivity,它有 LAUNCHER <intent-filter>.

第 3 步:将 android:enabled="false" 放在 <activity-alias> 上,默认情况下它是禁用的,所以当应用程序首次安装时,唯一的启动器图标是 LoginActivity

第 4 步:当用户登录时,您想要更改 MainActivity 是启动器 activity,使用 PackageManagersetComponentEnabledSetting() 来制作<activity-alias> 启用并禁用 LoginActivity

并非所有主屏幕都能实时检测到此更改,对于那些主屏幕,设备很可能需要重新启动才能接收更改。因此,最好坚持使用单个启动器 activity。如果你愿意,那个启动器 activity 可以有 Theme.NoDisplay 并简单地路由到 onCreate() 中正确的 "real" activity,根据 Fahim 的回答。

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

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

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

如果您的应用的行为方式不同,导致这些方法不起作用,请尽管说出来,我或许可以提供更多信息

你可以在OnCreate之后添加Intent到XML你想在APP开头显示的

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);
       } 
   ..........
   ...........