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

如何在android中以编程方式配置启动器活动?,android,android-activity,android-applicationinfo,Android,Android Activity,Android Applicationinfo,我正在开发一个包含两个活动的应用程序:LoginActivity和MainActivity。当用户第一次打开应用程序时,他将登录,他的凭据(用户名和令牌)保存在首选项中 现在,如果用户再次打开应用程序,则应启动MainActivity。我试图在应用程序类中的这些活动之间切换,并从清单中删除了LAUNCHER_活动的意图过滤器,但它不起作用 是否有任何方法可以根据保存的首选项以编程方式在启动器活动之间切换?活动不一定需要UI,因此您可以使用清单中的启动器活动来启动所需的任何活动。长话短说,您无法更

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

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


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

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

长话短说,您无法更改默认启动的
活动。更新:有另一个答案中所述的替代方案

然而,有合理的解决办法。在
main活动
中,您可以检查用户是否已登录,并立即将其重定向到
登录活动
。这样做的另一个好处是在登录后自动返回到
main活动


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

最简单的方法是使MainActivity启动程序活动,像往常一样。
然后,如果用户已登录,则通过
SharedReferences
登录
MainActivity#onCreate(Bundle)
,如果用户未登录,则立即启动
LoginActivity
。用户登录时,保存布尔标志,指示用户登录到
SharedReferences
并完成
MainActivity

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

您可以尝试以下方法:

步骤#1:使
后勤活动
使
启动器
正常,并使
主活动

步骤2:指向具有
启动器的
main活动

第3步:将
android:enabled=“false”
放在
上,因此默认情况下它是禁用的,因此当应用程序第一次安装时,唯一的启动器图标是用于
LoginActivity

步骤4:当用户登录时,如果您想更改
main活动
为启动器活动,请使用
PackageManager
setComponentEnabledSetting()
启用
并禁用
登录活动


并不是所有的主屏幕都会在运行中检测到这种变化,对于那些主屏幕,设备很可能需要重新启动才能检测到这种变化。出于这个原因,最好只使用一个启动器活动。如果您愿意,根据Fahim的回答,该启动器活动可以具有
主题。NoDisplay
,并简单地路由到
onCreate()
中正确的“真实”活动。

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

在您的LoginActivity的
onCreate
上,检查用户名和令牌是否已保存,如果尝试自动登录,是否成功重定向到您的MainActivity。根据应用程序的工作方式,您可以使用一个变量来检查用户是否已登录,如果用户已登录,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 */
}
这将不会尝试登录,但它知道凭据是正确的,因为它已使用凭据至少登录一次


如果您的应用程序的行为方式与这些方法不一样,请尽管这样说,我可能能够提供更多信息

您可以在创建完要在应用程序开头显示的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);
       } 
   ..........
   ...........

检查是否使用首选项在LoginActivity登录,然后打开MainActivity并完成LoginActivity如果用户已登录如果我在MainActivity中检查首选项,则会更好,因为切换到登录活动的次数会更少,对吗?可能是,这取决于您的业务,如果在加载MainActivity后提取一些数据,若用户未登录,则可能会出现一些错误,否则就可以了。