Android组件, 四大组件之Activity

Android组件Activity

什么是Activity

首先我们要知道Activity是一个什么东西)。Activity是Android用得最多且是最基本的组件。官方的说法是Activity一个应用程序的组件,它提供一个屏幕来与用户交互,以便做一些诸如打电话、发邮件和看地图之类的事情,原话如下:“An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map.”。

Activity的生命周期

借用两张经典Activity生命周期图:

Activity生命周期
Activity进程生命周期

从这两张图上可以看到,Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。

a).Activity 应在 onCreate() 中执行“全局”状态设置(例如定义布局),并释放 onDestroy() 中的所有其余资源。例如,如果您的 Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在onCreate() 中创建该线程,然后在 onDestroy() 中停止该线程。

b).Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用 onStop() 。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart() 中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop() 中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart() 和 onStop()

c).Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台 — 例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause() 。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

在清单文件中声明 Activity

AndroidManifest 文件中声明 Activity,并将元素添加为元素的子项。这样系统才能访问它。例如:

<mainfest ...>

    <application ...>

        <activity android:name=".MainActivity"/>

        ....

    </application>

</mainfest>

还可以在此元素中加入几个其他特性,以定义 Activity 标签、Activity 图标或风格主题等用于设置 Activity UI 风格的属性。android:name属性是唯一必需的属性—它指定 Activity 的类名。应用一旦发布,即不应更改此类名,否则,可能会破坏诸如应用快捷方式等一些功能。

使用 Intent 过滤器

元素还可指定各种 Intent 过滤器—使用元素—以声明其他应用组件激活它的方法。

使用 Android SDK 工具创建新应用时,系统自动创建的存根 Activity 包含一个 Intent 过滤器,其中声明了该 Activity 响应“主”操作且应置于“launcher”类别内。 Intent 过滤器的内容如下所示:

<activity android:name=".MainActivity" android:icon="@drawable/app_icon">

    <intent-filter>

        <action android:name="android.intent.action.Main"/>

        <category android:name="android.intent.category.LUNCHER"/>

    </intent-filter>

</activity>

<action> 元素制定这是应用的“主”入口点,<category> 元素制定此 Activity 应列入系统的应用启动器内(以便用户启动该 Activity)。

如果打算让应用成为独立应用,不允许其他应用激活其 Activity,则不需要任何其他Intent 过滤器。 正如前例所示,只应有一个 Activity 具有“主”操作和“launcher”类别。 不提供给其他应用的 Activity 任何 Intent 过滤器。

启动Activity

从官方API看:

可以通过调用 startActivity(),并将其传递给描述想启动的 Activity 的 Intent 来启动另一个 Activity。Intent 对象会指定想启动的具体 Activity 或描述想执行的操作类型(系统会为您选择合适的 Activity,甚至是来自其他应用的 Activity)。 Intent 对象还可能携带少量供所启动 Activity 使用的数据。

在您的自有应用内工作时,您经常只需要启动某个已知 Activity。 您可以通过使用类名创建一个显式定义您想启动的 Activity 的 Intent 对象来实现此目的。 例如,可以通过以下代码让一个 Activity 启动另一个名为SignInActivity的 Activity:

Intentintent=newIntent(this,SignInActivity.class);

startActivity(intent);

不过,您的应用可能还需要利用您的 Activity 数据执行某项操作,例如发送电子邮件、短信或状态更新。 在这种情况下,您的应用自身可能不具有执行此类操作所需的 Activity,因此您可以改为利用设备上其他应用提供的 Activity 为您执行这些操作。 这便是 Intent 对象的真正价值所在 — 您可以创建一个 Intent 对象,对您想执行的操作进行描述,系统会从其他应用启动相应的 Activity。 如果有多个 Activity 可以处理 Intent,则用户可以选择要使用哪一个。 例如,如果您想允许用户发送电子邮件,可以创建以下 Intent:

Intentintent=newIntent(Intent.ACTION_SEND);

intent.putExtra(Intent.EXTRA_EMAIL,recipientArray);

startActivity(intent);

添加到 Intent 中的EXTRA_EMAILextra 是一个字符串数组,其中包含应将电子邮件发送到的电子邮件地址。 当电子邮件应用响应此 Intent 时,它会读取 extra 中提供的字符串数组,并将它们放入电子邮件撰写窗体的“收件人”字段。 在这种情况下,电子邮件应用的 Activity 启动,并且当用户完成操作时,您的 Activity 会恢复执行。

还有一种 启动 Activity 以获得结果:

有时可能需要从启动的 Activity 获得结果。在这种情况下,请通过调用startActivityForResult()(而非startActivity())来启动 Activity。 要想在随后收到后续 Activity 的结果,请实现onActivityResult()回调方法。 当后续 Activity 完成时,它会使用Intent向您的onActivityResult()方法返回结果。

例如,您可能希望用户选取其中一位联系人,以便您的 Activity 对该联系人中的信息执行某项操作。 您可以通过以下代码创建此类 Intent 并处理结果:

privatevoidpickContact(){

// Create an intent to "pick" a contact, as defined by the content provider URI

Intentintent=newIntent(Intent.ACTION_PICK,Contacts.CONTENT_URI);

startActivityForResult(intent,PICK_CONTACT_REQUEST);

}

@Override

protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){

// If the request went well (OK) and the request was PICK_CONTACT_REQUEST

if(resultCode==Activity.RESULT_OK&&requestCode==PICK_CONTACT_REQUEST){

// Perform a query to the contact's content provider for the contact's name

Cursorcursor=getContentResolver().query(data.getData(),

newString[]{Contacts.DISPLAY_NAME},null,null,null);

if(cursor.moveToFirst()){// True if the cursor is not empty

intcolumnIndex=cursor.getColumnIndex(Contacts.DISPLAY_NAME);

Stringname=cursor.getString(columnIndex);

// Do something with the selected contact's name...

}

}

}

上例显示的是,您在处理 Activity 结果时应该在onActivityResult()方法中使用的基本逻辑。 第一个条件检查请求是否成功(如果成功,则resultCode将为RESULT_OK)以及此结果响应的请求是否已知 — 在此情况下,requestCode与随startActivityForResult()发送的第二个参数匹配。 代码通过查询Intent中返回的数据(data参数)从该处开始处理 Activity 结果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容

  • Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件...
    牧童遥指2000阅读 5,035评论 0 12
  • Activity https://developer.android.com/guide/components/a...
    XLsn0w阅读 694评论 0 4
  • [文章内容来自Developers]应用通常包含多个 Activity。每个 Activity 均应围绕用户可以执...
    岳小川阅读 689评论 0 4
  • Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等...
    岳小川阅读 479评论 0 3
  • 喜欢世界的安宁, 和风轻吹, 暖阳煦照, 恋人们手牵手, 孩儿们身边绕。 当世界开始嘈杂, 厌烦至极, 身上的淤青...
    summerdan阅读 226评论 0 0