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

Android中销毁所有的Activity退出应用程序几种方式

程序员文章站 2022-04-13 17:42:08
android:销毁所有的activity退出应用程序几种方式。 我们都知道,activity是存放在栈中。在默认的情况下(standard)activity在栈中是以先进后出、后进先出的方式进...

android:销毁所有的activity退出应用程序几种方式。

Android中销毁所有的Activity退出应用程序几种方式

我们都知道,activity是存放在栈中。在默认的情况下(standard)activity在栈中是以先进后出、后进先出的方式进行存放。最开始出现的activity会存在栈底,最新启动的activity总是会存在栈顶。当我们开启的activity越来越多,当前想在某个界面退出当前应用程序的时候,或者双击返回键退出当前应用程序。这个时候只能一个一个的把当前所有启动的activity销毁,直到清空栈中的所有activity,应用程序才能退出。下面给大家介绍四种常用的退出应用程序的方法,希望能够更好的帮助大家开发!

销毁所有activity,退出应用程序常见的方式有下面四种:

(1)system.exit(0) 使用的方法,强制退出

(2) 抛出异常,强制退出

(3)使用application退出

(4) 使用广播退出

第一种方式system.exit(0):表示的是终止程序,终止当前正在运行的java,在java中我们也使用这种方式来关闭整个应用,在前期很多开发人员都是使用这种方式,我自己在开发项目过程中也用过这种方式来退出,但是有时候会在部分机型中,当退出应用后弹出应用程序崩溃的对话框,有时退出后还会再次启动,少部分的用户体验不太好。但现在也依旧还会有少部分的开发人员会使用这种方式,因为使用方式很简单,只需要在需要退出的地方加上这句代码就行。

第二种方式抛出异常,强制退出 :这种方式现在基本上已经看不到了,用户体验比第一种方式更差,就是让抛出异常、是系统崩溃、从而达到退出应用的效果。

<接下来我们主要讲解后面两种,这两种在开发过程中经常使用>

第三种方式使用application退出 :目前比较常用方法之一,我们都知道application是android的系统,当应用程序启动时,会自动帮我们创建一个application,而且一个应用程序只能存在一个application,它的生命周期也是最长的,如果需要使用自己创建的application时,这个时候我们只需要在androidmanifest.xml中的 标签中添加name属性:把创建的application完整的包名+类名放进了就行了。

那么我们如何使用application来退出当前的应用程序呢

我们来看下我写的一个使用application来退出应用程序的demo:

<创建一个继承application的类>public class myapplication extends application {

private list olist;//用于存放所有启动的activity的集合

public void oncreate() {

super.oncreate();

olist = new arraylist();

}

/**

* 添加activity

*/

public void addactivity_(activity activity) {

// 判断当前集合中不存在该activity

if (!olist.contains(activity)) {

olist.add(activity);//把当前activity添加到集合中

}

}

/**

* 销毁单个activity

*/

public void removeactivity_(activity activity) {//判断当前集合中存在该activity

if (olist.contains(activity)) {

olist.remove(activity);//从集合中移除

activity.finish();//销毁当前activity

}

}

/**

* 销毁所有的activity

*/

public void removeallactivity_() { //通过循环,把集合中的所有activity销毁

for (activity activity : olist) {

activity.finish();

}

}

}

<创建baseactivity 继承 activity> 用于管理所有的activity,所有的activity都继承这个类

public class baseactivity extends activity {

private myapplication application;

private baseactivity ocontext;

protected void oncreate(bundle savedinstancestate) {

super.oncreate(savedinstancestate);

if (application == null) {

// 得到application对象

application = (myapplication) getapplication();

}

ocontext = this;// 把当前的上下文对象赋值给baseactivity

addactivity();// 调用添加方法

}

// 添加activity方法

public void addactivity() {

application.addactivity_(ocontext);// 调用myapplication的添加activity方法

}

//销毁当个activity方法

public void removeactivity() {

application.removeactivity_(ocontext);// 调用myapplication的销毁单个activity方法

}

//销毁所有activity方法

public void removeallactivity() {

application.removeallactivity_();// 调用myapplication的销毁所有activity方法

}

/* 把toast定义成一个方法 可以重复使用,使用时只需要传入需要提示的内容即可*/

public void show_toast(string text) {

toast.maketext(ocontext, text, toast.length_short).show();

}

}

