1、Activity

  在一个Android应用程序中,Activity是为用户操作而展示的可视化界面。比如你要打电话,这个时候的拨号界面就是一个Activity,你要发短信给你的女朋友,这个短信窗口就是一个Activity。Activity在创建之初只是一个没有任何内容的页面,如果要做出用户体验非常棒的应用程序,还需要在Activity中添加控件(如按钮,文字,图片)以显示和响应用户操作。

2、在Android中,多个Activity之间如何切换?

  在Android 系统中,之所以一个Activiyt运行过程中可以运行另外的Activity,是因为Android在遇到这种情况后,会自动创建一个任务堆栈,并把这些关联的Activity压入堆栈中。在这个任务堆栈栈顶的Activity就是当前用户一直操作的Activity,而当一个新的Activity启动时,这个Activity就必须位于栈顶,而当前的Activity就会被压入栈的下一个位置。当系统发现内存不够用时,会默认清理一些长时间没有被使用的Activity存放栈。

  打个比方,你在看微博,现在收到一条女朋友发来的微信,这个时候你打开微信,Android就会将微信的Activity压入栈并放在栈顶,使微信的Activity被激活,而把本来在栈顶的微博Activity压入栈中下一个位置。这样一来,当你按Back键时,微信Activity就会弹出栈,新浪Activity位于栈顶于是被激活。但是当你按下HOME键后,这些Activity都将转到后台运行,你使用Back是不能再次激活他们的,此时你必须点击应用程序才能再次激活它。

  那么为什么微信Activity激活时,再按Back微博Activity能够再次激活?这就要从Activity的生命周期讲起了。

3、Activity的生命周期

  一个Activity主要有三个状态:

  • 激活状态(也就是用户操作的Activity)
  • 暂停状态(有一个弹出窗口且没有完全挡住这个Activity)
  • 停止状态(完全被其他的Activity挡住)

  后两种情况都有可能在系统内存紧张时被系统Kill以释放内存。

  当一个activity从创建到完全销毁要顺序完成下列七个方法:

  • void onCreate(Bundle savedInstanceState)
  • void onStart()
  • void onRestart()
  • void onResume()
  • void onPause()
  • void onStop()
  • void onDestroy()

实现这些方法可以帮助你监察三个嵌套的生命周期循环:

  • 一个activity 完整的生命周期 自第一次调用 onCreate()开始,直至调用onDestroy()为止。activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。比如说,如果activity有一个线程在后台运行以从网络上下载数据,它会以 onCreate()创建那个线程,而以 onDestroy()销毁那个线程。
  • 一个activity的 可视生命周期 自 onStart() 调用开始直到相应的 onStop()调用。在此期间,用户可以在屏幕上看到此activity,尽管它也许并不是位于前台或者正在与用户做交互。在这两个方法中,你可以管控用来向用户显示这个activity的资源。比如说,你可以在onStart() 中注册一个BroadcastReceiver 来监控会影响到你UI的改变,而在onStop() 中来取消注册,这时用户是无法看到你的程序显示的内容的。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。
  • 一个activity的 前台生命周期 自 onResume() 调用起,至相应的 onPause()调用为止。在此期间,activity位于前台最上面并与用户进行交互。activity会经常在暂停和恢复之间进行状态转换──比如说当设备转入休眠状态或有新的activity启动时,将调用onPause() 方法。当activity获得结果或者接收到新的intent的时候会调用onResume() 方法。因此,在这两个方法中的代码应当是轻量级的。

    在下图中你将能非常清晰的看到Activity的一个完整的生命周期以及在每个步骤中能够做什么。着色的椭圆是activity可以经历的主要状态。矩形框代表了当activity在状态间发生改变的时候,你进行操作所要实现的回调方法。

(摘自官网)

  现在我们来回答下为什么Back键能够返回到上一个Activity。当一个新的Activity new遮盖(完全或者部分)了当前的Activity old后,当前Activity old会调用onStop()(完全遮盖)或者onPause()(部分遮盖),当点击Back键后,系统会将Activity new弹出栈,并调用Activity old 的onRestart()(完全遮盖)或者onResume()(部分遮盖)激活它。

4、Intent的概念及作用

  Intent——意图,它可以带有数据,在Android设备上的任何应用程序组件间相互作用,将不同组件连在一起的桥梁。

  Intent作用:

  • Intent最常用在启动新的Activity,不管是显式的(通过指定类来加载)还是隐式的(通过请求在一块数据上执行的动作)。
  • Intent还可以用来广播消息,然后使用Broadcast Receiver来监听并响应这些Intent。
  • 使用Intent来传播动作,比如通过我们的程序中打电话。

