关于app退出的问题,完美退出方式

2023-11-11

实际开发中会有很多关于app的退出问题,我个人比较常见的有两种:

一、双击退出

比如说我们在首页的时候需要一个双击退出的方法,点击第一次手机的返回键时提示:“再点一次退出应用”。之类的话语,我们可以这样做,对重写onKeyDown方法,当他第一次点击的时候提示文字,给一个几秒的间隔,在这个时间段内第二次点击退出,才退出应用,首先定义一个静态变量

private static boolean isExit = false;
然后重写onKeyDown方法,点击在某个时间段内点击两次退出,才退出应用,当然我们不能再主线程里面操作视图,这样我们就需要利用到handler,具体代码如下:

//主线程处理视图,isExit默认为false,就是点击第一次时,弹出"再按一次退出程序"
    //点击第二次时关闭应用
    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            isExit = false;
        }
    };

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            exit();
            return false;
        }
        return super.onKeyDown(keyCode, event);
    }

    /**
     * 点击两次退出程序
     */
    private void exit() {
        if (!isExit) {
            isExit = true;
            Toast.makeText(getApplicationContext(), "再按一次退出程序",
                    Toast.LENGTH_SHORT).show();
            // 利用handler延迟发送更改状态信息
            mHandler.sendEmptyMessageDelayed(0, 2000);
        } else {
            finish();
            //参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
            System.exit(0);
        }
    }

二、在登录页面点击退出

在实际开发中,我们需要在个人中心退出登录,当我们退出登录后我们一般正常逻辑是退出当前页面跳转到登录页面,这是我们就在登录页面可以重新登录,或者退出应用,这是我们点击返回键就不是返回上一个页面了,如果这时我们返回上个页面就很尴尬了,就比如说我退出登录了然后我返回我又是登录页面。当然你可以在再页面中在onResume中写个一个刷新页面的方法,但是我个人觉得这时你退出后在返回总是不合理的即使你做了刷新操作刷新掉了登录状态,但是我觉得总不好

因此我们需要把登录页面的退出改为点击手机返回键后提示弹框是否退出应用,点击确定在activity栈中找到所有的activity销毁掉然后退出,这样我们可以首先写一个appManager的Activity的管理类

package com.demo.assets.util;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;

import java.util.Stack;

/**
 * Created by 唐小糖 on 2017/6/15.
 * 应用程序Activity管理类:用于Activity管理和应用程序退出
 * 可以让所有的activity都继承BaseActivity然后给activity在onCreate中添加到栈中onDetroyed中移除
 *
 * 添加Activity到堆栈
 * AppManager.getAppManager().addActivity(this);
 * 结束Activity&从堆栈中移除
 * AppManager.getAppManager().finishActivity(this);
 *
 */

public class AppManager {
    private static Stack<Activity> activityStack;
    private static AppManager instance;

    private AppManager(){}
    /**
     * 单一实例
     */
    public static AppManager getAppManager(){
        if(instance==null){
            instance=new AppManager();
        }
        return instance;
    }
    /**
     * 添加Activity到堆栈 */
    public void addActivity(Activity activity){
        if(activityStack==null){
            activityStack=new Stack<Activity>();
        }
        activityStack.add(activity);
    }
    /**
     * 获取当前Activity(堆栈中最后一个压入的)
     */
    public Activity currentActivity(){
        Activity activity=activityStack.lastElement();
        return activity;
    }
    /**
     * 结束当前Activity(堆栈中最后一个压入的)
     */
    public void finishActivity(){
        Activity activity=activityStack.lastElement();
        finishActivity(activity);
    }
    /**
     * 结束指定的Activity
     */
    public void finishActivity(Activity activity){
        if(activity!=null){
            activityStack.remove(activity);
            activity.finish();
            activity=null;
        }
    }
    /**
     * 结束指定类名的Activity
     */
    public void finishActivity(Class<?> cls){
        for (Activity activity : activityStack) {
            if(activity.getClass().equals(cls) ){
                finishActivity(activity);
            }
        }
    }
    /**
     * 结束所有Activity
     */
    public void finishAllActivity(){
        for (int i = 0, size = activityStack.size(); i < size; i++){
            if (null != activityStack.get(i)){
                activityStack.get(i).finish();
            }
        }
        activityStack.clear();
    }
    /**
     * 退出应用程序
     */
    public void AppExit(Context context) {
        try {
            finishAllActivity();
            ActivityManager activityMgr= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            activityMgr.restartPackage(context.getPackageName());
            System.exit(0);
        } catch (Exception e) { }
    }
}

在写好管理类后我们有两种方法去做,第一、我们可以让所有的Activity继承BaseActivity,然后在BaseActivity中的oncreate方法中把这个Activity加入到栈里去
 //添加Activity到堆栈
        AppManager.getAppManager().addActivity(this);

在onDestroyed中销毁掉

   //结束Activity&从堆栈中移除
        AppManager.getAppManager().finishActivity(this);

最后在登录页面点击退出出现弹框,确定后我们调用AppManager的退出方法,登录页面代码如下

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            CommonUtils.Exit(this);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

CommonUtils类代码如下

package com.demo.assets.util;

import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;

/**
 * Created by 唐小糖 on 2017/6/15.
 *  登录页面点击返回键退出应用
 */

public class CommonUtils {

    /**
     * 退出程序
     * @param cont
     */

    public static void Exit(final Context cont)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(cont);
        builder.setIcon(android.R.drawable.ic_dialog_info);
        builder.setTitle("确定退出维修资金吗?");
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                //退出
                AppManager.getAppManager().AppExit(cont);
            }
        });
        builder.setNegativeButton("再逛逛", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder.show();
    }
}
第二种、方法就是如果你不继承BaseActivity的话就在每个Activity中在oncreate中添加到appManager中的栈,onDestroy中移除,总之一句就是有多少个Activity就执行多少次

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于app退出的问题,完美退出方式 的相关文章