public class mainactivity extends baseactivity {

protected void oncreate(bundle savedinstancestate) {

super.oncreate(savedinstancestate);

setcontentview(r.layout.activity_main);

}

//绑定按钮

public void button(view v) {

startactivity(new intent(mainactivity.this, oneactivity.class));//跳转到oneactivity

}

//重写onkeydown方法

public boolean onkeydown(int keycode, keyevent event) {

//判断当点击的是返回键

if (keycode == event.keycode_back) {

exit();//退出方法

}

return true;

}

private long time = 0;

//退出方法

private void exit() {

//如果在两秒大于2秒

if (system.currenttimemillis() - time > 2000) {

//获得当前的时间

time = system.currenttimemillis();

showtoast("再点击一次退出应用程序");

} else {

//点击在两秒以内

removeallactivity();//执行移除所以activity方法

}

}

}

public class oneactivity extends baseactivity {

protected void oncreate(bundle savedinstancestate) {

super.oncreate(savedinstancestate);

setcontentview(r.layout.onelayout);

}

// 绑定按钮

public void button(view v) {

intent intent = new intent(this, mainactivity.class);//跳转到主界面

startactivity(intent);

}

}

android:name="com.jxsw.chong.application_closeactivity.myapplication" //注册myapplication

android:allowbackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/apptheme" >

android:name="com.jxsw.chong.application_closeactivity.mainactivity"

android:label="@string/app_name" >

我们让每个activity都继承于我们自己定义的baseactivity,每次新开启个activity,就会在baseactivity的oncreate()方法中就会执行addactivity()方法,方法里面执行的是myapplication类中添加activity的方法,把当前的activity放进集合中,当连续点击两次back返回键,执行销毁所有activity的方法。从而达到完全退出应用程序的效果。

ps:一定不要忘记在androidmanifest.xml中注册myapplication

<-----以上代码都可以直接复制粘贴可用

第四种方式使用广播退出 :使用广播来实现退出应用程序,其实实现的思路相对于第三种更简单,我们编写一个baseactivity,让其他的activity都继承于它,当我需要退出时,我们就销毁baseactivity,那么其他继承与它的activity都会销毁。

我们来看下我写的一个使用广播来退出应用程序的demo:

public class baseactivity extends activity {

private mybaseactiviy_broad obaseactiviy_broad;

protected void oncreate(bundle savedinstancestate) {

super.oncreate(savedinstancestate);

//动态注册广播

obaseactiviy_broad = new mybaseactiviy_broad();

intentfilter intentfilter = new intentfilter("drc.xxx.yyy.baseactivity");

registerreceiver(obaseactiviy_broad, intentfilter);

}

//在销毁的方法里面注销广播

protected void ondestroy() {

super.ondestroy();

unregisterreceiver(obaseactiviy_broad);//注销广播

}

//定义一个广播

public class mybaseactiviy_broad extends broadcastreceiver {

public void onreceive(context arg0, intent intent) {

//接收发送过来的广播内容

int closeall = intent.getintextra("closeall", 0);

if (closeall == 1) {

finish();//销毁baseactivity

}

}

}

/**

* 显示toast信息

*/

public void showtoast(string text) {

toast.maketext(this, text, 2000).show();

}

}

public class mainactivity extends baseactivity {

protected void oncreate(bundle savedinstancestate) {

super.oncreate(savedinstancestate);

setcontentview(r.layout.activity_main);

}

//绑定按钮

public void button(view v) {

intent intent = new intent(this, oneactivity.class);

startactivity(intent);

}

//重写onkeydown方法

public boolean onkeydown(int keycode, keyevent event) {

//点击的为返回键

if (keycode == event.keycode_back) {

exit();// 退出方法

}

return true;

}

private long time = 0;

//退出方法

private void exit() {

if (system.currenttimemillis() - time > 2000) {

time = system.currenttimemillis();

showtoast("再点击一次退出应用程序");

} else {

intent intent = new intent("drc.xxx.yyy.baseactivity");

intent.putextra("closeall", 1);

sendbroadcast(intent);//发送广播

}

}

}

public class oneactivity extends baseactivity {

protected void oncreate(bundle savedinstancestate) {

super.oncreate(savedinstancestate);

setcontentview(r.layout.onelayout);

}

// 绑定按钮

public void button(view v) {

intent intent = new intent(this, mainactivity.class);//跳转到mainactivity

startactivity(intent);

}

}

我经常使用的方式就上面两种,当然还有其他方式,我没有去研究,有其他更好的方式的,可以互相交流。