5、Intent-filter的概念机作用

  Intent-filter用来注册Activity、Service、Broadcast Receiver具有在某种数据上处理一个动作的能力。

  当一个应用程序为了向Android说明它有为某种数据或者其他应用程序组件提供处理动作的能力时,它需要在manifest中注册为一个Intent处理者。

 1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="LiB.PickContacts" android:versionCode="1" android:versionName="1.0">
4 <uses-sdk android:minSdkVersion="9" />
5 <uses-permission android:name="android.permission.CALL_PHONE" />
6 <uses-permission android:name="android.permission.WRITE_CONTACTS" />
7 <uses-permission android:name="android.permission.READ_CONTACTS" />
8
9
10 <application android:icon="@drawable/icon" android:label="@string/app_name">
11 <activity android:name=".Android_PickContactsActivity"
12 android:label="@string/app_name">
13 <!--注册当前的Activity为默认启动的页面 -->
14 <intent-filter>
15 <action android:name="android.intent.action.MAIN" />
16 <category android:name="android.intent.category.LAUNCHER" />
17 </intent-filter>
18 </activity>
19 <activity android:name=".ChileActivity" android:label="@string/app_name">
20 <!-- 注册当前的Activity具有处理Action_picks动作的能力 -->
21 <intent-filter>
22 <action android:name="Action_picks" />
23 <category android:name="android.intent.category.DEFAULT" />
24 <!-- <data android:path="contacts" android:scheme="content" /> -->
25 </intent-filter>
26 </activity>
27 </application>
28 </manifest>

  ❑ action

    使用android:name特性来指定对响应的动作名。动作名必须是独一无二的字符串,所以,一个好的习惯是使用基于Java包的命名方式的命名系统。

  ❑ category

    使用android:category属性用来指定在什么样的环境下动作才被响应。每个Intent Filter标签可以包含多个category标签。你可以指定自定义的种类或使用     Android提供的标准值,如下所示:

     ❑ ALTERNATIVE

      你将在这章的后面所看到的,一个Intent Filter的用途是使用动作来帮忙填入上下文菜单。ALTERNATIVE种类指定,在某种数据类型的项目上可以替代       默认执行的动作。例如,一个联系人的默认动作时浏览它,替代的可能是去编辑或删除它。

     ❑ SELECTED_ALTERNATIVE

      与ALTERNATIVE类似,但ALTERNATIVE总是使用下面所述的Intent解析来指向单一的动作。SELECTED_ALTERNATIVE在需要一个可能性列表时使用。

      ❑ BROWSABLE

      指定在浏览器中的动作。当Intent在浏览器中被引发,都会被指定成BROWSABLE种类。

      ❑ DEFAULT

      设置这个种类来让组件成为Intent Filter中定义的data的默认动作。这对使用显式Intent启动的Activity来说也是必要的。

     ❑ GADGET

      通过设置GADGET种类,你可以指定这个Activity可以嵌入到其他的Activity来允许。

      ❑ HOME

      HOME Activity是设备启动(登陆屏幕)时显示的第一个Activity。通过指定Intent Filter为HOME种类而不指定动作的话,你正在将其设为本地home画面的替代。

     ❑ LAUNCHER

      使用这个种类来让一个Activity作为应用程序的启动项。

