此文是本人根据自己的理解以及对网络内容的参考而作,参考见文章最后,理解不当之处,恳请指正,万分感谢!
要解决的问题:
Activity的跳转顺序为FirstActivity—>SecondActivity—>ThirdActivity。
问题一:
1、在FirstActivity中双击返回键退出程序;
2、在SecondActivity中按返回键回到FirstAcitivity;
3、在ThirdActivity中按返回键回到SecondActivity。
问题二:
1、在FirstActivity中双击返回键退出程序;
2、在SecondActivity中按返回键回到FirstAcitivity;
3、在ThirdActivity中按返回键回到FirstActivity。
问题一可以理解为浏览网页返回上一个页面,问题二则是回到首页。
一、问题分解
1、退出程序;2、双击返回键退出;3、Activity生命周期。
重点是Activity的生命周期。
二、退出程序
1、退出方法
参考http://hi.baidu.com/a420478805/item/7937000b8f7f3ae3ff240db3
2、方法说明
MyApplication类用于储存每一个Activity,并实现关闭所有Activity的操作;在每个Activity的onCreate方法中使用MyApplication.getInstance().addActivity(this)将该Activity添加到MyApplication的对象实例容器中;当需要关闭所有Activity时调用MyApplication.getInstance().exit()即可。
3、MyApplication类代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
| /**管理Activity的类,主要用于Activity的退出*/ public class MyApplication extends Application { private List<Activity> activityList = new LinkedList<Activity>(); private static MyApplication instance; private MyApplication() { } /**单例模式中获取唯一的MyApplication实例*/ public static MyApplication getInstance() { if(null == instance) { instance = new MyApplication(); } return instance; } /**添加Activity到容器中*/ public void addActivity(Activity activity) { activityList.add(activity); } /**遍历所有Activity并finish*/ public void exit() { for(Activity activity:activityList) { activity.finish(); } System.exit(0); } } |
三、双击返回键退出
1、双击返回键退出代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
| /**双击返回键退出程序*/ private long exitTime = 0; public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if ((System.currentTimeMillis() - exitTime) > 2000) { Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { MyApplication.getInstance().exit(); } return true; } return super.onKeyDown(keyCode, event); }//end onKeyDown
|
四、Activity生命周期和栈
1、Activity生命周期图(来自Android developer)
图 Activity生命周期
2、Activity生命状态转换(来自CSDN,原始安卓中文网)
3、Activity栈(同上)
4、Activity生命周期简单理解
(1) Activity有四个状态:
活动状态:当前Activity位于前台,用户可见,可以获得焦点。
暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点。
停止状态:不可见,失去焦点。
销毁状态:该Activity结束,或Activity所在Dalvik进程被结束。
(2)对照生命周期图,掌握Activity处在某个状态或正向某个状态过渡时回调的函数。
五、问题的解决
1、问题一:
通过以上分析,问题一的解决只需在FirstActivity中添加双击返回键退出程序的代码即可。在这种情况下,只要没退出程序,Activity并没有被销毁(当然是在不考虑内存使用的情况下),只是暂停或停止了。
2、问题二:
可采用这种方法,当SecondActivity跳转到ThirdActivity后就销毁它(即在SecondActivity的Intent后添加finish()),那么由Activity栈可知,在ThirdActivity中按返回键时会返回到FirstActivity。
3、问题二文件结构和.java代码,
代码很简单,主要是FirstActivity跳到SecondActivity,SeconActivity跳到ThirdActivity,
每个布局文件中只有一个按钮。
FirstActivity.javapackage com.lucus.multi_activity_jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class FirstActivity extends Activity {
private long exitTime = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//将当前Activity添加到MyApplication对象实例中
MyApplication.getInstance().addActivity(this);
Button firstBtn = (Button)findViewById(R.id.firstBtn);
firstBtn.setOnClickListener(new FirstBtnOnClickListener());
}//end method onCreate
class FirstBtnOnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass( FirstActivity.this , SecondActivity.class );
FirstActivity.this.startActivity( intent );
}
}//end class FirstBtnOnClickListener
/**双击返回键退出程序*/
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
if ((System.currentTimeMillis() - exitTime) > 2000)
{
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
}
else
{
MyApplication.getInstance().exit();
}
return true;
}
return super.onKeyDown(keyCode, event);
}//end onKeyDown
/**双击返回键退出程序*/
}//end FirstActivity
SecondActivity.javapackage com.lucus.multi_activity_jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SecondActivity extends Activity{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
MyApplication.getInstance().addActivity(this);
Button secondBtn = (Button)findViewById(R.id.secondBtn);
secondBtn.setOnClickListener(new SecondBtnOnClickListener());
}//end method onCreate
class SecondBtnOnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass( SecondActivity.this , ThirdActivity.class );
SecondActivity.this.startActivity( intent );
finish();//销毁该Activity
}
}//end class SecondBtnOnClickListener
}//end SecondActivity
ThirdActivity.javapackage com.lucus.multi_activity_jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ThirdActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.third);
MyApplication.getInstance().addActivity(this);
Button thirdBtn = (Button)findViewById(R.id.thirdBtn);
thirdBtn.setOnClickListener(new ThirdBtnOnClickListener());
}//end method onCreate
class ThirdBtnOnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// Intent intent = new Intent();
// intent.setClass( ThirdActivity.this , FirstActivity.class );
// ThirdActivity.this.startActivity( intent );
}
}//end class ThirdBtnOnClickListener
}//end ThirdActivity
MyApplication.javapackage com.lucus.multi_activity_jump;
import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.app.Application;
/**管理Activity的类,主要用于Activity的退出*/
public class MyApplication extends Application {
private List<Activity> activityList = new LinkedList<Activity>();
private static MyApplication instance;
private MyApplication()
{
}
/**单例模式中获取唯一的MyApplication实例*/
public static MyApplication getInstance()
{
if(null == instance)
{
instance = new MyApplication();
}
return instance;
}
/**添加Activity到容器中*/
public void addActivity(Activity activity)
{
activityList.add(activity);
}
/**遍历所有Activity并finish*/
public void exit()
{
for(Activity activity:activityList)
{
activity.finish();
}
System.exit(0);
}
}
六、参考资料:
http://blog.csdn.net/hpoi/article/details/4629065
http://hi.baidu.com/a420478805/item/7937000b8f7f3ae3ff240db3
http://blog.csdn.net/lizhiguo0532/article/details/7480993