这几天一直都在捣鼓android的知识点,兴趣班的老师,讲课太过深奥,天(想到什么就见什么,后后面完全不想听),最后自己找资料总结了在Android学习中很重要的一个组件Activity,那就开始吧!

第一:掌握Activity的四种状态及什么时候触发

  首先我们要知道什么是Activity,简单来说Activity其实就是一个屏幕的显示页面。(简单的阐述)

我们知道Activity是由Activity栈进管理,当来到一个新的Activity后,此Activity将被加入到Activity栈顶,之前的Activity位于此Activity底部。

Acitivity一般意义上有四种状态:

  1、Running状态: 一个新的Activity启动入栈后,它在屏幕的最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态,Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活,这个将会被暂停。

  2、Paused状态:当Activity处于此状态时,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,它仍然可见,但它已经失去了焦点,故不可与用户交互。

  3、Stopped状态: 当Activity 不可见时,Activity处于Stopped状态。当Activity处于此状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了

  4、Killed状态: Activity被杀掉以后或者被启动以前,处于Killed状态。这是Activity已从Activity堆栈中移除,需要重新启动才可以显示和使用。

                                 图1

  对四种状态的一个总结:Running状态和Paused状态是可见的,Stopped状态和Killed状态时不可见的,当然Starting是有系统自身自动创建,而且每一个活动( Activity )都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。

但是当一个活动的状态发生改变的时候,开发者可以通过调用 onXX() 的方法获取到相关的通知信息。

接下来讲下各种状态在何时触发:

  1、Running状态: 

    期间触发的函数及顺序为: onCreate() ->on Start() -> onResume()。

  注意:

1.1:onCreate()只有在该Activity是第一次被创建时才会被调用,主要是负责Activity的一般性的初始化设置,包括视图的创建,数据的绑定等等。

           需要注意的是若之前有冻结的state(即系统对该Activity调用过onSaveInstanceState()函数),则可以通过其 Bundle 参数进行state恢复。

     1.2:on Start()是当Activity正在变为可见状态时才会被调用。一般地在此期间可以注册一个广播等等。

    1.3:onResume()是在该Activity将要和用户进行交互时被调用,此时Activity位于的活动栈顶部。

  2、Paused状态:

     运行状态到暂停状态所触发的函数及顺序为:onResume() -> onPuased()

       暂停状态恢复至运行状态所触发的函数及顺序为:onPuased() -> onResume()。     

   注意: 
    2.1:onPuased()是当一个Activity失去系统焦点后将会被调用,包括见面被部分遮挡,以及设备转入休眠状态等等。一般地在此期间对一些未保存的数据进行持久化并停 止其他需要耗费CPU的操作,同时不可进行耗时操作,否则会阻塞系统UI线程。

    2.2:一个处于暂停状态的Activity只有在系统极度缺乏内存资源的情况下才会被系统强制结束。

   3stopped状态:

     暂停状态到停止状态所触发的函数及顺序为:onPuased() -> on Stop()。 
         停止状态恢复至运行状态所触发的函数及顺序为:on Stop() -> onRestart() -> on Start() -> onResume()。

    注意: 
    3.1:on Stop()是当一个Activity变为不可见时将会被调用,此时可能是由于该Activity要被注销或新的Activity完全遮挡了该Activity。在此期间一般可以进行取消注册 广播等操作,因此用户不可见。 
    3.2:onRestart()是当一个Activity从停止状态恢复至运行状态时将会被优先调用。

    4、Killed状态:

      停止状态到死亡状态分为两种情况:(1)由用户操作导致,则执行:on Stop() -> onDestroy()。

                      (2)由系统自动强制执行,则该Activity被强行结束。

    注意: 
    4.1:onDestroy()是当一个Activity正在被系统finished期间被调用的。

以上就是关于 Activity的四种状态以及何时触发的详细分解,当然 如果有何不对或者疑问可以留言或者发Email 214392652@qq.com 感谢!

