Android中的动态启动活动?

Mat*_*ins 47 android launcher android-intent android-activity

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

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

.

if (condition) {
    startActivity(new Intent(this, MenuActivity.class));
} else {
    startActivity(new Intent(this, LoginActivity.class));
}
Run Code Online (Sandbox Code Playgroud)

dav*_*e.c 59

为什么没有一个初始Activity没有UI来检查其中的条件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()
}
Run Code Online (Sandbox Code Playgroud)

其他Activity:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}
Run Code Online (Sandbox Code Playgroud)

  • @TWiStErRob关键是这种做法是错误的.根本不应该创建临时的"窗口". (2认同)

Mat*_*ros 8

这是我个人为我的一个小型移动项目所做的事情.不是创建一个单独的,无屏幕Activity的条件,并启动相应的屏幕,我把条件放在一个Activity并做了一个动态setContentView(),如:

if (!userIsLoggedIn) {
    setContentView(R.layout.signup);
} else {
    setContentView(R.layout.homescreen);
}
Run Code Online (Sandbox Code Playgroud)

这种方法的两个重要注意事项:

1:onCreate()你不想把它写进去,而是要把决策放在内部,onResume()因为只要屏幕需要在前面显示,就会调用后者.您可以从Android 活动生命周期中看到.因此,例如,如果用户刚刚下载了我的应用并首次启动它,因为没有用户登录,她将被引导到注册页面.当她完成注册并出于某种原因按下HOME按钮(不是BACK,完全退出应用程序!)然后恢复应用程序,她将看到的布局已经是主屏幕了.如果我把条件设置在内部onCreate(),那么显示的是注册屏幕,因为根据生命周期,它不会onCreate()回到将应用程序带回前面时.

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

  • +1用于共享备用方法.:)正如您已经提到的,我对此方法的唯一顾虑是每个视图可能需要一组完全不同的底层代码,这会使Activity变得庞大且不一致. (3认同)