Android退出整个应用之完美解决方案

本文介绍了两种在Android中退出整个应用的有效方法:一是利用Application类中的全局容器记录并关闭所有活动的Activity;二是通过设置特定Activity的启动模式为singleTask,并重写onNewIntent方法来实现退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前写过一些退出整个activity的方法,但都很繁琐而且效果不是很好。


经过这段时间的学习和应用又有了新的方法。个人感觉很不错很完美的方法。


对于网上所提供的杀进程,杀包等方式不予评价,这里提供一下自己觉得挺好使的二种方法,和大家一起进行分享。
 
一:利用全局容器
 
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. }  


  • @Override  
  • protected void onNewIntent(Intent intent) {  
  • // TODO Auto-generated method stub  
  • super.onNewIntent(intent);  
  • finish();  

  • AndroidManifest.xml

    <activity
                android:name="com.putao.accountbook.MainActivity"
                android:launchMode="singleTask"
                android:label="@string/app_name" >



    简而言之就是将要退出整个应用的activity设置成单例启动模式。然后重写onNewIntent(Intent intent) 方法。

    附带说明

    Android中Activity启动模式详解

      在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。

      Android总Activity的启动模式分为四种:

    复制代码
    Activity启动模式设置:
    
            <activity android:name=".MainActivity" android:launchMode="standard" />
    
    Activity的四种启动模式:
    
        1. standard
    
            模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
    
        2. singleTop
    
            如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
    
        3. singleTask
    
            如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。 
    
        4. singleInstance
    
            在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
    希望对大家有帮助
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值