第二:掌握Activity的生命周期及各个阶段触发的事件名称和触发次数

  Activity一共有七个生命周期函数,分别为onCreate(),onRestart(),on Start(),onReusme(),onPause(),on Stop(),onDestory()。

  1:onCreate()

    当Acitivity第一次被创建时触发,一般在这里要做的事情包括创建视图(setContentView())、向视图填充必要的数据等等。

  2:onRestart()

    如果Activity之前被stop过,那么下一次onStart()方法之前会先触发这个方法,当处于停止状态的活动需要再次展现给用户的时候,触发该方法。

  3:onStart()

    只要Activity从不可见变成可见,就会触发到这个方法,但被AlertDialog遮挡/显示的情况不算在内。

4:onResume()

    当Activity来到最上层的时候,也就是开始与用户直接交互时,触发这个方法。例如本来Activity被一个AlertDialog遮挡,当这个AlertDialog消失时,onResume()方法就被触发。

  5:onPause()

    同onResume()的触发条件刚好相反,如果Activity本来在最上层,当它要让出最上层的位置时会触发这个方法。

     onPause()和onResume()是被触发最频繁的两个方法,所以在这里不应该执行过于消耗资源的方法。

 6: onStop ()

     当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。

    所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。

 7: onDestroy ()

    当活动销毁的时候,触发该方法。和onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。

  接下来我们用代码来实现具体的方法触发:

    创建一个android项目,在MainActivity中进行编辑    

  1. public class MainActivity extends Activity {
  2.  
  3. // onCreate系统自动初始化
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. Log.i("--MainActivity--","--------onCreate- 系统自动初始化---------");
  9. }
  10.  
  11. //从stop转为激活状态时执行
  12. @Override
  13. protected void onRestart() {
  14. super.onRestart();
  15. Log.i("--MainActivity--", "------onRestart--stop转为激活状态时执行----");
  16. }
  17.  
  18. //Activity开始加载事件时执行(新创建时,或者重新启动的时候执行!)
  19. @Override
  20. protected void onStart() {
  21. super.onStart();
  22. Log.i("--MainActivity--", "--------onStart---开始加载事件时执行-----");
  23. }
  24.  
  25. //Activity恢复到激活状态时执行(任何一次进入激活状态都将执行)
  26. @Override
  27. protected void onResume() {
  28. super.onResume();
  29. Log.i("--MainActivity--", "----------onResume-恢复到激活状态时执行-------------");
  30. }
  31.  
  32. //Activity 被覆盖的时候执行
  33. @Override
  34. protected void onStop() {
  35. super.onStop();
  36. Log.i("--MainActivity--", "-------onStop ----被覆盖的时候执行-----------");
  37. }
  38.  
  39. //Activity 退出或者被回收时执行,仅执行一次
  40. @Override
  41. protected void onDestroy() {
  42. super.onDestroy();
  43. Log.i("--MainActivity--","---------onDestroy---退出或者被回收时执行,仅执行一次--------------");
  44. }
  45.  
  46. }

当我们启动部署程序的时候,通过LogCat 日志来查看信息

    以上就是关于掌握Activity的生命周期及各个阶段触发的事件名称和触发次数

第三:掌握Activity中如何在各个窗体之间传值

  如上我们知道了Activity是一个窗体的页面显示,既然是页面显示,那么我们就需要进行显示数据与读取数据,那么问题来了,Activity中如何在各个窗体之间进行传值。

这里引入一个关键字: Intent:在Android中,Intent对象负责各个Activity窗口之间的切换,同时他更担负起数据传输重任。  

   接下来我们用代码来具体实现分析(采用工具Eclipse):

  第一:首先我们创建一个名为ActivityValue 的Android项目 并在src 目录下分别创建名为:SecondActivity JAVA普通类 ,Second_OneActivity JAVA普通类 分别继承Activity

   

