Android退出应用最优雅的方式(改进版)

我们先来看看几种常见的退出方法(不优雅的方式)

一、容器式

建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Activity

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;

public class BaseActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 添加Activity到堆栈
    AtyContainer.getInstance().addActivity(this);
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    // 结束Activity&从栈中移除该Activity
    AtyContainer.getInstance().removeActivity(this);
  }

}

class AtyContainer {

  private AtyContainer() {
  }

  private static AtyContainer instance = new AtyContainer();
  private static List<Activity> activityStack = new ArrayList<Activity>();

  public static AtyContainer getInstance() {
    return instance;
  }

  public void addActivity(Activity aty) {
    activityStack.add(aty);
  }

  public void removeActivity(Activity aty) {
    activityStack.remove(aty);
  }

  /**
   * 结束所有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();
  }

}

这种方法比较简单, 但是可以看到activityStack持有这Activity的强引用,也就是说当某个Activity异常退出时,activityStack没有即使释放掉引用,就会导致内存问题,接下来我们看一种类似的方式,但是会稍微优雅一点点

二、广播式

通过在BaseActivity中注册一个广播,当退出时发送一个广播,finish退出

public class BaseActivity extends Activity {

  private static final String EXITACTION = "action.exit";

  private ExitReceiver exitReceiver = new ExitReceiver();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    IntentFilter filter = new IntentFilter();
    filter.addAction(EXITACTION);
    registerReceiver(exitReceiver, filter);
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(exitReceiver);
  }

  class ExitReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
      BaseActivity.this.finish();
    }

  }

}

三、进程式

通过直接杀死当前应用的进程来结束应用,简单粗暴,而且有(wu)效!

  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(0);

  ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  manager.killBackgroundProcesses(getPackageName());

这三种都能达到同样的效果,但是在模拟器上都会弹出 Unfortunately , XXX has stopped 消息提示框,但确实能退出应用。部分真机直接失效,只能finish当前Activity(比如我手上这台小米note,国产的几款ROM fw层改动太多,使用这种方式需慎重) 。
四、 RS优雅式

什么是RS式呢?即Receiver+singleTask 。我们知道Activity有四种加载模式,而singleTask就是其中的一种,使用这个模式之后,当startActivity时,它先会在当前栈中查询是否存在Activity的实例,如果存在,则将其至于栈顶,并将其之上的所有Activity移除栈。我们打开一个app,首先是一个splash页面,然后会finish掉splash页面。跳转到主页。然后会在主页进行N次的跳转,期间会产生数量不定的Activity,有的被销毁,有的驻留在栈中,但是栈底永远是我们的HomeActivity。这样就让问题变得简单很多了。我们只需两步操作即可优雅的实现app的退出。

1、在HomeActivity注册一个退出广播,和第二个广播式一样,但是这里只需要在HomeActivity一个页面注册即可。

2、设置HomeActivity的启动模式为singleTask。
当我们需要退出的时候只需要startActivity(this,HomeActivity,class), 再发送一个退出广播。上面代码首先会把栈中HomeActivity之上的所有Activity移除出栈,然后接到广播finish自己。一切OK ! 没有弹框,不用考虑机型Rom适配。不会有内存问题,就是那么的优雅,简单!

五、SingleTask改版式

和一些小伙交流之后,很多小伙伴说注册广播略显麻烦,在楼下的小伙伴提出了一种更简单的方式,思路也很简单,
      1、设置MainActivity的加载模式为singleTask
      2、重写MainActivity中的onNewIntent方法
      3、需要退出时在Intent中添加退出的tag
  由于很多小伙伴对源码需求比较热切,我们这里就直接以代码的形式为大家讲解这种方式
第一步设置MainActivity的加载模式为singleTask

android:launchMode="singleTask"

第二步重写onNewIntent()方法

 private static final String TAG_EXIT = "exit";

  @Override
  protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (intent != null) {
      boolean isExit = intent.getBooleanExtra(TAG_EXIT, false);
      if (isExit) {
        this.finish();
      }
    }
  }

第三步 退出

Intent intent = new Intent(this,MainActivity.class);
    intent.putExtra(MainActivity.TAG_EXIT, true);
    startActivity(intent);

六、懒人式
这种方式更加简单,只需要如下两步操作

  • 1、将MainActivity设置为singleTask
  • 2、将退出出口放置在MainActivity

我们可以看到很多应用都是双击两次home键退出应用,就是基于这样的方式来实现的,这里在贴一下如何处理连续两次点击退出的源码

private boolean mIsExit;
@Override
  /**
   * 双击返回键退出
   */
  public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_BACK) {
      if (mIsExit) {
        this.finish();

      } else {
        Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
        mIsExit = true;
        new Handler().postDelayed(new Runnable() {
          @Override
          public void run() {
            mIsExit = false;
          }
        }, 2000);
      }
      return true;
    }

    return super.onKeyDown(keyCode, event);
  }

