最近准备系统的重新整理复习一下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的更多相关文章

  1. Android基础知识、四大组件(转)

    Android应用程序使用java语言编写的.Android SDK工具将所有的数据和资源文件以及代码进行编译,打包称为一个apk文件.一个apk文件中的所有代码被认为是一个应用,android系统的 ...

  2. Android回炉系列之四大组件之首Activity

            有段时间没有认认真真研习过android了,android毕竟是我进这个软件开发圈子接触的第一门技术,android已经成了口头禅之类的东西了.当初学习android的时候大都是草草了 ...

  3. Android四大组件——Activity

    Activity作为Android四大组件之一,也是其中最重要的一个组件.作为一个与用户交互的组件,我们可以把Activity比较成为windows系统上的一个文件夹窗口,是一个与用户交互的界面.再进 ...

  4. Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)

    转载于:http://blog.csdn.net/byxdaz/article/details/9708491 http://blog.csdn.net/q876266464/article/deta ...

  5. Android学习之基础知识十三 — 四大组件之服务详解第一讲

    一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...

  6. Android四大组件——Activity——Activity的生命周期

    Activity状态: 每个Activity在其生命周期中最多可能有四种状态 1.运行状态:处于栈顶时.初次创建处于栈顶时依次调用:onCreate(),onStart(),onResume().由不 ...

  7. Android四大组件——Activity——Activity数据回传

    既然可以传递数据给下一个Activity,自然也可以返回数据给上一个Activity.返回上一个Activity时只需要点击back键就好,并没有一个用于启动Activity的Intent来传递数据, ...

  8. ANDROID培训准备资料之四大组件的简单介绍

    Android四大组件是一个android app 最基本的组成部分,这篇博客主要给大家简单的介绍一下四种组件 (1)Activities (2)Services (3)BroadcastReceiv ...

  9. Android 基础 二 四大组件 Activity

    Activity Intent IntentFilter 一理论概述 一. Activity 用来提供一个能让用户操作并与之交互的界面. 1.1 启动 startActivity(Intent int ...

随机推荐

  1. 1. Hello UWP

    1. UWP UWP,Universal Windows Platform,也就是 Windows 10 新推出的通用平台应用,只要一次编码,即可运行在 Windows 10 电脑以及手机上,甚至可以 ...

  2. [转载]《C++0x漫谈》系列之:多线程内存模型

    <C++0x漫谈>系列之:多线程内存模型 By 刘未鹏(pongba) 刘言|C++的罗浮宫(http://blog.csdn.net/pongba) <C++0x漫谈>系列导 ...

  3. C# [STAThread]

    转载:http://www.cnblogs.com/netdazhi/articles/1189549.html 每个Thread都有一个关于ApartmentState的属性,可以把它设置为:STA ...

  4. 转载字典地址:http://blog.csdn.net/aladdinty/article/details/3591789

    相关文章: http://www.360doc.com/content/13/1003/23/14070959_318861279.shtml http://www.360doc.com/conten ...

  5. ASP.NET中实现页面间的参数传递

    ASP.NET中实现页面间的参数传递   编写人:CC阿爸 2013-10-27 l  近来在做泛微OA与公司自行开发的系统集成登录的问题.在研究泛微页面间传递参为参数,综合得了解了一下现行页面间传参 ...

  6. Cache-control使用:header('Cache-control:private')

    发布:thebaby   来源:net     [大 中 小] 转自:http://www.jbxue.com/article/5624.html网页缓存由 HTTP消息头中的“Cache-contr ...

  7. linux下关于mysqldump备份的.sql导入数据库表数据丢失优化

    直切正题 前2个随笔做了linux下自动备份,但是备份的.sql文件发现表数据丢失,原因是数据库太大我的数据库文件是804M,在用ftp拉去也会丢失数据 所以对db.sh备份数据库加一个压缩gizp ...

  8. Learning Scrapy笔记(一)- Scrapy简单介绍

    Scrapy简述 Scrapy十一个健壮的,用来从互联网上抓取数据的web框架,Scrapy只需要一个配置文件就能组合各种组件和配置选项,并且Scrapy是基于事件(event-based)的架构,使 ...

  9. 04-树6 Complete Binary Search Tree

    完全二叉树 刚开始只发现了中序遍历是从小到大顺序的.一直在找完全二叉树的层结点间规律...放弃了 不曾想,完全二叉树的规律早就知道啊.根结点为i,其左孩子结点2*i, 右孩子结点2*i+1. 结合此两 ...

  10. Ruby Code Style

    这篇博文逐渐写一点关于Ruby的编码风格,主要参考ruby-stytle-guide. 一些命名准则 函数与变量 使用蛇形小写比较好:some_var, some_function 目录和文件也使用s ...