在目录layout 中创建分别跟SecondActivity ,Second_OneActivity  相对应的布局xml文件

名为:activity_second_one.xml

名为:activity_second.xml

接下来我们在SecondActivity.java 文件中进行编辑:

  1. package com.example.activityvalue;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. import com.example.activitylife.R;
  6. import com.example.activityvalue.Second_OneActivity;
  7.  
  8. import android.app.Activity;
  9. import android.content.Intent;
  10. import android.os.Bundle;
  11. import android.view.View;
  12.  
  13. public class SecondActivity extends Activity{
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. //声明Activity
  19. setContentView(R.layout.activity_second);
  20. }
  21.  
  22. //传递一个普通值到一个窗体
  23. public void MytestOne(View view){
  24. System.out.println("=================传递一个普通值到一个窗体=====================");
  25. Intent intent = new Intent(this,Second_OneActivity.class);
  26. //窗体传值
  27. intent.putExtra("stuName","习大大");
  28. intent.putExtra("stuage",20);
  29. intent.putExtra("isMerry",false);
  30. //设置数组
  31. intent.putExtra("stuHobby",new String[]{"篮球","羽毛球","足球"});
  32. //设置集合数值
  33. ArrayList<String> list = new ArrayList<String>();
  34. list.add("北京");
  35. list.add("广东");
  36. list.add("美国");
  37. //设置数值到Intent 中
  38. intent.putStringArrayListExtra("stuCitys",list);
  39. //开启Activity
  40. startActivity(intent);
  41. }
  42.  
  43. }

我们先在SecondActivity 文件中部署好我们需要取出的数据 不同的类型数据m,由上文可知我们是通过intent 来进行传值

在Second_OneActivity 进行编辑:

  1. package com.example.activiyvalue;
  2.  
  3. import java.lang.reflect.Array;
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6.  
  7. import android.app.Activity;
  8. import android.content.Intent;
  9. import android.os.Bundle;
  10. import android.widget.TextView;
  11.  
  12. public class Second_OneActivity extends Activity{
  13.  
  14. private TextView showText;
  15.  
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19.  
  20. //声明一个布局文件
  21. setContentView(R.layout.activity_second_one);
  22.  
  23. //从Intent 中取出传递过来的数据
  24. Intent intent = getIntent();
  25.  
  26. //取出普通数据
  27. String name = intent.getStringExtra("stuName");
  28. int age = intent.getIntExtra("stuAge", 0);
  29. boolean isMerry = intent.getBooleanExtra("isMerry",false);
  30.  
  31. //取出数组数据
  32. String[] hobbys = intent.getStringArrayExtra("stuHobby");
  33. String hobby = Arrays.toString(hobbys);
  34.  
  35. //取出ArrayList 集合数据
  36. ArrayList<String> citys =intent.getStringArrayListExtra("stuCitys");
  37. String city = Arrays.toString(citys.toArray());
  38.  
  39. //声明Activity
  40. showText = (TextView) findViewById(R.id.showText);
  41.  
  42. //在Activity 中动态添加文本内容
  43. String str = "姓名:"+name+",年龄:"+age+"\n"+
  44. "婚否:"+isMerry+"\n"+
  45. "爱好:"+hobby+"\n"+
  46. "城市:"+city;
  47. showText.setText(str);
  48.  
  49. }

如果在第21 行 声明一个布局文件 报错时,则说明R 文件中 没有自动生成句柄  我们可以这样做

在项目右击重新加载项目便可:

  

接下来我们要在项目目录下的AndroidMainifest.xml 中进行声明Activity 类文件

在声明的前提我们先进行设置好string参数

接下来在AndroidMainifest.xml 开始声明

接下来要回到MainActivity.java 定义一个方法 用来转跳Activity

  1. //============================打开一个窗体传值的案例==============================
  2. public void setValuesMyDemo(View view){
  3. Intent intent = new Intent(this,SecondActivity.class); //创建一个Activity对象
  4. //开始激活Activity状态为start
  5. startActivity(intent);
  6. }

