Android中退出多个Activity的方法

本文介绍了两种退出Android应用中多个Activity的有效方法:一是利用单例模式结合链表存储所有Activity实例并逐一关闭;二是运用广播机制实现Activity的批量关闭。

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

Android2.2之后退出多个Activity变的有些繁琐了,今天查了查资料,退出多个Activity的方法主要有两种:一个是使用单例模式,放在链表中;另一个是使用广播机制。

这两种方法都测试过,可以使用。广播机制的第二个说的详细。

下面的内容是我查看的资料:

第一个:

这里介绍两种方法:一种把每个activity记住,然后逐一干掉;另一种思路是使用广播。本文来源于网络,如有雷同,那是必须的。写此贴只是为了总结一下常用东东,还望原作者莫怪,本人真不是想侵权。

方法一、用list保存activity实例,然后逐一干掉
上代码:
import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Application;
import android.content.DialogInterface;
import android.content.Intent;

public class SysApplication extends Application {
    private List<Activity> mList = new LinkedList<Activity>();
    private static SysApplication instance;

    private SysApplication() {  
    }

    public synchronized static SysApplication getInstance() {
        if (null == instance) {
            instance = new SysApplication();
        }
        return instance;
    }

    // add Activity 
    public void addActivity(Activity activity) {
        mList.add(activity);
    }

    public void exit() {
        try {
            for (Activity activity : mList) {
                if (activity != null)
                    activity.finish();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.exit(0);
        }
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();    
        System.gc();
    }

}
在每个Activity的onCreate方法中添加类似代码:

[java] public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     
    SysApplication.getInstance().addActivity(this);
}
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState); 
  SysApplication.getInstance().addActivity(this);
}

在需要退出程序的时候,调用:

SysApplication.getInstance().exit();
SysApplication.getInstance().exit();

简而言之,通过单例模式把每个Activity 的引用添加到一个全局链表中,每次退出程序调用System.exit(0)时,先调用链表中Activity 的finish方法

 
方法二、使用广播

2.2退出整个应用难免让人困扰,曾经一度的尝试一下方式:
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
manager.killBackgroundProcesses(package);
不行

android.os.Process.killProcess(android.os.Process.myPid());
也不行

manager.restartPackage(package);
还是不行

Intent MyIntent = new Intent(Intent.ACTION_MAIN);
MyIntent.addCategory(Intent.CATEGORY_HOME);
startActivity(MyIntent);
finish();
这个只是退回到桌面,如果打开多个Activity关闭重新打开也会有问题,还是还是不行

看到有说广播机制,发现是个好东东,能彻底解决这个问题,废话不说看代码:
public abstract class EnterActivity extends BaseActivity {
...
    // 写一个广播的内部类,当收到动作时,结束activity
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            unregisterReceiver(this); // 这句话必须要写要不会报错,不写虽然能关闭,会报一堆错
            ((Activity) context).finish();
        }
    };

    @Override
    public void onResume() {
        super.onResume();

        // 在当前的activity中注册广播
        IntentFilter filter = new IntentFilter();
        filter.addAction(Attribute.PAGENAME);
        registerReceiver(this.broadcastReceiver, filter); // 注册
    }

    /**
     * 关闭
     */
    public void close() {
        Intent intent = new Intent();
        intent.setAction(Attribute.PAGENAME); // 说明动作
        sendBroadcast(intent);// 该函数用于发送广播
        finish();
    }
...
}

第二个:

谷歌百度一下,Android中退出多个Activity的方法,大家讨论的很多。

 

在实习的时候,看到公司的项目退出多个Activity,是采用LinkedList方法,毕业设计的时候,也参照了那种方法。完成之时,无意在网上看到的可以使用广播机制退出Activity。看了一部分人的博客、文章等教程,发现也是摘抄的“很随便”,说的不详细,或不能实现。

 

看了他们的意思,写了demo,大家看看吧。主要代码如下:(不方便看的直接下整个工程)

 

为了代码的简洁性,抽取出一个基类BaseActivity(自定义的,当然,你也可以不写这个基类,只要在你项目的每个Activity里实现其中的代码即可),让你代码中要关闭的Activity都继承这个BaseActivity。

 

 

Java代码    收藏代码
  1. public class BaseActivity extends Activity {  
  2.     protected BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {  
  3.         @Override  
  4.         public void onReceive(Context context, Intent intent) {  
  5.             finish();  
  6.         }  
  7.     };  
  8.       
  9.     @Override  
  10.     public void onResume() {  
  11.         super.onResume();  
  12.         // 在当前的activity中注册广播  
  13.         IntentFilter filter = new IntentFilter();  
  14.         filter.addAction("ExitApp");  
  15.         this.registerReceiver(this.broadcastReceiver, filter);  
  16.     }  
  17.       
  18.     @Override  
  19.     protected void onDestroy() {  
  20.         // TODO Auto-generated method stub  
  21.         super.onDestroy();  
  22.         this.unregisterReceiver(this.broadcastReceiver);    
  23.     }  
  24. }  
 

 

在你要关闭的Activity里添加myExit()方法,然后在要进行退出程序操作的地方调用myExit()方法就行。

Java代码    收藏代码
  1. ublic class Activity1 extends BaseActivity {  
  2.     private Button btn1;  
  3.       
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         // TODO Auto-generated method stub  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.a1);  
  9.           
  10.         btn1 = (Button)findViewById(R.id.btn1);  
  11.         btn1.setOnClickListener(new View.OnClickListener() {  
  12.               
  13.             @Override  
  14.             public void onClick(View v) {  
  15.                 Intent i = new Intent(Activity1.this, Activity2.class);  
  16.                 startActivity(i);  
  17.             }  
  18.         });  
  19.     }  
  20.     /** 
  21.      * 捕获手机物理菜单键 
  22.      */  
  23.     private long exitTime = 0;  
  24.   
  25.     @Override  
  26.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  27.         if(keyCode == KeyEvent.KEYCODE_BACK){//&& event.getAction() == KeyEvent.ACTION_DOWN  
  28.             if((System.currentTimeMillis()-exitTime) > 2000){  
  29.                 Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();  
  30.                 exitTime = System.currentTimeMillis();  
  31.             } else {  
  32.                 myExit();  
  33.             }  
  34.             return true;  
  35.         }  
  36.         return super.onKeyDown(keyCode, event);  
  37.     }  
  38.       
  39.     protected void myExit() {  
  40.         Intent intent = new Intent();  
  41.         intent.setAction("ExitApp");  
  42.         this.sendBroadcast(intent);  
  43.         super.finish();  
  44.     }  
  45.       
  46.   
  47.       
  48. }  

 

整个项目工程:


路径:

http://www.baidu.com/link?url=UnP0WXOzs_WIgWdglUwi8TeTnas5RtoUPIz2ByJ5TyycF46u87h4OPzM-jQDR7-s874q8YDTUACOS82gPgPstq


http://www.baidu.com/link?url=5XUvbQoV5_oMb0ZPSlFOxb9rzwtg63p8utB7ua7evhzDt1xzpupAzyNYc6OfTlel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值