在Android中启动新活动的正确方法是什么?

时间:2011-09-21 11:52:44

标签: android android-activity android-intent

在开发我的第一个Android应用程序时,我想出了3种不同的方式来开始一项新活动(可能还有更多我不知道的事情),我无法理解它们是否有所不同或者它们是否基本有效以同样的方式。

例如,我有一个带有菜单的MainActivity(它是一个ActionBar组件,但就像菜单一样)。该菜单可以选择打开AboutActivity

我的第一个方法是:

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ActionBar actionBar = (ActionBar)findViewById(R.id.actionbar);

        getMenuInflater().inflate(R.menu.actionbar_main, actionBar.asMenu());
        actionBar.findAction(R.id.actionbar_item_home).setIntent(new Intent(this, AboutActivity.class));
    }
}

我的第二种方法是,为了简化代码组织,我开始用他们自己的方法处理所有菜单项选择,如下所示:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ActionBar actionBar = (ActionBar)findViewById(R.id.actionbar);

        getMenuInflater().inflate(R.menu.actionbar_main, actionBar.asMenu());
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.actionbar_item_home:
                item.setIntent(new Intent(this, AboutActivity.class));
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

}

第三种方法与前一种方法非常相似,唯一不同的是在代码行中启动AboutActivity。而不是:

item.setIntent(new Intent(this, AboutActivity.class));

我改为:

startActivity(new Intent(this, AboutActivity.class));

但是这让我想到了处理这个问题的正确方法。我的问题:

  1. 在方法#2和#3之间,它们之间有什么区别吗?我看到它的方式,setIntent基本上是每次选择项目时定义菜单项Intent。我假设哪个是坏事?虽然startActivity就是这样做的。但是,每次选择项目时都会创建一个新意图,这会引导我进入下一个问题。
  2. 在方法#1上我没有那个问题,意图只在活动的onCreate方法中创建一次(只要活动没有被破坏我相信)。但性能/内存方面(或其他可能相关的内容),以下是否有任何差异?
    • a)在onCreate方法
    • 中设置一次意图
    • b)在onOptionsItemSelected菜单处理程序
    • 中启动活动
  3. 现在,假设AboutActivity上有一个文本字段。我按下菜单项并打开活动,在文本字段中键入任何内容,返回,再次按菜单项,文本消失。我只想创建一次意图(方法#1),活动状态将持续存在,文本字段将被填充。但它没有,它只是像所有其他方法一样,让我更加困惑。它们之间有什么区别?

1 个答案:

答案 0 :(得分:0)

2是浪费的,因为就像你说的那样,每当它被调用时它就会产生这种意图。这并不是非常浪费,因为这些方法的调用不多,但这不是最佳实践。

如果你想做类似选项1的事情,但是在更好的位置,onCreateOptionsMenu()将是最好的选择。

“菜单”是开始活动的特例。通常你会做类似#3的事情,只要你需要它就可以调用startActivity。菜单的setIntent就是在幕后完成的。

我也认为有办法通过XML实现这一目标。但我很难找到答案。