在activity_main.xml 布局文件中定义一个Button 按钮

  1. <Button
  2. android:id="@+id/button1"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:text="Activity窗体传值案例"
  6. android:onClick="setValuesMyDemo" />

按钮绑定一个方法对应的是MainActivity.java 中的 setValuesMyDemo 方法

setValuesMyDemo 方法中调用 下一个Activity  也就是SecondActivity.java 对应的布局文件

那么我们就要在SecondActivity.java 对应的布局文件activity_second.xml 中添加一个button

  1. <Button
  2. android:layout_width="match_parent"
  3. android:layout_height="wrap_content"
  4. android:text="通过Intent传递普通数据"
  5. android:onClick="MytestOne"/>

activity_second.xml 中点击事件绑定的方法是SecondActivity.java 文件中对应的MytestOne方法:

在MytestOne方法中 调用了下一个Activity 也就是Second_OneActivity.java   我们在这个文件中进行读取数据 在SecondActivity.java文件中进行设置数值

接下来见证奇迹的时刻:我们运行我们的程序,打开我们的模拟器或者真机部署文件

点击窗体中的button 进入SecondActivity的布局文件了  (此时就进行了页面的跳转)

在SecondActivity页面我们是进行了设置数值 因此 当再次点击的时候我们在Second_OneActivity 的布局文件就要进行读取数据

点击 显示跳转如下:

  

总结: 由上图案例可知,Activity与Activity 之间的跳转 跟 Activity与Activity 之间的传值  是通过上一个Activity对下一个Activity的调用,其中intent 对象 起到的方法很重要,起着跳转跟传值的任务!

第三: 掌握Activity窗体状态保存问题

在这里如何保存当前的窗体状态我们通过代码来实现: 

  在我们上面的案例基础上,到MainActivity.java 文件中 重写Activity 的两个方法:

  1. onRestoreInstanceState(Bundle savedInstanceState)
  1. //========================窗体状态保存与恢复====================================
  2. @Override
  3. protected void onRestoreInstanceState(Bundle savedInstanceState) {
  4. super.onRestoreInstanceState(savedInstanceState);
  5. //恢复状态
  6. if(savedInstanceState!=null){
  7. String msg = savedInstanceState.getString("message");
  8. //设置这个数据到需要的地方
  9. Toast.makeText(this, "以前的消息:"+msg, 50000).show();
  10. }
  11. }

onSaveInstanceState(Bundle outState)

  1. //========================保存的状态====================================
  2. @Override
  3. protected void onSaveInstanceState(Bundle outState) {
  4. // TODO Auto-generated method stub
  5. super.onSaveInstanceState(outState);
  6. //保存数据
  7. outState.putString("message", "Hello!");
  8. Toast.makeText(this, "状态已经保存!", 3000).show();
  9. }

完毕之后,我们开始运行程序最终结果如下:

  

总结:  以上是通过其他教师的一个资料与案例自己总结出来的四大知识点,对于android 入门级选手比如我,就可以拿来尝试,很有成就感的,当然 以上的操作过程有何问题或者欢迎大神前来光顾,希望不断的进步吧。加油。

