欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-12 15:31:22
在开发过程中,我们常常需要一个退出功能,来退出该应用的所有activity。下面,我们列举一些退出应用的几种方式。 1.利用activitycontainer来管理所...

在开发过程中,我们常常需要一个退出功能,来退出该应用的所有activity。下面,我们列举一些退出应用的几种方式。

1.利用activitycontainer来管理所有的activity的引用

2.使用广播通知baseactivity结束

3.直接杀死进程

4.采用singletask的特点,结束应用

5.第四种方式的更优雅实现

6.双击返回键退出

方式一:利用activitycontainer管理所有的activity引用

该方式是建立一个通用的activity的父类 baseactivity以及一个activitycontainer类,activitycontainer是一个集合类来保存所有activity的引用,关键的代码如下:

public class baseactivity extends appcompatactivity {

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
 activitycontainer.getinstance().addactivity(this);
   }

 

  @override
  protected void ondestroy() {
    super.ondestroy();
    activitycontainer.getinstance().removeactivity(this);
  }
}
class activitycontainer {
  private activitycontainer(){

  }

  private static activitycontainer instance = new activitycontainer();
  private static list<appcompatactivity> activitystack = new linkedlist<>();


  public static activitycontainer getinstance(){
    return instance;
  }

  public void addactivity(appcompatactivity aty) {
    activitystack.add(aty);
  }

  public void removeactivity(appcompatactivity 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();
  }
}

然后真正的业务需求的activity分别继承自baseactivity,在需要退出应用的时候,执行

activitycontainer.getinstance().finishallactivity();

方式二:使用广播通知baseactivity结束

在原有的baseactivity的基础上,创建一个广播接收器,当收到广播通知的时候,执行baseactivity.this.finish();

baseactivity的代码如下:

public class baseactivity extends appcompatactivity {

  protected static final string exitaction = "action.exit";

  private exitreceiver mexitreceiver = new exitreceiver();

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    intentfilter intentfilter = new intentfilter();
    intentfilter.addaction(exitaction);
    registerreceiver(mexitreceiver, intentfilter);
  }

 

  @override
  protected void ondestroy() {
    super.ondestroy();
    unregisterreceiver(mexitreceiver);
  }

  class exitreceiver extends broadcastreceiver {
    @override
    public void onreceive(context context, intent intent) {
      baseactivity.this.finish();
    }
  }

}

方式三:直接杀死进程

该方法是通过系统提供的杀死进程的方法来杀死当前activity所在的进程,但由于各种定制rom对底层修改的太多,导致很多时候该方法并不能奏效

方式一  android.os.process.killprocess(android.os.process.mypid());

方式二 system.exit(0); 

方式三 activitymanager manager = (activitymanager) getsystemservice(activity_service);
manager.killbackgroundprocesses(getpackagename());

方式四:采用singletask的特点,结束应用

我们的应用一般的activity打开顺序是最开始的splash页面,然后调转到我们的主activity,同时finish掉splash页面,然后在主activity上面进行各种activity的跳转,这些跳转的activity,有的finish掉,有的在任务栈中。如果我们设定主activity的启动模式是singletask,然后从该activity启动的activity的启动模式是默认模式,则这些acitivty都会和主activity在一个任务栈中,并且主activity会在栈底。这时,当我们退出的时候,启动主activity,并且给主activity发送一个退出acitivity的广播,则因为singletask的特点,会清空其上所有的activity上面的所有activity,广播会通知主activity结束自己,则就完整的退出了所有的activity。

具体的步骤如下:

1.在mainactivity中注册一个广播,该广播内容是mainactivity.this.finish()

2.当在选项页面,点击退出按钮时,启动mainactivity,会因为singletask的特点,清空掉其他的activity,在启动的时候,send一个广播,给mainactivity,让其结束。

3.退出全部应用

方式五:第四种方式的更优雅实现

第四种方式的思路是正确的,但是最后通过广播来通知mainactivity退出的形式,确实不是很好。对于activity的实现,有更好的方式,就是借助onnewintent的方法。

该方法是在activity重新从后台回到前台的时候会调用,完整的方法调用是onnewintent-onrestart-onresume。我们可以在onnewintent中实现mainactivity的退出。

@override
  protected void onnewintent(intent intent) {
    super.onnewintent(intent);
    log.e("main", "onnewintent调用");
    if (intent != null) {
      boolean isexit = intent.getbooleanextra(action, false);
      if (isexit) {
        this.finish();
      }
    }
  }

当在选项页面,点击退出按钮时,启动mainactivity时,intent携带一个退出的参数,当检测到该参数的时候,退出应用。

方式六:双击返回键退出

双击退出键是比较简答有效的一种退出方式,比较适用于退出的界面是mainactivity,利用mainactivity的singletask的特性,但回到前台的时,清空其上的其他activity。这时,在mainactivity上监听keydown事件,双击退出。
 代码如下:

 @override
  public boolean onkeydown(int keycode, keyevent event) {
    if (keycode == keyevent.keycode_back) {
      if (isexit) {
        this.finish();
      }else {
        toast.maketext(this, "再按一次退出", toast.length_short).show();
        isexit = true;
        new handler().postdelayed(new runnable() {
          @override
          public void run() {
            isexit = false;
          }
        },2000);
        return true;
      }
    }
    return super.onkeydown(keycode, event);
  }

在这里,是由一个handler来实现一个计时器的功能,保证2s之内,不过不在返回,则恢复状态。这个计时器有多种实现方式,比如计时器,如下:

new timer().schedule(new timertask() {
          @override
          public void run() {
           isexit = false;
          }
        },2000);

又或者简单的计算时间差,该方式实在太多简单,就不多说了。

源码地址:activityquitdemo_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: