最近准备系统的重新整理复习一下Android的各方面的知识,本着知识分享的原则,我就把梳理过程中一些东西给记录下来,权当一个学习笔记吧。
下面步入正题。。。。。
什么是Activity
Activity作为Android四大组件之一,也是其中最重要的一个组件。作为一个与用户交互的组件,我们可以把Activity比较成为windows系统上的一个文件夹窗口,是一个与用户交互的界面。再进一步说,当我们拿起Android打开拨号功能,显示出拨号盘的界面其实就是一个Activity;当然,可以更大范围的说,手机屏幕上显示的任何界面都是一个个Activity。
Activity的三种状态
运行状态:当Activity处于屏幕最前端,此时Actiivity完全显示在用户的界面中,并能获取焦点时,可以响应用户的的触摸屏幕等事件,此时为运行状态。
暂停状态:当Activity被其他Activity遮挡,但是仍然有部分可见,此时为暂停状态;当处于暂停状态时,Activity仍然会更新UI,但是此时不能获取焦点,即不会响应用户触摸、后退等事件。
停止状态:当Activity被另外一个Activity完全遮挡,此时为停止状态,停止状态并不意味着Activity停止运行,而可以理解为转入后台运行。但是如果系统需要内存,会优先结束停止状态的Activity释放资源,所以在Activity转入停止状态时要对重要数据进行保存。
Activity的生命周期
右边就是Activity的生命周期图,Activity的生命周期方法总共有七个。所谓生命周期,就是Activity在各个状态转变之间,系统会对其各个生命周期函数进行回调,也就让我们可以根据业务需求,重写各个生命周期方法来实现软件在各个状态的业务逻辑。
启动Activity到运行状态:
onCreate() -> onStart() -> onResume() -> 界面完全显示
运行状态到暂停状态:
界面完全显示 -> onPause() -> 界面被部分遮盖
暂停状态到运行状态:
界面被部分遮盖 -> onResume() -> 界面完全显示
运行状态到停止状态:
界面完全显示 -> onPause() -> onStop() -> 界面完全遮盖
停止状态到运行状态:
界面完全遮盖 -> onRestart() -> onStart() -> onResume() -> 界面完全显示
退出Activity:
界面完全显示 -> onPause() -> onStop() -> 界面完全遮盖 -> onDestroy() -> Activity结束生命周期
PS:当系统内存紧张时,系统可以将Activity释放掉以获取资源,优先释放停止状态的Activity,次之则是暂时状态的Activity,而运行状态的Acitivity一般不可能被强行释放,除非极端缺乏资源(这时候直接死机得了。。。),当Activity被释放时,直接转入消亡,需要注意一点的是onDestroy()并不会被执行,所以把数据保存放在onDestroy处理是不适当的,可以在onSaveInstanceState()中对重要数据进行相应的处理。
另外关于横竖屏切割调用的生命周期如下:
横屏->竖屏(调用一次生命周期)
onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()
竖屏 -> 横屏 (调用两次生命周期)
如果不希望切换屏幕时调用生命周期方法,可以有如下方法:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
Activity的启动
当我们希望从当前的Activity跳转到下一个Activity时,我们就需要掌握Activity的启动,参考下面代码:
Intent intent = new Intent(this, OtherActivity.class);//写法1 // Intent intent = new Intent(getApplicationContext(), OtherActivity.class);//写法2
//
// Intent intent = new Intent();//写法3
// intent.setClass(this, OtherActivity.class); startActivity(intent);//启动另外一个Activity
Intent是联系四大组件的纽带,启动一个Activity一般都是new一个Intent实例,同时指定相应的启动组件,如OtherActivity.class。然后调用Activity的方法startActivity(intent)通知android系统加载OtherActivity。
Activity之间数据的传递
对于应用来说,单纯从一个Activity启动另外一个Activity远远是不够的,有时候需要比较的数据信息交流。android系统提供了很多种数据通信的方法,自然也为Activity之间的通信提供了简便的数据传递方法,参见下面代码:
FirstActivity向OtherActivity传送数据<data,"传递的数据">
Intent intent = new Intent(this, OtherActivity.class); intent.putExtra("data", "传递的数据");//data为key
// 另外一种方法,载入数据
// Bundle bundle = new Bundle();
// bundle.putString("data", "传递的数据");
// intent.putExtras(bundle); startActivity(intent);
有两种表示的方法,一般第一种方法运用的场景是传输少量而且简单的数据;后一种方法则是传输较多而比较复杂的数据所用。但是从底层上说,其实第一种方法是后一种方法的封装,它仍然会在intent内部创建一个bundle并把数据(如例子中的“传递的数据”)放入其中。
OtherActivity获取传送的数据<data,"传递的数据">
Intent intent = getIntent();
// 获取方法
String data = intent.getStringExtra("data");//data的值为“传递的数据”,由上个Activity传入
// 另外一种方法
// Bundle bundle = intent.getExtras();
// String data = bundle.getString("data");
获取的方法一般是先取得intent携带的bundle,然后通过get方法获取存储在其中的数据;而前面的方法并没有明确获取bundle的代码,因为intent.getStringExtra(key)在函数内部已经是先获取好bundle并把相应key的数据解析出来了,所以两种方法本质上来说是相同的,但是如果大量数据建议用后一种方法,因为从bundle中获取数据比从intent中获取数据效率有所提高,比较移动时代,效率是一个非常需要重视的东东。。
FristActivity启动OtherActivity并在其结束时获取OtherActivity返回的数据
如果业务需要启动另一个Activity后返回数据给原来的Activity,在启动Activity是不是调用startActivity(intent),而是应该调用startActivityForResult(intent, requestCode),requestCode是一个给启动的Activity的标识码,是一个正整数的值,在有多个启动的Activity时可以通过不同的标识码来表示Activity返回的数据并进行不同的处理。在FristActivity中处理返回数据是在 onActivityResult(requestCode, resultCode, data)中处理,而第一个参数requestCode则是启动时输入的标识码。参见代码
1 Intent intent = new Intent(this, OtherActivity.class);
2 startActivityForResult(intent, 0);//设置标识码为0
这是启动Activity的代码,但是我们要对于返回的数据,还需要在FristActivity中重写onActivityResult(requestCode, resultCode, data)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 0){//根据requestCode的数值确实是哪个Activity返回的bundle
Bundle bundle = data.getExtras();
String getdata = bundle.getString("name");
}
}
然后在启动的OtherActivity中重写返回数据的方法
Intent intent = new Intent();
intent.putExtra("name", "返回的数据");
setResult(1, intent);//设置需要返回数据的intent
finish();//结束当前的activity
一般setResult后需要调用finish()结束当前的Activity,此时才会将数据返回到FristActivity,数据返回也就是onActivityResult调用的时间在finish之前调用。
Activity的结束
finish():当执行finish()后系统会将该activity移出栈,但是并没有马上释放资源,也不会调用onDestroy这个生命周期的方法。
onDestroy():当activity执行到这个生命周期时,也就意味着activity将会完全释放,如果需要重新启动这个activity,需要重新onCreate()。
System.exit(0):这个玩意会将整个Application给干掉,退出进程。
作者:enjoy风铃
出处:http://www.cnblogs.com/net168/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则下次不给你转载了。
Android基础整理之四大组件Activity的更多相关文章
-
Android基础知识、四大组件(转)
Android应用程序使用java语言编写的.Android SDK工具将所有的数据和资源文件以及代码进行编译,打包称为一个apk文件.一个apk文件中的所有代码被认为是一个应用,android系统的 ...
-
Android回炉系列之四大组件之首Activity
有段时间没有认认真真研习过android了,android毕竟是我进这个软件开发圈子接触的第一门技术,android已经成了口头禅之类的东西了.当初学习android的时候大都是草草了 ...
-
Android四大组件——Activity
Activity作为Android四大组件之一,也是其中最重要的一个组件.作为一个与用户交互的组件,我们可以把Activity比较成为windows系统上的一个文件夹窗口,是一个与用户交互的界面.再进 ...
-
Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
转载于:http://blog.csdn.net/byxdaz/article/details/9708491 http://blog.csdn.net/q876266464/article/deta ...
-
Android学习之基础知识十三 — 四大组件之服务详解第一讲
一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...
-
ANDROID培训准备资料之四大组件的简单介绍
Android四大组件是一个android app 最基本的组成部分,这篇博客主要给大家简单的介绍一下四种组件 (1)Activities (2)Services (3)BroadcastReceiv ...
-
Android 基础 二 四大组件 Activity
Activity Intent IntentFilter 一理论概述 一. Activity 用来提供一个能让用户操作并与之交互的界面. 1.1 启动 startActivity(Intent int ...
-
Android笔记(五十八)Android总结:四大组件——Activity篇
什么是Activity Activity是一种包含用户界面的组件,主要用于和用户进行交互,一个APP通常由多个Activity组成. 每个Activity都对应一个布局文件,通过setContentV ...
-
(转)Android四大组件——Activity跳转动画、淡出淡入、滑出滑入、自定义退出进入
文章转自:http://blog.csdn.net/qq_30379689/article/details/52494270 Activity跳转动画.淡入淡出.滑入滑出.自定义退出进入 前言: 系统 ...
随机推荐
-
list排序
今天要对List排序,上网查了很多方法都感觉比较麻烦,现在终于找到了两种比较简便的方式,在此写出来,防止忘记!同时供大家参考! using System; using System.Collectio ...
-
.NET: C#: Attribute
ref: http://www.uml.org.cn/net/200810135.asp ref: http://blog.csdn.net/okvee/article/details/2610349 ...
-
通过批处理文件启动oracle11g服务
注:ORCL是数据库实例名,默认的数据库是ORCL,你可以创建其他的,即OracleService+数据库名. ========================================启动服务 ...
-
Java如何连接到MySQL数据库的
下载:mysql-connector-java-5.1.38.tar.gz http://dev.mysql.com/downloads/connector/j/ tar zxvf mysql-con ...
-
Thinking In Java 学习笔记 1-5 章
第1章 对象导论 本章主要讲OOP的思想及一些OOP基本概念 1.抽象过程:万物都是对象,对象具有状态.行为和标识.对象拥有属性和方法,以及在内存中的唯一地址. 2.每个对象都有一个接口:通过接口给对 ...
-
JavaScript权威指南学习笔记5
下午在杭图回去前看了书中第二部分的13-17章,看的很粗,感觉大部分东西自己已经知道或者平时开发中不会用到,很多章节只是简单的翻了一下,没有仔细思考里面说到的道理,下面对各章节简单的记录下. 第13章 ...
-
time模块简介
Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. ...
-
解决miner.start() 返回null
下面我列举了三种解决方案,前面两张是某两位大佬试出来的,第三种是我蒙出来的. 第一种解决方案 转载自 http://mp.weixin.qq.com/s/AB9vj1EzOgWT7JyryfQhDg ...
-
centos关机与重启命令 shutdown -r now 立刻重启
centos关机与重启命令详解与实战 Linux centos重启命令: .reboot .shutdown -r now 立刻重启(root用户使用) .shutdown -r 过10分钟自动重启( ...
-
Kotlin provideDelegate
提供委托 这又是一个蛋疼的叫法,其实,就是给A和委托B之间插入一个中间件而已 这个中件间的作用是用了对委托的参数做一个校验 好了,别的不多说,直接给demo import kotlin.reflect ...