关于android初学者必须掌握的Activity的四大知识点的更多相关文章

  1. Android中Activity的四大启动模式实验简述

    作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...

  2. 强烈推荐android初学者,android进阶者看看这个系列教程

    强烈推荐android初学者,android进阶者看看这个系列教程 转载 2015年05月30日 23:05:44 695 为什么要研究Android,是因为它够庞大,它够复杂,他激起了我作为一个程序 ...

  3. Android初学者必知会的编程规范

    在安卓学习中,我们首先需要掌握的就是Android编程的一些规范,只有掌握了这些规范,后面的深入学习才能开展.今天小编在一个Android培训网站上搜罗了一些,Android初学者不得不知的开发规范, ...

  4. Android退出时关闭所有Activity的方法

    Android退出时,有的Activity可能没有被关闭.为了在Android退出时关闭所有的Activity,设计了以下的类: //关闭Activity的类 public class CloseAc ...

  5. Android提升篇系列:Activity recreate(Activity 重新创建/自我恢复)机制(一)

    注:本文中的recreate是指当内存不足时,Activity被回收,但再次来到此Activity时,系统重新恢复的过程.例如:当Activity A到Activity B时,如果内存不足,A被回收, ...

  6. Android 创建一个新的Activity

    本文转载自:http://www.cnblogs.com/wuyudong/p/5658020.html 新建一个项目,创建一个java类,继承自Activity 新建一个Android.xml文件: ...

  7. 三、Android学习第三天——Activity的布局初步介绍(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 三.Android学习第三天——Activity的布局初步介绍 今天总结下 ...

  8. 二、Android学习第二天——初识Activity(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 一. Android学习第二天——初识Activity 昨天程序搭建成功以 ...

  9. Android应用程序窗口(Activity)与WindowManagerService服务的连接过程分析

    在前两文中,我们分析了Activity组件的窗口对象和视图对象的创建过程.Activity组件在其窗口对象和视图对象创建完成之后,就会请求与WindowManagerService建立一个连接,即请求 ...

随机推荐

  1. smartjs 0.2发布 - 新增oop模块&AOP增强

    SmartJS2.0发布,更新内容如下: 新增oop(klass,factory)模块: promiseEvent加入非阻塞模式noBlock: trigger加入属性监听; smartjs主模块优化 ...

  2. Knockout 新版应用开发教程之Observable Arrays

    假如你想到侦测和相应一个对象的改变,假如你想要侦测和响应一一组合集的改变,就要用observableArray 在许多场景都是很有用的,比如你要在UI上需要显示/编辑的一个列表数据集合,然后对集合进行 ...

  3. Hadoop入门进阶课程7--Pig介绍、安装与应用案例

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...

  4. 推荐几款很棒的 JavaScript 表单美化和验证插件

    表单元素让人爱恨交加.作为网页最重要的组成部分,表单几乎无处不在,从简单的邮件订阅.登陆注册到复杂的需要多页填写的信息提交功能,表单都让开发者花费了大量的时间和精力去处理,以期实现好用又漂亮的表单功能 ...

  5. 自动化运维工具之 Ansible 介绍及安装使用

    一.初识Ansible 介绍: Absible 使用 模块(Modules)来定义配置任务.模块可以用标准脚本语言(Python,Bash,Ruby,等等)编写,这是一个很好的做法,使每个模块幂等.A ...

  6. SQL中的循环

    DECLARE @SOInfoList TABLE ( SONumber INT, SODate datetime, Status char(1) ) INSERT INTO @SOInfoList ...

  7. Spring基础—— SpEL

    一.SpEL:Spring 表达式语言,在使用的时候类似于 EL 表达式,但是需要注意的是,SpEL 使用在 Spring Config 文件中. 二.格式:使用 #{} 作为界定符,所有在大括号中的 ...

  8. web面试题大全

    $HTML, HTTP,web综合问题 常见排序算法的时间复杂度,空间复杂度 前端需要注意哪些SEO web开发中会话跟踪的方法有哪些 <img>的title和alt有什么区别 docty ...

  9. 复利计算v6.0--web版--软件工程

    一.结对同伴 姓名:蔡舜 学号: 博客园地址:http://www.cnblogs.com/caishun/ http://www.cnblogs.com/caishun/p/5392896.html ...

  10. Asp.NET MVC JSON序列化问题

    最近在做项目的时候遇到一个JSON序列化问题. 环境:ASP.NET MVC 4.0 数据库:SQL 2008 在将获取的数据从后台以json的形式传给前台的easyui treegrid绑定的时候通 ...