以上就是关于Android退出应用最优雅的方式详细介绍,希望对大家的学习Android有所帮助。

(0)

相关推荐

  • Android 安全退出应用程序的方法总结

    Android 安全退出应用程序的方法总结 正常关闭应用程序: 当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用: 第一种方法:首先获取当前进程的id,然后杀死该进程. android.os.Process.killProcess(android.os.Process.myPid()) 通过这种方式不能将应用程序完全杀死,并且他不会把当前应用应用的Activity的task任务栈清空 第二种方法:终止当前正在运行的Java虚拟机,导致程序终止 System.exit

  • Android 退出应用程序的实现方法

    Android 退出应用程序的实现方法 android 退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(也就是入口的Activity)时生效.如果有A,B,C三个Activity,而想在B 或C 中Activity 退出,调用上面的方法,往往会销毁当前的Activity 返回上一个Activity.当然也可以逐个返回上一个Activity,直到

  • Android 完全退出应用程序的解决方法

    有一种需要,我们在菜单项中点击退出应用程序,应用程序就退出,不需要回到MainActivity 设计: 有两个应用界面MainActivity和BActivity,以及用于程序的通用类ExitUtil 步骤: 1.添加一个类,名为ExitUtil 复制代码 代码如下: public class ExitUtil { public static final int EXIT_APPLICATION = 0x0001; private Context mContext; public ExitUti

  • Android中双击返回键退出应用实例代码

    Android中双击返回键退出程序 1.在MyAppliction中(继承Application) //运用list来保存们每一个activity是关键 private List<Activity> mList = new LinkedList<Activity>(); //为了实现每次使用该类时不创建新的对象而创建的静态对象 private static MyApplication instance; //构造方法 public MyApplication() { } //实例化

  • android 完全退出应用程序实现代码

    android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(也就是入口的Activity)时生效.如果有A,B,C三个Activity,而想在B或C中Activity退出,调用上面的方法,往往会销毁当前的Activity返回上一个Activity.当然也可以逐个返回上一个Activity,直到跳转到入口的Activity,最后退出应用程序.但

  • Android实现长按back键退出应用程序的方法

    本文实例讲述了Android实现长按back键退出应用程序的方法.分享给大家供大家参考.具体分析如下: 最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序.在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序.参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面这种方法,实现起来比较简单: @Override public boolean onKeyDown(int keyCode, KeyEvent ev

  • Android Back键点击两次退出应用详解及实现方法总结

    思路:Android中捕获用户按键是在onKeyDown方法中,只需要判断用户按键是否是KEYCODE_BACK即后退键即可,剩下的即为判断两次点击BACK键时间间隔问题了 第一种实现方式 package com.example.clickexittest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import andr

  • Android实现点击两次BACK键退出应用

    思路:Android中捕获用户按键是在onKeyDown方法中,只需要判断用户按键是否是KEYCODE_BACK即后退键即可,剩下的即为判断两次点击BACK键时间间隔问题了. 第一种实现方式: package com.example.clickexittest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import an

  • Android完全退出应用程序的方法

    本文实例讲述了Android完全退出应用程序的方法.分享给大家供大家参考.具体如下: 在Android中,如果想退出Android程序,一般都是调用finish().System.exit(0).android.os.Process.killProcess(android.os.Process.myPid())等方法来实现退出程序功能,可是在实际开发中,并不能达到完全退出应用程序的效果,这是因为调用finish().System.exit(0).android.os.Process.killPr

  • Android退出应用最优雅的方式(改进版)

    我们先来看看几种常见的退出方法(不优雅的方式) 一.容器式 建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Activity import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; public class BaseActivity extends Activity { @Override protected

  • Android 退出多Activity的application的方式方法

    在开发过程中,我们常常需要一个退出功能,来退出该应用的所有Activity.下面,我们列举一些退出应用的几种方式. 1.利用ActivityContainer来管理所有的Activity的引用 2.使用广播通知BaseActivity结束 3.直接杀死进程 4.采用SingleTask的特点,结束应用 5.第四种方式的更优雅实现 6.双击返回键退出 方式一:利用ActivityContainer管理所有的Activity引用 该方式是建立一个通用的Activity的父类 BaseActivity

  • Android优雅的方式解决软键盘遮挡按钮问题

    前言 比如在进行登录的操作中,用户输入完密码之后,肯定是想直接点击登录按钮的.返回键隐藏软键盘这样的体验肯定很糟糕,程序员,遇到问题解决问题. 实现1 xml <ScrollView android:id="@+id/scrollview" android:layout_width="match_parent" android:layout_height="wrap_content" android:fadingEdge="non

  • Android 中WebView 截图的实现方式

    Hybrid App 中网页部分的分享方式越来越趋向于多元化,比较常见的用户操作方式有:复制网页链接式,直接选择目标应用自动分享式等.其中,截图行为,越来越成为丰富用户操作.备受用户喜爱的互动方式之一,我们在很多内容社区类应用中都能看到这种功能.这篇文章总结一下 Android 应用中 WebView 截图的实现方式. WebView 作为一种特殊的控件,自然不能像其他系统 View 或者截屏的方式来获取截图(多为截取长图).如: public static Bitmap getScreenSh

  • Android 使用flow实现倒计时的方式

    Android 倒计时一般实现方式: handler+postDelayed() 方式 Timer + TimerTask + handler 方式 ScheduledExecutorService + handler 方式 RxJava 方式 CountDownTimer 方式 现在因为有了协程和Flow,我们可以借助Flow这个工具,更加优雅地实现这个需求功能. 1.依赖导入 api 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'

  • iOS 开发之 - 关闭键盘 退出键盘 的5种方式

    iOS 开发之 - 关闭键盘 退出键盘 的5种方式  1.点击编辑区以外的地方(UIView) 2.点击编辑区域以外的地方(UIControl) 3.使用制作收起键盘的按钮 4.使用判断输入字元 5.关于键盘遮蔽的问题 1,点击编辑区以外的地方(UIView) 这是一种很直觉的方法,当不再需要使用虚拟键盘时,只要点击虚拟键盘和编辑区域外的地方,就可以将键盘收起,下面程式码是在 UIView 中内建的触碰事件方法函式,您可以参考 Touch Panel / 触碰萤幕 / 压力感应器的基本使用方式一

  • 分享实现Android图片选择的两种方式

    Android选择图片的两种方式: 第一种:单张选取 通过隐式启动activity,跳转到相册选择一张返回结果 关键代码如下: 发送请求: private static final int PICTURE = 10086; //requestcode Intent intent = new Intent(); if (Build.VERSION.SDK_INT < 19) {//因为Android SDK在4.4版本后图片action变化了 所以在这里先判断一下 intent.setAction

  • Android 启动activity的4种方式及打开其他应用的activity的坑

    Android启动的四种方式分别为standard,singleTop,singleTask,singleInstence. standard是最常见的activity启动方式,也是默认的启动的方式.当启动一个activity的时候他将进入返回栈的栈顶.系统不会管栈内是否有相同的activity,方式像后入先出. singleTop方式是在活动启动的时候,系统先判定栈顶是否有相同的活动,如果没有则新建活动,否则将不新建活动.而是直接使用他. singleTask方式在活动启动的时候,系统先判定栈

  • Android View移动的3种方式总结

    前言 在Android开发中,View一直是Android开发人员的一块心病,一方面想要进阶,一方面又害怕进阶,可以说Android的View是进阶路上的最大绊脚石,因为它涉及的东西太多了,比如本次我们此次要写的View移动,另外还包括View的触摸事件的传递,创建自定义View,这些都是极其重要且不得不面对的难题.但是无论如何,现在不克服的困难将来就会被困难克服. 在此之前,我们还是先了解Android坐标系的定义规则以及View的一些位置参数. Android坐标系 View的位置及大小是由

随机推荐