47

有没有办法根据条件动态更改Android中的启动活动?我试图做的(没有用)如下:

  1. 删除我的 AndroidManifest.xml 中定义的 LAUNCHER 类别
  2. 创建应用程序使用的自定义应用程序类
  3. 覆盖我的 Application 类的 onCreate 方法以定义如下代码:

.

if (condition) {
    startActivity(new Intent(this, MenuActivity.class));
} else {
    startActivity(new Intent(this, LoginActivity.class));
}
4

2 回答 2

59

为什么不使用没有 UI 的初始Activity值来检查其条件onCreate,然后启动下一个Activity,然后调用finish()自身?不过我从来没有finish()从内部打电话onCreate(),所以我不确定这是否会奏效。

编辑
似乎工作正常。这里有一些代码让它更清楚。
初始Activity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent;
    if (condition) {
       intent = new Intent(this, ClassA.class);
    } else {
       intent = new Intent(this, ClassB.class);
    }
    startActivity(intent);
    finish();
    // note we never called setContentView()
}

其他Activity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}
于 2011-01-31T21:58:28.553 回答
8

这是我个人为我的一个小型移动项目所做的。Activity我没有在条件所在的位置创建一个单独的无屏幕并启动相应的屏幕,而是将条件放在一个中Activity并做了一个动态的setContentView(),如下所示:

if (!userIsLoggedIn) {
    setContentView(R.layout.signup);
} else {
    setContentView(R.layout.homescreen);
}

这种方法的两个重要说明:

1:不要把它写在onCreate()里面,你想把决策onResume()精确地放在里面,因为当屏幕需要显示在前面时,总是会调用后者。从 Android Activity 生命周期可以看出。因此,例如,如果用户刚刚下载了我的应用程序并第一次启动它,因为没有用户登录,她将被引导到注册页面。当她完成注册并出于某种原因按下HOME按钮(不是BACK,它完全退出应用程序!)然后恢复应用程序时,她将看到的布局已经是主屏幕的布局。如果我把条件放在里面onCreate(),本来会显示的是注册屏幕,因为根据生命周期,它不会回到onCreate()将应用程序带回前面时。

2:只有在合并这两个活动的功能不会产生长的恶魔般的代码块时,此解决方案才是理想的。就像我说的,我的项目很小(它的主要功能出现在后台),所以单一的动态Activity并没有太多。Activity如果您需要您的代码更具人类可读性,那么无屏幕绝对是您的最佳选择。

于 2012-08-03T12:29:37.383 回答