❑ data

    data标签允许你指定组件能作用的数据的匹配;如果你的组件能处理多个的话,你可以包含多个条件。你可以使用下面属性的任意组合来指定组件支持的数据:

    ❑ android:host

      指定一个有效的主机名(例如,com.google)。

    ❑ android:mimetype

      允许你设定组件能处理的数据类型。例如,<type android:value=”vnd.android.cursor.dir/*”/>能匹配任何Android游标。

      ❑ android:path

      有效地URI路径值(例如,/transport/boats/)。

        ❑ android:port

        特定主机上的有效端口。

     ❑ android:scheme

      需要一个特殊的图示(例如,content或http)。

6、Intent显式激活Activity

  所谓显式激活Activity,通常就是激活我们自己定义的Activity。这些Activity必须在manifest中定义。为了显式的启动一个Activity,必须要创建一个新的Intent,并指定当前应用程序的上下文和要启动的Activity类。然后使用startActivity(Intent intent)方法来启动。

1         //新建一个Intent
2 Intent intent=new Intent();
3 //为Intent附件一个数据
4 intent.putExtra("param",param);
5 //传入当前上下文和要启动的Activity
6 intent.setClass(Android03Activity.this, Android03_1.class);
7 //启动Activity——Android03_1
8 Android03Activity.this.startActivity(intent);

  当在Android03_1这个Activity被激活后,如何取得我们在Android03Activity中为其传递的参数"param"?

1         Intent intent = getIntent();
2 String sum = intent.getStringExtra("param");

7、Intent隐式激活Activity

  这种方式是一种不直接指明需要启动的应用程序组件(Activity),而是由系统根据Intent中所要执行的动作和所带的数据,通过Intent-filter来自动调用匹配最好的组件(Activity)。比如想让用户在我们的应用程序里打电话,就可以调用一个隐式的Intent来请求一个在某个电话号码上的打电话的动作。

1                 String callData = "tel:"+"123456";
2 Uri callUri = Uri.parse(callData);
3 Intent callIntent = new Intent(Intent.ACTION_CALL, callUri);
4 startActivity(callIntent);

  Android会解析这个Intent并启动一个能够提供打电话动作的Activity。

三、总结

  今天总结了Activity和Intent,对于Android开发,最重要也是最基础的就是要理解Activity的布局以及Intent是如何在各个应用程序组件间传递消息的。笔记四种将开始介绍Activity中的一些常用组件。

Activity及Intent的更多相关文章

  1. Android 学习Activity(1)activity和intent

    工具是:JDK环境配置+SDK+ADT工具 一.Activity  主要作用: 1.用户与应用程序的接口 2.控件的容器 二.创建Activity要点:(在src中的目录下包里) 1.一个Activi ...

  2. 常见的Activity Action Intent常量

    Intent的中文意思是“意图,目的”的意思,可以理解为不同组件之间通信的“媒介”或者“信使”. 目标组件一般要通过Intent来声明自己的条件,一般通过组件中的<intent-filter&g ...

  3. 【转】Android Activity和Intent机制学习笔记----不错

    原文网址:http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html Activity Android中,Activity是所有程序的根 ...

  4. Android Activity和Intent机制学习笔记

    转自 http://www.cnblogs.com/feisky: Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具 ...

  5. Activity 和 Intent

    Activity 和 Intent 一.Intent指向Activity 二.利用 Intent 向第二个 Activity 传数据 三.利用 Intent 接受第二个 Activity 的返回值 四 ...

  6. 二、activity与Intent

    (一) 多个activity之间的跳转(无值传递) 第一步:创建activity(其实就是jave文件),并进行注册 在AndroidManifest.xml中 <activity androi ...

  7. 【Android开发学习笔记】【第三课】Activity和Intent

    首先来看一个Activity当中启动另一个Activity,直接上代码说吧: (1)首先要多个Activity,那么首先在res-layout下新建一个 Other.xml,用来充当第二个Activi ...

  8. 5、四大组件之一-Activity与Intent

    一.Activity的定义及作用 1)官方定义:Activity是Android应用程序提供交互界面的一个重要组件 . 也是Android最重要的组件之一 2)Activity是业务类 , 是承载应用 ...

  9. 多个Activity和Intent(转)

    根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...

随机推荐

  1. 二:HDFS 命令指南

    命令具体选项请参考: http://hadoop.apache.org/docs/r2.6.3/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html   ...

  2. Alpha 冲刺报告(3/10)

    Alpha 冲刺报告 队名:洛基小队 峻雄(组长) 已完成:开始编写角色的移动脚本 明日计划:继续学习并进行脚本编写 剩余任务:物品背包交互代码 困难:如何把各个模块的脚本整合起来 --------- ...

  3. Java中的线程同步

    Java 中的线程同步问题: 1. 线程同步: 对于访问同一份资源的多个线程之间, 来进行协调的这个东西. 2. 同步方法: 当某个对象调用了同步方法时, 该对象上的其它同步方法必须等待该同步方法执行 ...

  4. 【MVC4升级到MVC5】ASP.Net MVC 4项目升级MVC 5的方法

    1.备份你的项目 2.从Web API升级到Web API 2,修改global.asax,将 ? 1 WebApiConfig.Register(GlobalConfiguration.Config ...

  5. textarea怎么解析html代码,从而实现一个可高亮的输入框

    效果: 思路: 让一个div浮动在textarea上,样式和位置保持完全一致,textarea负责输入,div负责高亮显示 代码: .vue <template> <div clas ...

  6. windows与linux下执行.class(包含main方法)

    来源:http://blog.csdn.net/hanqunfeng/article/details/4327325 一般来说,执行一个java文件采用执行jar包的方式最为方便(java -jar ...

  7. Jira & SVN & Chrome extensions

    Jira & SVN & Chrome extensions Plugins SVN & Jira Plugins ok selector bug document.query ...

  8. 从一个简单的main方法执行谈谈JVM工作机制

    本来JVM的工作原理浅到可以泛泛而谈,但如果真的想把JVM工作机制弄清楚,实在是很难,涉及到的知识领域太多.所以,本文通过简单的mian方法执行,浅谈JVM工作原理,看看JVM里面都发生了什么. 先上 ...

  9. RT-thread内核之线程调度器

    一.前言 RT-Thread中提供的线程调度器是基于全抢占式优先级的调度,在系统中除了中断处理函数.调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自 ...

  10. HUAS 1480 虫洞(最短路)

    把每个点拆成两个点,分别表示黑洞和白洞,然后按题意模拟加边跑最短路即可. # include <cstdio> # include <cstring> # include &l ...