在android中,系统对activity是按照栈进行管理的,这样通常情况下一个activity的逻辑父activity也就是栈中的上一个activity,所以通常情况下一个activity结束自己的生命周期后都会回到自己的逻辑父activity。不过如果一个activity是设置了action,那么当通过其他app启动activity时,栈中的情况就不一样了,这时当activity结束自己的生命周期后会回到启动自己的那个activity。
那么怎么能让一个activity不论在什么情况下都能回到自己的逻辑父activity呢。android从4.1开始支持activity向上跳转到自己的逻辑父activity(4.0以前的版本也可以通过添加support libraries来实现)。下面简单介绍一下:
MainActivity
package com.example.actionbar;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
public class MainActivity extends ActionBarActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
getMenuInflater().inflate(R.menu.actionbar, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
default:
break;
}
return super.onOptionsItemSelected(item);
}
public void onNextActivity(View view) {
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
}
}
SecondActivity
package com.example.actionbar;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v4.app.TaskStackBuilder;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class SecondActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.seccond_activity);
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
switch (view.getId()) {
case R.id.btn_next:
Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
break;
case R.id.btn_back:
back();
break;
default:
break;
}
}
};
Button btnNext = (Button) findViewById(R.id.btn_next);
Button btnBack = (Button) findViewById(R.id.btn_back);
btnNext.setOnClickListener(listener);
btnBack.setOnClickListener(listener);
}
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
back();
}
public void back() {
Intent intent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, intent)) {
TaskStackBuilder.create(this).addNextIntentWithParentStack(intent).startActivities();
} else {
NavUtils.navigateUpFromSameTask(this);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
getMenuInflater().inflate(R.menu.actionbar, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.home:
back();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
}
package com.example.actionbar;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v4.app.TaskStackBuilder;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
public class ThirdActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.third_activity);
}
public void onBack(View view) {
back();
}
public void back() {
Intent intent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, intent)) {
TaskStackBuilder.create(this).addNextIntentWithParentStack(intent).startActivities();
} else {
NavUtils.navigateUpFromSameTask(this);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
getMenuInflater().inflate(R.menu.actionbar, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.home:
back();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
}
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.actionbar"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light" >
<activity
android:name=".MainActivity"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:parentActivityName=".MainActivity"
>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"
/>
</activity>
<activity
android:name=".ThirdActivity"
android:parentActivityName=".MainActivity"
>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"
/>
</activity>
</application>
</manifest>
里面用了ActionBarActivity,如果需要支持低于3.0版本,需要添加Support Libraries v7