随机推荐

  • IDEA调试for循环

    public static void main String args List
  • Unity2019.1中文技术手册离线版

    使用离线版优质 系统化的教程 经验文档 参考手册 为开发者节省时间 提高效率 解压后打开UnityDocumentation 2019 1 Manual index html 需要的自取 下载地址 https pan baidu com s
  • linux 下 驱动与设备的名字 主副设备号的区别

    proc devices目录 cat proc devices Character devices 1 mem 4 dev vc 0 4 tty 5 dev tty 5 dev console 5 dev ptmx 7 vcs 10 mis
  • element tiptap安装报错Duplicate use of selection JSON ID cell

    刚开始报错搜了一下说找到node modules tiptap extensions node modules 把最后的 node modules 目录名字修改为 node modules 管用 然后第二天打开项目又报错 后来又报错找到文档
  • failed for get of /hbase/hbaseid, code = CONNECTIONLOSS, retries = 1

    我正在尝试将Spark应用程序与hbase连接 以下是我给的配置 val conf HBaseConfiguration create conf set hbase master localhost 16010 conf setInt ti
  • mac电脑怎么打开终端

    有时候需要输入命令 说是要打开终端 那么mac电脑怎么打开终端 3种方法来在Mac电脑上打开终端 这篇文章将教你如何在macOS系统上使用 启动台 聚焦搜索 或 访达 程序来打开终端 方法 1 使用启动台 打开启动台 如图所示 找到其他 如
  • UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position 163: illegal multibyte sequence

    项目场景 python的execjs执行接js报编码错误 UnicodeDecodeError gbk codec can t decode byte 0xae in position 163 illegal multibyte seque
  • centos7在使用docker安装redis

    为什么要docker安装redis 实际工作中用了redis都是工具查询 可没有对redis的安装和配置涉及到 特地简单研究下 对redis内部的一些基本操作产生了一些兴趣 docker安装redis 1 docker 搜索redis do
  • 【金融工程实验】【matlab】使用candle函数画日均k线图

    使用candle函数画日均k线图 要求 数据 数据读入 数据处理 显示图形 本实验为课程设计需求 要求 下载一支股票2020年2月 3月的日线数据 并用MATLAB绘制日K线图 要求绘制5日均线和20日均线 数据 使用海王星软件导出的股票数
  • 控制工程专业英语词汇

    电路 中文 英文 电路 网络 Network 电路 Circuitry 电阻器 Resistor 电感器 Inductor 电容器 Capacitor 晶体管 Transistor 半导体 Semiconductor 晶体 Crystal
  • C语言EasyX_2018中的putimage(x, y, w, h, img, x1, y1)函数

    putimage x y w h img x1 y1 函数一共有六个参数 以下解释来自EasyX 2018的帮助文件 这个函数的几个重载用于在当前设备上绘制指定图像 绘制图像 void putimage int dstX 绘制位置的 x 坐
  • 自定义R语言中表头上下横线的线条类型和线条粗细

    自定义R语言中表头上下横线的线条类型和线条粗细 在R语言中 可以使用tab add hline函数来添加表格的水平线条 其中包括表头上下的横线 本文将详细介绍如何使用tab add hline函数来自定义表头上下横线的线条类型和线条粗细 首
  • js网络图片转base64

    先拿到一张图片地址 var imgUrl https www callmysoft com static index images image dgital 20creativity png 第一种方式 利用canvas canvas to
  • C 、C++ 、Java、Python、JavaScript数据类型对比介绍

    C C Java Python JavaScript数据类型对比介绍 C C Java Python JavaScript数据类型对比如下 C语言 静态类型语言 需要在声明变量时指定类型 基本数据类型包括 整型 int 通常分为有符号 si
  • 跳槽被问离职原因怎样回答能显出高情商?

    对于员工跳槽 原因很简单 要么是收入不高 要么是得到不公平待遇 心里委屈 这真是直击离职者内心 但是 当我们重新找工作 准备跳槽的时候 面试官很可能就会问你 你离职的原因是什么 跳槽被问离职原因怎样回答能显出高情商 广西事业单位招聘整理了如
  • 【C++】Boost库简介

    参考 https blog csdn net f110300641 article details 81865545 https www boost org doc libs 1 80 0 more getting started wind
  • 【100%通过率 】【华为OD机试c++/python】天然蓄水库【 2023 Q1考试题 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 公元2919年 人类终于发现了一颗宜居星球 X星 现想在X星一片连绵起伏的山脉间建一个天然蓄水库 如何选取水库边界 使蓄水量最大 要求 山脉用正
  • puppet—批量部署mysql5.7+httpd[包含启动]

    httpd install pp class httpd install package httpd name gt httpd ensure gt installed httpd service pp class httpd servic
  • 基于ARM的温度采集系统设计

    摘要 本设计是基于嵌入式技术作为主处理器的温度采集系统 利用S3C44B0x ARM微处理器作为主控CPU 辅以单独的数据采集模块采集数据 实现了智能化的温度数据采集 传输 处理与显示等功能 并讨论了如何提高系统的速度 可靠性和可扩展性 并
  • 关于app退出的问题,完美退出方式

    实际开发中会有很多关于app的退出问题 我个人比较常见的有两种 一 双击退出 比如说我们在首页的时候需要一个双击退出的方法 点击第一次手机的返回键时提示 再点一次退出应用 之类的话语 我们可以这样做 对重写onKeyDown方法 当他第一次