Android退出整个应用的方法 和 task解析

本文介绍了一种使用全局容器记录并关闭所有Activity的方法,以及另一种将特定Activity设置为singleTask模式,通过Intent实现优雅退出的应用程序退出策略。

转自: http://lewisliu.iteye.com/blog/1629954


对于网上所提供的杀进程,杀包等方式不予评价,这里提供一下自己觉得挺好使的二种方法,和大家一起进行分享。
 
一:利用全局容器
 
android提供了一个类似于EE中的servletContext的东西-Application。
在application里面我们通常会进行创建一些全局变量或者对应用程序进行一些必要的初始化。
第一个方法的思路就在于,我们可以在application里面创建一个集合容器,用于记录每个打开的activity,一旦我们有退出整个应用程序的需求的时候,我们就可以迭代该集合容器,把该容器里面保存的activity依次关闭。
 
核心代码如下,详细代码见附件一

Java代码   收藏代码
  1. public class BaseApp extends android.app.Application {  
  2. public static Stack<Activity> activitys = new Stack<Activity>();  
  3. /* 
  4. * @see android.app.Application#onCreate() 
  5. */  
  6. @Override  
  7. public void onCreate() {  
  8. // TODO Auto-generated method stub  
  9. super.onCreate();  
  10. }  
  11. public static void pushActivity(Activity mActivity) {  
  12. activitys.add(mActivity);  
  13. }  
  14. public static void popAll() {  
  15. while (!activitys.isEmpty()) {  
  16. Activity act=activitys.pop();  
  17. act.finish();  
  18. }  
  19. }  
  20. }  
 



二:利用activity启动模式
 
这里我们回顾一下activity的启动模式。
 
1:standard 模式;也就是默认模式,每次激活Activity时都会创建一个Activity实例,并放入任务栈中。
 
2:singleTop 模式;如果在任务栈中的栈定存在该Activity实例,下次激活该Activity实例时就不会创建新的 Activity的实例,直接重用它(在重用的这个过程中会调用实例的OnNewIntent()这个方法),否则就创建新的Activity实例。
 
3): singleTask  模式;如果在栈中已经有该Activity的实例,以后就不会创建新的实例了,而会重用该实例(在重用的这个过程中会调用实例的OnNewIntent()这个方法)。重用时,如果该Activity实例不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
 
4):singleInstance 模式;在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
 

 
在这里我们可以把某个activity设置为singleTask模式,当我们有应用退出需要的时候,我们就可以通过intent打开该activity,然后activity会把其他的activity移出activity栈,然后我们再在该activity的onnewIntent方法进行finnish,那么我们就可以相对完美的退出该应用程序。
 
 
核心代码如下,详细见附件二:

Java代码   收藏代码
  1. public class MainActivity extends Activity {  
  2. @Override  
  3. public void onCreate(Bundle savedInstanceState) {  
  4. super.onCreate(savedInstanceState);  
  5. TextView tv = new TextView(this);  
  6. tv.setText("我是第一个activity");  
  7. tv.setLayoutParams(new LayoutParams(100200));  
  8. tv.setOnClickListener(new View.OnClickListener() {  
  9. @Override  
  10. public void onClick(View v) {  
  11. // TODO Auto-generated method stub  
  12. Intent intent = new Intent(MainActivity.this,  
  13. MainActivity02.class);  
  14. startActivity(intent);  
  15. }  
  16. });  
  17. setContentView(tv);  
  18. }  
  19. @Override  
  20. public boolean onCreateOptionsMenu(Menu menu) {  
  21. getMenuInflater().inflate(R.menu.activity_main, menu);  
  22. return true;  
  23. }  
  24. /* 
  25. * @see android.app.Activity#onNewIntent(android.content.Intent) 
  26. */  
  27. @Override  
  28. protected void onNewIntent(Intent intent) {  
  29. // TODO Auto-generated method stub  
  30. super.onNewIntent(intent);  
  31. finish();  
  32. }  
  33. }  
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值