Activity及Intent
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的更多相关文章
- Android 学习Activity(1)activity和intent
工具是:JDK环境配置+SDK+ADT工具 一.Activity 主要作用: 1.用户与应用程序的接口 2.控件的容器 二.创建Activity要点:(在src中的目录下包里) 1.一个Activi ...
- 常见的Activity Action Intent常量
Intent的中文意思是“意图,目的”的意思,可以理解为不同组件之间通信的“媒介”或者“信使”. 目标组件一般要通过Intent来声明自己的条件,一般通过组件中的<intent-filter&g ...
- 【转】Android Activity和Intent机制学习笔记----不错
原文网址:http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html Activity Android中,Activity是所有程序的根 ...
- Android Activity和Intent机制学习笔记
转自 http://www.cnblogs.com/feisky: Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具 ...
- Activity 和 Intent
Activity 和 Intent 一.Intent指向Activity 二.利用 Intent 向第二个 Activity 传数据 三.利用 Intent 接受第二个 Activity 的返回值 四 ...
- 二、activity与Intent
(一) 多个activity之间的跳转(无值传递) 第一步:创建activity(其实就是jave文件),并进行注册 在AndroidManifest.xml中 <activity androi ...
- 【Android开发学习笔记】【第三课】Activity和Intent
首先来看一个Activity当中启动另一个Activity,直接上代码说吧: (1)首先要多个Activity,那么首先在res-layout下新建一个 Other.xml,用来充当第二个Activi ...
- 5、四大组件之一-Activity与Intent
一.Activity的定义及作用 1)官方定义:Activity是Android应用程序提供交互界面的一个重要组件 . 也是Android最重要的组件之一 2)Activity是业务类 , 是承载应用 ...
- 多个Activity和Intent(转)
根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...
随机推荐
- Nodejs基础之redis
安装redis 模块 npm install redis 1 代码部分 const redis = require('redis') const client = redis.createClient ...
- Eclipse安装颜色主题,个性化你的IDE,让你的IDE焕然一新
我们都知道eclipse默认的颜色主题是白色的背景,但是如果想改变代码编辑区的背景颜色,需要怎么办呢? 今天给大家介绍一个非常赞的eclipse,可以很方便的根据自己的需求选择喜欢的颜色主题,其他的不 ...
- Git 命令详解及常用命令
Git 命令详解及常用命令 Git作为常用的版本控制工具,多了解一些命令,将能省去很多时间,下面这张图是比较好的一张,贴出了看一下: 关于git,首先需要了解几个名词,如下: 1 2 3 4 Work ...
- 《梦断代码Dreaming In Code》阅读计划
书籍是人类宝贵的精神财富,读书是人们重要的学习方式,是人生奋斗的航灯,是文化传承的通道,是人类进步的阶梯.学生作为学习人群的主体,必须把读书作为头等大事.学校就是一个学生在教师指导下自主读书的空间,而 ...
- iOS-【UIDynamic-UIKit动力学】
如果看不到图片 可以尝试更换浏览器(推荐Safari ) 0.了解 •Dynamic Animator:动画者,为动力学元素提供物理学相关的能力及动画,同时为这些元素提供相关的上下文,是动力学元素与底 ...
- s3c2440调试nandflash裸机程序遇到的问题
图挂了可以去 https://github.com/tanghammer/mini2440_peripherals/blob/master/nand/debug_nand.md 按照前面sdram的代 ...
- Ubuntu安装配置JDK、Tomcat、SVN服务器
一.配置jdk 1.下载JDK http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 注:笔者是直 ...
- 《Effective C#》快速笔记(三)- 使用 C# 表达设计
目录 二十一.限制类型的可见性 二十二.通过定义并实现接口替代继承 二十三.理解接口方法和虚方法的区别 二十四.用委托实现回调 二十五.用事件模式实现通知 二十六.避免返回对内部类对象的引用 二十七. ...
- 关于houghlines函数角度问题的说明
以上是opecv reference里面的说明. Image必须是8位单通道图(可以使灰度图.二值图.边缘图等) Rho:距离分辨率,一般为1 Theta:角度分辨率,一般为CV_PI/180 Thr ...
- 移除 ios 上 input 的默认样式
input{ -webkit-appearance:none; }