Android中的动态启动活动?

Posted

技术标签:

【中文标题】Android中的动态启动活动?【英文标题】:Dynamic start activity in Android? 【发布时间】:2011-06-18 21:32:37 【问题描述】:

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

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

.

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

【问题讨论】:

正是我搜索的内容,谢谢您已经提出这个问题。 【参考方案1】:

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

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

此方法的两个重要说明:

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

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

【讨论】:

+1 用于共享替代方法。 :) 正如您已经提到的,我对这种方法的唯一担心是每个视图可能需要一组大不相同的底层代码,这会使 Activity 庞大且不一致。 @MattHuggins 如果您使用封装了contentView 和“基本不同的一组代码”的Fragments,此解决方案可能效果最佳。【参考方案2】:

为什么没有一个初始的 Activity 没有 UI 来检查其 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);

【讨论】:

你能有一个没有 UI 的 Activity 吗?我认为 Activity 的全部意义在于向用户显示某些内容,但也许我需要重新阅读 Android 基础知识... @Matt Huggins 我刚刚在我的临时工作区中尝试过,它似乎工作正常。 这是一个活动的重点,但有很多方法可以解决这个问题。我认为 dave 的意思是不声明 UI。没有什么需要您调用 setContentView 或任何东西。只需检查一下,开始您的下一个活动,然后继续它。 即使我不调用setContentView,我仍然可以短暂看到初始活动的标题。标题来自AndroidManifest.xml @TWiStErRob 关键是这种方法是错误的。根本不应该创建临时的Window

以上是关于Android中的动态启动活动?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用字符串中的类名启动新的 android 活动?

从 Android Q 中的接收器启动活动

启动 Android 活动时出错

Android中的前台通知启动新的活动(通过pendingIntent)而不是现有的

尝试启动新活动时,Android 应用程序崩溃

启动新活动 Android 时出错