1.使用List集合方式

用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方法中添加类似代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SysApplication.getInstance().addActivity(this);
}

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

SysApplication.getInstance().exit();

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

优点:实现简单,逻辑清晰

2.使用广播

推荐!!好方便!!

基本逻辑就是:定义一个BaseActivity,在这个Activity中绑定广播,在广播的onReceive方法中调用finish();然后以后的Activity都继承这个Activity,退出时发送广播,退出BaseActivity,父activity都退出了,子activity肯定退出。

代码如下:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity; public class BaseActivity extends AppCompatActivity { protected BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
}; @Override
public void onResume() {
super.onResume();
// 在当前的activity中注册广播
IntentFilter filter = new IntentFilter();
filter.addAction("ExitApp");
this.registerReceiver(this.broadcastReceiver, filter);
} @Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy(); //解除绑定
this.unregisterReceiver(this.broadcastReceiver);
} }

  一个Activity实例:

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; public class ActivityC extends BaseActivity { Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity_c);
SysApplication.getInstance().addActivity(this);
btn = (Button) findViewById(R.id.acticityc_btn);
//关闭所有的activity
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { }
}); }
/**
* 捕获手机物理菜单键
*/
private long exitTime = 0; @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){//&& event.getAction() == KeyEvent.ACTION_DOWN
if((System.currentTimeMillis()-exitTime) > 2000){
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
myExit();
}
return true;
}
return super.onKeyDown(keyCode, event);
} protected void myExit() {
//第二种退出方法
// SysApplication.getInstance().exit();
Intent intent = new Intent();
intent.setAction("ExitApp");
this.sendBroadcast(intent);
//super.finish();
} @Override
protected void onStop() {
super.onStop();
Log.i("tag","ActivityC-onStop");
} @Override
protected void onDestroy() {
super.onDestroy();
Log.i("tag","ActivityC-onDestroy");
}
}

  就是在退出的地方调用这个:

private long exitTime = 0;

    @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){//&& event.getAction() == KeyEvent.ACTION_DOWN
if((System.currentTimeMillis()-exitTime) > 2000){
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
myExit();
}
return true;
}
return super.onKeyDown(keyCode, event);
} protected void myExit() {
//第二种退出方法
// SysApplication.getInstance().exit();
Intent intent = new Intent();
intent.setAction("ExitApp");
this.sendBroadcast(intent);
//super.finish();
}

  优点:方便,方便!!只需要在退出的地方发送广播就可以!!

这是我的退出时的输出:

08-09 15:33:48.869 26919-26919/example.com.closeapp I/tag: MainActivity-onPause
08-09 15:33:49.279 26919-26919/example.com.closeapp I/tag: MainActivity-onStop
08-09 15:33:51.569 26919-26959/example.com.closeapp D/OpenGLRenderer: endAllStagingAnimators on 0x55850598b0 (RippleDrawable) with handle 0x5585041510
08-09 15:33:56.079 26919-26919/example.com.closeapp I/tag: MainActivity-onDestroy
08-09 15:33:56.089 26919-26919/example.com.closeapp I/tag: ActivityB-onDestroy
08-09 15:33:56.399 26919-26919/example.com.closeapp I/tag: ActivityC-onDestroy

  

退出多个activity的方法的更多相关文章

  1. Android中使用广播机制退出多个Activity

    谷歌百度一下,Android中退出多个Activity的方法,大家讨论的很多. 在实习的时候,看到公司的项目退出多个Activity,是采用LinkedList方法,毕业设计的时候,也参照了那种方法. ...

  2. Android中退出多个Activity的两个经典方法

    这里介绍两种方法:一种把每个activity记住,然后逐一干掉:另一种思路是使用广播. 方法一.用list保存activity实例,然后逐一干掉 上代码: import java.util.Linke ...

  3. andriod一次退出所有的Activity

    自己实现了一个Activity管理,可以实现一次退出所有的Activity.在Activity启动的时候,将调用里面的put方法,将Activity对象加入进来.在要退出某个activity的时候,将 ...

  4. 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)

      退出Activity注册Android遍历   目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方 ...

  5. 从注冊流程 分析怎样安全退出多个Activity 多种方式(附DEMO)

    前言 因为一个同学问到我怎样依照一个流程走好之后回到首页.我曾经看到过4个解决方式,后来发现有做个记录和总结的必要,就写了这篇博文. (之前看小强也写过一篇,这里通过自身的分析完整的总结一下下面6种方 ...

  6. 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)

    前言   由于一个同学问到我如何按照一个流程走好之后回到首页,我以前看到过4个解决方案,后来发现有做个记录和总结的必要,就写了这篇博文.(之前看小强也写过一篇,这里通过自身的分析完整的总结一下以下6种 ...

  7. Activity 重载方法 onStart和onResume、onPause和onStop的区别

    Activity 重载方法 onStart和onResume.onPause和onStop的区别 首先了解Activity的四种状态 Running状态:一个新的Activity启动入栈后,它在屏幕最 ...

  8. 如何安全退出多个Activity

    我们在项目开发的时候可能会遇到安全退出应用的场景,如何能够安全退出多个Activity?网上有很多方法,如下: 1.抛异常退出 该方法通过抛异常,使程序Force Close.验证可以,但是,需要解决 ...

  9. You need to use a Theme.AppCompat theme (or descendant) with this activity解决方法

    报错如下:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test2/com.exampl ...

随机推荐

  1. apache解析多个域名

    之前搭建了一个网站在这台服务器上,今天心血来潮准备搭建个word press 博客,准备使用二级域名 blog.xdlxb.cn 来解析. 只需要设置httpd.conf 文件就可以了 如下 开启重定 ...

  2. Halcon与opencv格式的转换

    IplImage* ImageProcess::HImageToIplImage(Hobject &Hobj) { IplImage* pImage; HTuple htChannels; c ...

  3. 使用Spark分析拉勾网招聘信息(四): 几个常用的脚本与图片分析结果

    概述 前一篇文章,已经介绍了BMR的基础用法,再结合Spark和Scala的文档,我想应该是可以开始你的数据分析之路的.这一篇文章,着重进行一些简单的思路上的引导和分析.如果你分析招聘数据时,卡在了某 ...

  4. 用redux构建购物车

    很久没更新博客了,最近要用到react,再来跟大家分享一个redux案例吧. [ {"id": 1, "title": "iPad 4 Mini&qu ...

  5. Ajax长轮询

    前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Wait.asp ...

  6. 把DataTable转换为泛型List<T>或是JSON

    在开发ASP.NET Web API或ASP.NET MVC时,我们从数据库得到的数据往往是DataSet或是DataTable.为了能让前端JQuery能方便使用至这些数据,我们需要把这些数据转换为 ...

  7. 目标平台、活动平台 配置,出现未能加载文件或程序集“xxx”或它的某一个依赖项报错

    今天在做动态加载程序集的时候,发现明明程序集存在的情况下,还是依然报“未能加载文件或程序集“xxx”或它的某一个依赖项报错”的错误,排除了程序和配置的错误后,怀疑是否是环境的问题,于是百度加msdn后 ...

  8. 常用Eclipse快捷方式

    Ctrl+1 快速修复 Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ 当前行和下面一行交互位置(特 ...

  9. 介绍开源的.net通信框架NetworkComms框架 源码分析(八)SharpZipLibGzipCompressor

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  10. NanUI for Winform 使用示例【第二集】——做一个所见即所得的Markdown编辑器

    经过了这一个多星期的调整与修复,NanUI for .NET Winform的稳定版已经发布.应广大群友的要求,现已将NanUI的全部代码开源. GitHub: https://github.com/ ...