如何在Android中通过编程方式配置启动器活动?

24

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

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

是否有任何方法根据保存的首选项在程序上动态地切换启动器活动?


在 LoginActivity 中使用 Preferences 检查用户是否已登录,如果用户已登录,则打开 MainActivity 并结束 LoginActivity。 - Yazan
如果我在MainActivity中检查偏好设置,那么会更好,因为切换到登录活动的次数会减少,对吧? - aruke
这取决于您的业务需求。如果某些数据在主活动加载后只获取一次,那么如果用户未登录,则可能会出现一些错误,否则可能会很好。 - Yazan
6个回答

28
这是需要翻译的内容:

是否有任何方法可以根据保存的偏好设置在编程时在启动器活动之间进行切换?

你可以尝试以下步骤:

第1步:将LoginActivity正常地拥有LAUNCHER<intent-filter>,而MainActivity则没有<intent-filter>

第2步:在清单中添加一个指向MainActivity<activity-alias>元素,该元素具有LAUNCHER<intent-filter>

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

步骤 #4:当用户登录时,您想要更改 MainActivity 为启动器活动时,请使用 PackageManagersetComponentEnabledSetting() 来启用 <activity-alias> 并禁用 LoginActivity

并非所有主屏幕都会即时检测到此更改,对于这些情况,设备很可能需要重新启动才能拾取更改。因此,最好坚持使用单个启动器活动。如果您想要,该启动器活动可以具有 Theme.NoDisplay,并在 onCreate() 中简单地路由到正确的“真实”活动,就像 Fahim 的答案一样。


19

简而言之,您无法更改默认启动的Activity。更新:根据CommonsWare在另一个答案中所述,有一种替代方法。

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

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


4
一个活动不一定需要用户界面,因此您可以在清单文件中使用启动器活动来启动任何您想要的活动。

4

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


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 */
}

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

如果您的应用程序行为与这些方法不同,无法正常工作,请随时说明,我可以提供更多信息。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接