Android总结(1)---如何关闭多个Activity

总的来说有四种方法:

1、使用Application来进行关闭

public class App extends Application {  

    private static List<Activity> lists = new ArrayList<>();  

    public static void addActivity(Activity activity) {  
        lists.add(activity);  
    }  

    public static void clearActivity() {  
        if (lists != null) {  
            for (Activity activity : lists) {  
                activity.finish();  
            }  

            lists.clear();  
        }  
    }  
}  

然后写一个基类Activity,在构造构造方法调用App.addActivity(this);就可以实现。

2、使用广播的方式来进行关闭

在基类构造方法中实现注册广播,onDestroy方法取消注册

public class BaseActivity extends AppCompatActivity {  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  

        IntentFilter intentFilter = new IntentFilter();  
        intentFilter.addAction(getString(R.string.promotion_action));  
        registerReceiver(receiver, intentFilter);  
    }  

    BroadcastReceiver receiver = new BroadcastReceiver() {  
        @Override  
        public void onReceive(Context context, Intent intent) {  
            finish();  
        }  
    };  

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

接下来只需要你在想要关闭所有Activity的界面调用

//销毁所有的Activity  
//关闭本窗口
getActivity().finish();

//关闭父窗口
if(getActivity().getParent()!= null){
    getActivity().getParent().finish();
}

//关闭列表页面
Intent intent = new Intent();
intent.setAction(getString(R.string.promotion_action));
getActivity().sendBroadcast(intent);

3、使用onActivityResult递归回调的方式关闭

1)在基类Activity重写onActivityResult方法通过识别ResultCode来调用finish方法

2)接下来只需要在你想要关闭Activity调用setResult(Result_CLOSE)就可以了

public class BaseActivity extends AppCompatActivity {  
    protected final static int RESULT_CLOSE = 0;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
    }  

    @Override  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        super.onActivityResult(requestCode, resultCode, data);  
        if(resultCode == RESULT_CLOSE){  
            setResult(RESULT_CLOSE);  
            finish();  
        }  
    }  
}  

4.使用setFalgs的方式来关闭

首先先来介绍一个LaunchMode四种模式:
LaunchMode
1)standard和singleTop是相同的,每次都会创建一个新的Activity实例,区别是singleTop当压入栈的Activity与任务栈的栈顶Activit相同则不会创建实例(会调用onNewIntent方法)

2)singleInstance和singleTask是相同的,都会保证任务中没有相同的任务,(当执行的Activity与任务中某个Activity相同则会调用onNewIntent方法),不同点是(singleInstance每次都会创建一个任务栈并将Activity压入栈中),(singleTask是在一个任务栈中,如果压入栈的Activity与栈内Activity某个相同则直接将那个Activity移动到栈顶不会创建新的实例)

当然这里并没有用到这四种模式而是运用的是Intent.FLAG_ACTIVITY_CLEAR_TOP,这种标示基本和singleTop类似不同的是如果压入栈的Activity在栈内某个Activity相同则将它上面的所有Activity进行出栈操作。
在每次跳转都加上

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  

所以在最后一个Activity后退应用:

@Override  
public boolean onKeyDown(int keyCode, KeyEvent event) {  
    if (keyCode == KeyEvent.KEYCODE_BACK) {  
        //销毁所有的Activity  
        Intent intent = new Intent(this,FirstActivity.class);  
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
        startActivity(intent);  
    }  
    return super.onKeyDown(keyCode, event);  
}  

这样略先复杂,现在来说一下使用flag的另一种方法:

在退出的Activity的前一个Activity跳转加上
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);  

就可以了,现在来说一下这几个什么意思

/* 
    FLAG_ACTIVITY_CLEAR_TASK 这个标示将在这个活动开始之前清除该栈中所有的任务,将里面的Activity都finish掉 
    FLAG_ACTIVITY_TASK_ON_HOME 这个flag将造成新任务在home的上面,就是在启动的Activity点击back之后就会回到home界面 
 */  

—————————————————————————————————————————————————–

java架构师项目实战,高并发集群分布式,大数据高可用视频教程,共760G

下载地址:

https://item.taobao.com/item.htm?id=555888526201

01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
+
hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门

内容详情:

【入门篇】
J2SE的Socket网络编程应用
J2SE的反射机制高级应用
J2SE高深讲解
JAVA编程思想 中级教程
JAVA编程思想 初级教程
JAVA编程思想 高级教程
基于J2SE的QQ聊天工具开发
我来说说面向对象
【进阶篇】
CRM项目
Eclipse
Hibernate
JAVA WEB开发视频
JAVAWEB开发实战经典-高级案例篇
JAVAWEB
JAVA线程并发教程
java网上在线支付实战视频
java设计模式
jdbc
junit
mybatis
spring mvc
SpringMvc+Spring+MyBatis+Maven整合视频
SpringMVC
Spring
Struts2 开发实战讲解
Struts2+Spring3+Hibernate4+Maven+EasyUI整合入门视频
Struts
SVN
tomcat
weblogic
WebService从入门到上手企业开发
企业系统OA办公自动化
手机进销存系统
数据结构和算法视频
设计模式系列
【高级篇】
Cas单点登录
Extjs4.1+Spring3.2+hibernate4.1+MySql5商城
Git权威指南
groovy入门视频
Java 8新特性
Lucene
Mongodb
node.js
Nutch相关框架
OA办公自动化系统
Quartz Job定时任务
Solr高级应用视频
Spring Security权限控制
Spring源码解读与设计详析
Struts2源码剖析与架构指导
大型CMS内容管理系统项目
微信入门视频
深入JVM内核—原理、诊断与优化
深入浅出微信公众平台实战开发(微网站、LBS云、Api接口调用、服务号高级接口)
银行接口资料
【架构篇】
ActiveMQ实战
Apache-Tomcat集群搭建
Linux集群
Linux高级架构架构方案及实现指南
Memcached分布式集群
Mysql特级优化课程
Nginx+Tomcat+Memcached群集配置软件包
Nginx服务器搭建
Nginx网站架构实战(Web服务器负载均衡与反向代理)
SOA Dubbo
storm入门到精通
storm集群的搭建
storm项目实战
UML建模
互联网公司技术架构系列
京东B2C平台推荐搜索的实践和思考
京东大数据分析与创新应用
京东大规模存储持续研发
京东电商海量订单处理OFC系统的关键技术
优米网架构设计方案
基于SOA 思想下的百万数据架构
大型网站提速之MySQL优化
大型网站架构设计
大数据高并发架构实战案例
数据优化技术Redis
数据库高并发原理
深入Java程序性能调优
深入浅出MongoDB应用实战集群及系统架构
深度揭秘服务器端内幕
电商网站之Solr应用
系统架构设计师
阿里分布式数据库服务实践
—————————————————————————————————————————————————–

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值