我有一个有三项活动的申请。
MainActivity看起来像这样:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button b = new Button(this);
b.setText("click me to go to child activity");
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, ChildActivity.class));
}
});
setContentView(b);
}
}
ChildActivity看起来像这样:
public class ChildActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new TextView(this) {{
setText("I'm the child activity");
}});
}
}
和看起来像的其他活动:
public class OtherActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new TextView(this) {{
setText("I'm other activity");
}});
}
}
在清单中我有这样的声明:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity android:name="pl.psobolewski.test.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name="pl.psobolewski.test.ChildActivity" />
<activity android:name="pl.psobolewski.test.OtherActivity" />
</application>
现在当我启动应用程序时,它从MainActivity开始,从那里我可以转到ChildActivity,但是没有办法转到OtherActivity。
然后在清单中我改变了这一行:
<activity android:name="pl.psobolewski.test.ChildActivity" />
为:
<activity android:name="pl.psobolewski.test.ChildActivity" android:parentActivityName="pl.psobolewski.test.OtherActivity" />
现在我再次在我的手机上启动此应用程序,该手机具有Android API 16.它以MainActivity开头,我可以按下按钮并转到ChildActivity。现在,ChildActivity看起来与以前略有不同:ActionBar上的徽标有一个类似箭头的小图标(文档称之为“朝向左侧的插入符号”),这意味着它可以用于向上移动。但是当我按下它时,我不会转到OtherActivity - 即使它被声明为ChildActivity的父级 - 但是也不是MainActivity。
我发现与Android文档相反,它说: http://developer.android.com/guide/topics/manifest/activity-element.html “机器人:parentActivityName 当用户按下操作栏中的“向上”按钮时,系统将读取此属性以确定应启动哪个活动。系统还可以使用此信息与TaskStackBuilder合成一系列活动。“
我还认为在不调用setDisplayHomeAsUpEnabled的情况下添加android:parentActivityName属性不会将应用程序徽标转换为向上按钮 - http://developer.android.com/training/implementing-navigation/ancestral.html处的文档建议如此。
我的问题是:为什么“向上”按钮会将我转移到MainActivity而不是OtherActivity?
答案 0 :(得分:1)
Action Bar up导航处理程序的实现方式是,如果当前活动的父级没有父级,则使用ACTION_MAIN&amp;创建一个Intent。 CATEGORY_LAUNCHER开始活动。这导致MainActivity被启动。 看看Activity.java
中getParentActivityIntent()的定义要克服这个问题,请在ChildActivity.java中覆盖以下2个Activity方法。
@Override
public boolean shouldUpRecreateTask(Intent intent) {
return true; // This creates a new task stack
}
@Override
public Intent getParentActivityIntent() {
Intent intent = new Intent(this, OtherActivity.class);
return intent;
}
如果您不想覆盖getParentActivityIntent,则需要在AndroidManifest.xml文件中为OtherActivity定义父活动,以克服前面提到的原因。
如果你不重写shouldUpRecreateTask,由于OtherActivity没有出现在历史堆栈中,它将删除所有活动,直到达到任务的根活动,从而导致“应用程序内置”主页&#39;行为。