您的位置:首页 > 移动开发

Activity A启动Activity B,在B中按Home回到主屏幕,按menu时呈现后台app任务列表,如何让刚退出的app的界面显示为A,而不是退出时的B

2014-03-04 22:27 666 查看
先把实现方法说在最前:

要实现这个功能,最快捷方法就是在配置文件AndroidManifest.xml中,在Activity A添加一句

android:launchMode="singleTask"


最初我是往Activity的生命周期方面想的,因为在B中按Home回到主屏幕,就会调用Activity B的生命周期中的onPause()和onStop()方法,这时B还没destroy,如果在进app的话会依次调用B的onRestart(),onStart(),onResume()方法

因此我一开始是重写B的onRestart()方法,当调用它时就会跳到Activity A,这样就达到效果。

一开始是成功的,按Home退出后再进能回到A,但是仔细测试后发现在A按Back键不能一次性退出程序。后来试过一些方法,重写过BACK返回键都不能完整退出,会出现在A按BACK后,还是回到A

再后来,发现每次在B按HOME后再进app,就要多按BACK退出一次。例如启动程序后,A启动B,B按HOME,再进app,再启动B,再按HOME,再进app……以上步骤重复N次后,最后再A想要退出的话,要按N次BACK键才能退出应用,代码如下

这是Activity A,也是程序入口

public class MainActivity extends Activity {

private Button b1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

b1 = (Button) findViewById(R.id.Button01);
b1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
SecondActivity.class);
startActivity(intent);
}
});
}

}
下面是Activity B

public class SecondActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);//
}
public void onRestart() {
System.out.println("second activity: onRestart()");
Intent intent = new Intent(SecondActivity.this, MainActivity.class);
startActivity(intent);
super.onRestart();
finish();//如果不加finish()会一直退不出程序
}
}
后来想到了activity栈,是不是每次home键退出再进时就会又压一个activity栈呢?这样就解释了n次home键后要n次back键才退出程序

后来查了下,发现一篇介绍launchMode的:http://blog.csdn.net/liuhe688/article/details/6754323

看了后明白问题出在哪里,就像那篇文章所说的,默认是standard,不停退出再进,就会不停产生新的Activity A实例,也就是不停将新的Activity A压入栈内

解决方法就是使用singleTask,把Activity A之上的通通出栈,这样栈顶就是Activity A了,也就达到效果,也不需要重写onRestart方法

AndroidManifest代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidtest"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.androidtest.MainActivity"
            android:label="@string/app_name"
           android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.androidtest.SecondActivity"></activity>
    </application>
</manifest>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