Android利用activity启动模式退出整个应用

前面我们来先看一下目前网上提供的几种方案:

1.退出单个activity


 1)、获取当前进程的id,杀死该进程。android.os.Process.killProcess(android.os.Process.myPid())

 2)、终止当前正在运行的Java虚拟机方法。System.exit(0); 
 
 3)、finish();

 4)、杀包方式。
  ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);   
  manager.restartPackage(getPackageName()); 
  添加权限:<uses-permission android:name="android.permission.RESTART_PACKAGES" />;
 (在2.2之前可以利用这个退出应用,很遗憾android2.2后失效了,连单个activity都结束不了)

 

2.退出整个应用(多个Activity)

 

   以下我直接列出网上给出的几种方案,就不做详细说明了。

 1)、制造抛异常导致程序强制退出:
 
 2)、用个容器记录每个打开的Activity,在需要退出的时逐一关闭每个Activity
 
 3)、广播方式:
 
 4)、递归退出
 在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

 

3.接下来看一下怎么利用activity启动模式退出整个应用,在这之前我简单的说下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 都会进入同一个应用中。


在android系统中,要想直接的关闭整个应用,这是不可能的,而在项目中当需要关闭整个应用时几乎都是采用间接的办法,以上列出的几种方案中其原理都是逐一关闭activity(制造抛异常导致程序强制退出除外),然后退出程序。接下来我们也利用这个原理来实现退出整个应用的目的,在activity启动模式singleTask 模式中,刚才提到如果该Activity实例存在但不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈。这样子,我们就可以将应用中的主入口Activity(这里假设主Activity为MainActivity)设置成singleTask 模式,这样子我们就保证了这个Activity实例存在于栈底中,后面不管有多少其他Activity实例添加进来它始终会在栈底,这时我们只要在要关闭整个应用的那个Activity中把他转到这个Activity来(startActivity(xx.this,MainActivity.class));这样子其他的activity实例就会被移出栈,这时栈中只剩MainActivity实例,如果此时要是再能让这个MainActivity实例移除出栈,那么我们就达到了关闭整个应用的目的,不知道大家刚才有没有注意到OnNewIntent()这个方法,这个方法就是重用activity实例时会被调用,因此我们只要在MainActivity重写该方法并加上一句finish()来关闭当前activity实例我们的目的就达到了……

[html]  view plain copy
  1. package com.test.launchmode;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7.   
  8. public class  MainActivity extends Activity {  
  9.   
  10.     @Override  
  11.     protected final void onCreate(Bundle savedInstanceState) {  
  12.         // TODO Auto-generated method stub  
  13.         super.onCreate(savedInstanceState);  
  14.         startActivity(new Intent(this,xx.class));  
  15.     }  
  16.       
  17.     @Override  
  18.     protected void onNewIntent(Intent intent) {  
  19.         // TODO Auto-generated method stub  
  20.         super.onNewIntent(intent);  
  21.         this.finish();  
  22.     }  
  23.   
  24. }  
  25.    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值