在Android中如何动态启动活动?

47
有没有一种方法可以根据特定条件在Android中动态更改起始活动?我尝试过以下操作(但没有成功):
1. 从我的AndroidManifest.xml中删除LAUNCHER类别 2. 创建应用程序使用的自定义Application类 3. 重写我的Application类的onCreate方法,定义一些类似于以下代码的代码:
if (condition) {
    startActivity(new Intent(this, MenuActivity.class));
} else {
    startActivity(new Intent(this, LoginActivity.class));
}

3
正是我所搜寻的,谢谢你已经提出这个问题。 - mad
2个回答

58

为什么不用一个没有界面的初始Activity在其onCreate中检查条件,然后启动下一个Activity,最后调用finish()来结束自身呢?我从未在onCreate()中调用过finish(),所以我不确定这是否可行。

编辑
看起来很好用。下面是一些代码,让它更清晰明了。
初始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);
}

1
@Matt Huggins,我刚在我的草稿工作区尝试了一下,似乎可以正常工作。 - dave.c
1
这就是活动的全部意义,但有很多方法可以解决这个问题。我认为Dave的意思是不要声明UI。没有任何要求你调用setContentView或其他任何东西。只需进行检查,启动下一个活动,然后继续进行即可。 - Falmarri
很可能这是最好的方法。虽然API应该允许在主要的“Application”的“onCreate”中以编程方式执行此操作,而无需在清单中声明活动。在我看来,这对于MVC方法会更加简洁。 - Mister Smith
1
即使我没有调用setContentView,我仍然可以短暂地看到初始活动的标题。该标题来自于AndroidManifest.xml - Monstieur
4
重点在于这种方法是错误的。根本不应该创建任何临时Window - Monstieur
显示剩余5条评论

7

这是我个人为我的一个小型移动项目所做的事情。我没有创建一个独立的,没有屏幕的Activity,而是将条件放在一个Activity中,并进行了动态的setContentView(),如下所示:

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

这种方法需要注意两点:

1:决策不应该写在 onCreate() 方法中,而应该放在 onResume() 方法内部。因为后者总是在屏幕需要显示前被调用,你可以从 Android 的activity life cycle 中看到这一点。例如,用户刚下载并第一次启动我的应用程序,因为没有用户登录,她将被导向注册页面。当她完成注册并出于某种原因按下 Home 按钮(不是返回按钮,它会完全退出应用程序!)然后恢复应用程序时,她将看到的布局已经是主屏幕了。如果我把条件放在 onCreate() 中,那么显示的就是注册屏幕,因为根据生命周期,在将应用程序带回前台时,它不会返回到 onCreate()

2:只有当合并这两个 Activities 的功能不会产生冗长的代码块时,这个解决方案才是理想的。像我说的,我的项目很小(其主要功能发生在后台),所以单个动态 Activity 中并没有太多内容。如果你需要使你的代码更容易阅读,那么无界面 Activity 绝对是一个好选择。


3
谢谢分享另一种方法,给你点赞!:) 就像你已经提到的那样,我对这种方法唯一的担忧是每个视图可能需要一个大不相同的底层代码集合,这将使活动变得笨重和不协调。 - Matt Huggins
1
@MattHuggins 如果您使用Fragment来封装contentView和“大部分不同的底层代码”,那么这个解决方案可能是最好的。 - TWiStErRob

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