在开发我的第一个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));
但是这让我想到了处理这个问题的正确方法。我的问题:
setIntent
基本上是每次选择项目时定义菜单项Intent。我假设哪个是坏事?虽然startActivity
就是这样做的。但是,每次选择项目时都会创建一个新意图,这会引导我进入下一个问题。onCreate
方法中创建一次(只要活动没有被破坏我相信)。但性能/内存方面(或其他可能相关的内容),以下是否有任何差异?
onCreate
方法onOptionsItemSelected
菜单处理程序AboutActivity
上有一个文本字段。我按下菜单项并打开活动,在文本字段中键入任何内容,返回,再次按菜单项,文本消失。我只想创建一次意图(方法#1),活动状态将持续存在,文本字段将被填充。但它没有,它只是像所有其他方法一样,让我更加困惑。它们之间有什么区别?答案 0 :(得分:0)
2是浪费的,因为就像你说的那样,每当它被调用时它就会产生这种意图。这并不是非常浪费,因为这些方法的调用不多,但这不是最佳实践。
如果你想做类似选项1的事情,但是在更好的位置,onCreateOptionsMenu()将是最好的选择。
“菜单”是开始活动的特例。通常你会做类似#3的事情,只要你需要它就可以调用startActivity。菜单的setIntent就是在幕后完成的。
我也认为有办法通过XML实现这一目标。但我很难找到答案。