Activity詳解

一、Activity簡(jiǎn)述

1、概念引入

圖1.1 Activity類圖結(jié)構(gòu)

Activity作為Android的四大組件之一按厘,Activity在Android系統(tǒng)中是以界面的形式進(jìn)行體現(xiàn)抵恋。其中Activity實(shí)現(xiàn)了如Window.Callback, KeyEvent.Callback等接口用于與用戶進(jìn)行交互纲菌。

2挠日、源碼釋義

    An activity is a single, focused thing that the user can do. 

一個(gè)界面是開發(fā)者可以操作的一個(gè)重點(diǎn)的獨(dú)立事項(xiàng)。

    Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View). 

幾乎所有界面都可以與用戶交互翰舌,所以Activity類負(fù)責(zé)為用戶創(chuàng)建一個(gè)窗口嚣潜,你可以在其中使用setContentView(View)放置UI。

    While activities are often presented to the user as full-screen windows, they can also be used in other ways: as floating windows (via a theme with windowIsFloating set) or embedded inside of another activity (using ActivityGroup). 

雖然界面通常以全屏窗口的形式呈現(xiàn)給用戶椅贱,但它們也可以以其他方式使用:作為浮動(dòng)窗口(通過具有windowIsFloating集合的主題)或嵌入另一個(gè)活動(dòng)(使用ActivityGroup)內(nèi)部懂算。

    There are two methods almost all subclasses of Activity will implement:

幾乎所有的Activity子類都會(huì)實(shí)現(xiàn)兩種方法:

    onCreate(Bundle) is where you initialize your activity. Most importantly, here you will usually call setContentView(int) with a layout resource defining your UI, and using findViewById(int) to retrieve the widgets in that UI that you need to interact with programmatically.

onCreate(Bundle)是初始化界面的地方。最重要的是庇麦,在這里你通常會(huì)調(diào)用setContentView(int)和一個(gè)定義你的UI的布局資源计技,并且使用findViewById(int)來檢索你需要以編程方式進(jìn)行交互的那個(gè)UI中控件。

    onPause() is where you deal with the user leaving your activity.Most importantly, any changes made by the user should at this point be committed (usually to the ContentProvider holding the data).

onPause()是你對(duì)于用戶離開界面的處理山橄。最重要的是垮媒,此時(shí)用戶所做的任何更改都應(yīng)該提交(通常發(fā)送給持有數(shù)據(jù)的ContentProvider。

    To be of use with Context.startActivity(), all activity classes must have a corresponding declaration in their package's AndroidManifest.xml.

要使用Context.startActivity()航棱,所有界面類必須在其包下的AndroidManifest.xml中具有相應(yīng)的聲明睡雇。


二、Activity的生命周期

1饮醇、Activity的生命周期圖

圖2.1 Activity生命周期圖

2它抱、生命周期詳解

2.1、OnCreate()方法

    Called when the activity is first created. This is where you should do all of your normal static set up:
    create views, bind data to lists, etc. 

在第一次創(chuàng)建活動(dòng)時(shí)調(diào)用驳阎。 這是你應(yīng)該完成所有常規(guī)靜態(tài)設(shè)置的位置:創(chuàng)建視圖抗愁,將數(shù)據(jù)綁定到列表等。

    This method also provides you with a Bundle containing the activity's previously frozen state, if there was one.Always followed by onStart().

此方法還會(huì)為你提供一個(gè)包含Activity先前保存頁面狀態(tài)的Bundle對(duì)象(如果有的話)呵晚。總是跟著onStart()方法沫屡。

2.2饵隙、OnRestart()方法

    Called after your activity has been stopped, prior to it being started again.

在你的界面停止后調(diào)用,然后再次啟動(dòng)沮脖。

    Always followed by onStart()

總是跟著onStart()

2.3金矛、OnStart()方法

    Called when the activity is becoming visible to the user.

當(dāng)界面對(duì)用戶變得可見時(shí)調(diào)用。

    Followed by onResume() if the activity comes to the foreground, or onStop() if it becomes hidden.

如果活動(dòng)進(jìn)入前臺(tái)勺届,則跟隨執(zhí)行onResume()方法驶俊,如果隱藏,則執(zhí)行onStop()免姿。
此時(shí)饼酿,Activity實(shí)際上就已經(jīng)可見了,但是還沒有出現(xiàn)在前臺(tái),無法和用戶進(jìn)行交互故俐。

2.4想鹰、onResume()方法

    Called when the activity will start interacting with the user.

當(dāng)界面對(duì)用戶變得可見時(shí)調(diào)用。

    At this point your activity is at the top of the activity stack, with user input going to it.Always followed by onPause().

如果界面進(jìn)入前臺(tái)药版,則跟隨onResume()方法辑舷,如果隱藏,則執(zhí)行onStop()方法槽片。
此時(shí)何缓,Activity已經(jīng)可見,并且出現(xiàn)在前臺(tái)并開始活動(dòng)还栓。要注意的是onStart()被執(zhí)行時(shí)Activity顯示在后臺(tái)碌廓,只有當(dāng)OnResume()被執(zhí)行時(shí)Activity才顯示到前臺(tái)。

2.5蝙云、onPause()方法

    Called when the system is about to start resuming a previous activity. This is typically used to commit unsaved changes to persistent data, stop animations and other things that may be consuming CPU, etc. Implementations of this method must be very quick because the next activity will not be resumed until this method returns.

onPause()方法在系統(tǒng)即將開始顯示之前的界面時(shí)調(diào)用氓皱。 這通常用于將未保存的更改進(jìn)行保存,并保存為持久化數(shù)據(jù)勃刨,并且會(huì)執(zhí)行例如停止動(dòng)畫和其他可能消耗CPU的內(nèi)容等波材。此方法的實(shí)現(xiàn)必須非常快速身隐,因?yàn)樵诖朔椒ǚ祷刂巴⑶乱粋€(gè)界面不會(huì)顯示。

    Followed by either onResume() if the activity returns back to the front, or onStop() if it becomes invisible to the user.

如果界面返回到前臺(tái)贾铝,則跟隨onResume();如果對(duì)用戶不可見隙轻,則使用onStop()。

  • onPause()方法執(zhí)行后垢揩,Activity界面切換為后臺(tái)程序

2.6玖绿、onStop()方法

    Called when the activity is no longer visible to the user, because another activity has been resumed and is covering this one. This may happen either because a new activity is being started, an existing one is being brought in front of this one, or this one is being destroyed.

onStop()方法會(huì)在當(dāng)界面對(duì)用戶不再可見時(shí)調(diào)用,因?yàn)榱硪豁?xiàng)界面正在顯示并要去覆蓋這個(gè)界面叁巨。 這可能是因?yàn)橐豁?xiàng)新的界面正在開始斑匪,其他的界面會(huì)被顯示為前臺(tái)界面,或者這個(gè)界面正在被摧毀锋勺。

    Followed by either onRestart() if this activity is coming back to interact with the user, or onDestroy() if this activity is going away.

如果這個(gè)界面快速的回顯與用戶交互緊接著onRestart()會(huì)被執(zhí)行蚀瘸,否則,這個(gè)界面回銷毀onDestroy()方法會(huì)被執(zhí)行庶橱。

2.6贮勃、onDestroy()方法

    The final call you receive before your activity is destroyed. This can happen either because the activity is finishing (someone called finish() on it, or because the system is temporarily destroying this instance of the activity to save space. You can distinguish between these two scenarios with the isFinishing() method.)

在你的界面被銷毀前被最后調(diào)用的方法。 這可能是因?yàn)榻缑嬲诮Y(jié)束(有人在其中調(diào)用finish()方法因?yàn)橄到y(tǒng)會(huì)暫時(shí)銷毀此Activity界面的實(shí)例以節(jié)省空間苏章,你可以使用isFinishing()方法區(qū)分內(nèi)存空間是否節(jié)省資源的這兩種情況)寂嘉。

3、異常情況下生命周期詳解

3.1、橫豎屏切換時(shí)Activity的生命周期

此時(shí)的生命周期跟清單文件里的配置有關(guān)系垫释。
不設(shè)置 Activity 的 android:configChanges 時(shí)丝格,橫豎屏切換會(huì)重新調(diào)用各個(gè)生命周期,銷毀當(dāng)前 activity棵譬,然后重新加載显蝌,跟系統(tǒng)配置有關(guān)。
onSaveInstanceState()方法會(huì)在當(dāng)前頁面銷毀前被調(diào)用存儲(chǔ)數(shù)據(jù)订咸,onRestoreInstanceState()方法會(huì)被執(zhí)行去取出保存的Bundle對(duì)象中的內(nèi)容曼尊,進(jìn)行一次橫豎屏切換時(shí)Activity所執(zhí)行的生命周期方法以及在onSaveInstanceState與onRestoreInstanceState打印相應(yīng)日志,如下圖所示:

圖2.3.1.1 Activity橫豎屏切換的生命周期圖.png

③對(duì)于onRestoreInstanceState()方法脏嚷,源碼中的注釋如下:

      This method is called after onStart when the activity is being re-initialized from a previously saved state, given here in savedInstanceState.  

當(dāng)這個(gè)界面從之前保存的狀態(tài)重新初始化時(shí)骆撇,這個(gè)方法在onStart之后被調(diào)用,這里在savedInstanceState中給出父叙。

      Most implementations will simply use onCreate to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation.  The default implementation of this method performs a restore of any view state that had previously been frozen by onSaveInstanceState.

大多數(shù)時(shí)神郊,可以直接從onCreate()方法中的Bundle對(duì)象從中獲取內(nèi)容來恢復(fù)之前的頁面狀態(tài),但有時(shí)在完成所有初始化或允許子類決定使用默認(rèn)實(shí)現(xiàn)之后趾唱,在此處執(zhí)行重新獲取已存儲(chǔ)數(shù)據(jù)的操作很方便涌乳。 此方法的默認(rèn)實(shí)現(xiàn)會(huì)還原之前由onSaveInstanceState保存的任何視圖狀態(tài)。
根據(jù)源碼可以得知onRestoreInstanceState 方法的默認(rèn)實(shí)現(xiàn)會(huì)還原之前由onSaveInstanceState保存的任何視圖狀態(tài)甜癞。

圖2.3.1.2 橫豎屏切換時(shí)執(zhí)行的生命周期

  • 關(guān)于保存和恢復(fù)View層次結(jié)構(gòu)系統(tǒng)工作流程是這樣的:首先Activity被意外終止時(shí)夕晓,Activity會(huì)調(diào)用
    onSaveInstanceState去保存數(shù)據(jù),然后Activity會(huì)委托Window去保存數(shù)據(jù)悠咱,接著Window會(huì)委托它上面的頂層容器去保存數(shù)據(jù)蒸辆。頂層容器肯是一個(gè)ViewGroup,一般來說是DecorView析既。最后頂層容器再去一一通知它的子元素來保存數(shù)據(jù)躬贡,這樣整個(gè)數(shù)據(jù)保存過程就完成了。
    這是一種典型的委托思想眼坏,上層委托下層逗宜、父容器委托子元素去處理一件事件;在View的繪制流程空骚、事件分發(fā)都是采用這種思想在處理。
Activity重新創(chuàng)建圖解.png

3.2擂仍、資源內(nèi)容不足時(shí)導(dǎo)致低優(yōu)先級(jí)的Activity被殺死

Activity按優(yōu)先級(jí)從高到低可分為如下3種:

Activity按優(yōu)先級(jí)從高到低
①前臺(tái)Activity-正在和用戶進(jìn)行交互的頁面(優(yōu)先級(jí)最高)囤屹。
②可見但非前臺(tái)Activity-比如Activity中彈出了一個(gè)對(duì)話框,導(dǎo)致Activity可見逢渔,但是位于后臺(tái)無法和用戶進(jìn)行直接交互(優(yōu)先級(jí)居中)肋坚。
③后臺(tái)Activity-已經(jīng)被暫停的Activity,比如執(zhí)行了onStop()(優(yōu)先級(jí)最低)。當(dāng)系統(tǒng)內(nèi)存不足時(shí)智厌,系統(tǒng)會(huì)按照優(yōu)先級(jí)由低到高去殺死Activity所在的進(jìn)程诲泌,通過onSaveInstanceState存儲(chǔ)數(shù)據(jù),通過onRestoreInstanceState 恢復(fù)數(shù)據(jù)铣鹏,如果一個(gè)進(jìn)程沒有四大組件作為依附敷扫,那么這個(gè)進(jìn)程很快就會(huì)被殺死。
  • 根據(jù)上述的分析诚卸,系統(tǒng)配置發(fā)生改變后葵第,系統(tǒng)會(huì)重新創(chuàng)建Activity,那么是否可以不重新創(chuàng)建Activity呢?
    答案是有的合溺,那就是在清單文件中為相應(yīng)的Activity配置configChanges屬性卒密,并添加相應(yīng)值
圖3.2.1.1 configChanges屬性的配置
防止Activity重新創(chuàng)建,android:configChanges時(shí)還需注意的點(diǎn)
1. 不設(shè)置Activity的android:configChanges時(shí)棠赛。切屏?xí)忠淮握{(diào)用整個(gè)生命周期哮奇,切橫屏?xí)r會(huì)運(yùn)行一次,切豎屏?xí)r會(huì)運(yùn)行兩次
2. 設(shè)置Activity的android:configChanges="orientation"時(shí)睛约,切屏還是會(huì)又一次調(diào)用整個(gè)生命周期鼎俘,切橫、豎屏?xí)r僅僅會(huì)運(yùn)行一次
3. 設(shè)置Activity的android:configChanges="orientation丨keyboardHidden"時(shí)痰腮,切屏不會(huì)又一次調(diào)用整個(gè)生命周期而芥,僅僅會(huì)運(yùn)行onConfigurationChanged方法
4. 可是。自從Android 3.2(API 13)膀值,在設(shè)置Activity的android:configChanges="orientation丨keyboardHidden"后棍丐。還是一樣會(huì)又一次調(diào)用各個(gè)生命周期的。由于screensize也開始跟著設(shè)備的橫豎切換而改變沧踏。所以在AndroidManifest.xml里設(shè)置的MiniSdkVersion和 TargetSdkVersion屬性大于等于13的情況下歌逢,假設(shè)你想阻止程序在執(zhí)行時(shí)又一次載入Activity,除了設(shè)置"orientation"翘狱。 你還必須設(shè)置" screenSize"秘案。
  • android:configChanges配置的屬性不僅局限于此,下圖為android:configChanges可配置的所有屬性內(nèi)容:


    圖3.2.1.2 android:configChanges可配置的屬性

三潦匈、Activity任務(wù)與任務(wù)管理?xiàng)?/h2>

1阱高、任務(wù)與任務(wù)棧概述

任務(wù)是指在執(zhí)行特定作業(yè)時(shí)與用戶交互的一系列 Activity。 這些 Activity 按照各自的打開順序排列在堆棧(即任務(wù)棧)中茬缩。

  • 設(shè)備主屏幕是大多數(shù)任務(wù)的起點(diǎn)赤惊。當(dāng)用戶觸摸應(yīng)用啟動(dòng)器中的圖標(biāo)(或主屏幕上的快捷方式)時(shí),該應(yīng)用的任務(wù)將出現(xiàn)在前臺(tái)凰锡。 如果應(yīng)用不存在任務(wù)(應(yīng)用最近未曾使用)未舟,則會(huì)創(chuàng)建一個(gè)新任務(wù)圈暗,并且該應(yīng)用的“主”Activity 將作為堆棧中的根 Activity 打開。

當(dāng)前 Activity 啟動(dòng)另一個(gè) Activity 時(shí)裕膀,該新 Activity 會(huì)被推送到堆棧頂部员串,成為焦點(diǎn)所在。 前一個(gè) Activity 仍保留在堆棧中昼扛,但是處于停止?fàn)顟B(tài)寸齐。Activity 停止時(shí),系統(tǒng)會(huì)保持其用戶界面的當(dāng)前狀態(tài)野揪。 用戶按“返回”按鈕時(shí)访忿,當(dāng)前 Activity 會(huì)從堆棧頂部彈出(Activity 被銷毀),而前一個(gè) Activity 恢復(fù)執(zhí)行(恢復(fù)其 UI 的前一狀態(tài))斯稳。 堆棧中的 Activity 永遠(yuǎn)不會(huì)重新排列海铆,僅推入和彈出堆棧:由當(dāng)前 Activity 啟動(dòng)時(shí)推入堆棧;用戶使用“返回”按鈕退出時(shí)彈出堆棧挣惰。 因此卧斟,返回棧以“后進(jìn)先出”對(duì)象結(jié)構(gòu)運(yùn)行。 下圖 通過時(shí)間線顯示 Activity 之間的進(jìn)度以及每個(gè)時(shí)間點(diǎn)的當(dāng)前返回棧憎茂,直觀呈現(xiàn)了這種行為珍语。

圖3.1 Activity任務(wù)棧

2、任務(wù)棧關(guān)聯(lián)

關(guān)聯(lián)指 Activity 優(yōu)先屬于哪個(gè)任務(wù)竖幔。默認(rèn)情況下板乙,同一應(yīng)用中的所有 Activity 彼此關(guān)聯(lián)。 因此拳氢,默認(rèn)情況下募逞,同一應(yīng)用中的所有 Activity 優(yōu)先位于相同任務(wù)中。 不過馋评,可以修改 Activity 的默認(rèn)關(guān)聯(lián)放接。 在不同應(yīng)用中定義的 Activity 可以共享關(guān)聯(lián),或者可為在同一應(yīng)用中定義的 Activity 分配不同的任務(wù)關(guān)聯(lián)留特。

  • 可以使用activity元素的 taskAffinity屬性修改任何給定 Activity 的關(guān)聯(lián)纠脾。

taskAffinity 屬性取字符串值,該值必須不同于在AndroidManifest.xml文件中聲明的默認(rèn)軟件包名稱蜕青,因?yàn)橄到y(tǒng)使用該名稱標(biāo)識(shí)應(yīng)用的默認(rèn)任務(wù)關(guān)聯(lián)苟蹈。

在兩種情況下,關(guān)聯(lián)會(huì)起作用:

  1. 啟動(dòng) Activity 的 Intent 包含 FLAG_ACTIVITY_NEW_TASK標(biāo)志右核。

  2. Activity 將其allowTaskReparenting 屬性設(shè)置為 true汉操。

    在這種情況下,Activity 可以從其啟動(dòng)的任務(wù)移動(dòng)到與其具有關(guān)聯(lián)的任務(wù)(如果該任務(wù)出現(xiàn)在前臺(tái))蒙兰。

3磷瘤、清理任務(wù)棧

如果用戶長(zhǎng)時(shí)間離開應(yīng)用,則系統(tǒng)會(huì)清除應(yīng)用下所有除 Activity 的所有 Activity 搜变。 當(dāng)用戶再次返回到任務(wù)時(shí)采缚,僅恢復(fù)根 Activity。系統(tǒng)這樣做的原因是挠他,經(jīng)過很長(zhǎng)一段時(shí)間后扳抽,用戶可能已經(jīng)放棄之前執(zhí)行的操作,返回到任務(wù)是要開始執(zhí)行新的操作殖侵。
可以使用下列幾個(gè) Activity 屬性修改此行為:

  • alwaysRetainTaskState
    如果在任務(wù)的根 Activity 中將此屬性設(shè)置為 true`贸呢,則不會(huì)發(fā)生剛才所述的默認(rèn)行為。即使在很長(zhǎng)一段時(shí)間后拢军,任務(wù)仍將所有 Activity 保留在其堆棧中楞陷。

  • clearTaskOnLaunch
    如果在任務(wù)的根 Activity 中將此屬性設(shè)置為 "true",則每當(dāng)用戶離開任務(wù)然后返回時(shí)茉唉,系統(tǒng)都會(huì)將堆棧清除到只剩下根 Activity固蛾。 換而言之,它與 alwaysRetainTaskState 正好相反度陆。 即使只離開任務(wù)片刻時(shí)間艾凯,用戶也始終會(huì)返回到任務(wù)的初始狀態(tài)。

  • finishOnTaskLaunch
    此屬性類似于 clearTaskOnLaunch懂傀,但它對(duì)單個(gè) Activity 起作用趾诗,而非整個(gè)任務(wù)。 此外蹬蚁,它還有可能會(huì)導(dǎo)致任何 Activity 停止恃泪,包括根 Activity。 設(shè)置為 true 時(shí)缚忧,Activity 仍是任務(wù)的一部分悟泵,但是僅限于當(dāng)前會(huì)話。如果用戶離開然后返回任務(wù)闪水,則任務(wù)將不復(fù)存在糕非。


四、Activity的啟動(dòng)模式

在AndroidManifest.xml文件中為Activity配置相應(yīng)的launchMode屬性可以設(shè)置Activity的啟動(dòng)模式球榆,共如下四種模式:

  • standard
  • singleTask
  • singleTop
  • singleInstance
    接下來對(duì)四種啟動(dòng)模式進(jìn)行詳細(xì)分析朽肥。

1、standard模式

標(biāo)準(zhǔn)啟動(dòng)模式:
該模式下每次啟動(dòng)Activity都會(huì)重新創(chuàng)建Activity實(shí)例持钉,在這種模式下誰啟動(dòng)了這個(gè)Actvitiy衡招,那么這個(gè)Activity與被啟動(dòng)的Activity位于啟動(dòng)它的Activity的棧中。

但是在代碼中采用ApplicationContext去開啟Activity時(shí)(例如執(zhí)行如下代碼時(shí)):

getApplication().startActivity(new Intent(HomeActivity.this,MainActivity.class));

會(huì)報(bào)如下所示的錯(cuò)誤

圖4.1 采用ApplicationContext去開啟Activity時(shí)的錯(cuò)誤

  • 分析:非Activity類型的Context(如ApplicationContext)并沒有任務(wù)棧每强。
  • 解決方案:為待啟動(dòng)的Activity指定FLAG_ACTIVITY_NEW_TASK標(biāo)記始腾,那么通過這種方式啟動(dòng)的Activity就會(huì)新開啟一個(gè)任務(wù)棧州刽。

2、singleTop模式

棧頂復(fù)用模式:
該模式下如果Activity已經(jīng)位于棧頂浪箭,那么該Activity不會(huì)重新創(chuàng)建穗椅,同時(shí)它的OnNewIntent方法會(huì)被調(diào)用,通過方法的參數(shù)可以取出其中的信息奶栖,并且在這種模式如果這個(gè)Actvitiy不位于棧頂匹表,那么這個(gè)Activity依然會(huì)被重新創(chuàng)建。

圖4.2 OnNewIntent方法

3宣鄙、singleTask模式

棧內(nèi)復(fù)用模式:
只要Activity實(shí)例在一個(gè)棧中存在袍镀,那么再次啟動(dòng)該Activity時(shí)不會(huì)重新創(chuàng)建實(shí)例,并且系統(tǒng)也會(huì)回調(diào)其OnNewIntent方法冻晤,并且該模式下有清除棧頂實(shí)例的效果苇羡,即會(huì)將與singleTask模式下的該Activity同一個(gè)棧中的棧頂?shù)乃蠥ctivity實(shí)例全部出棧。

4明也、singleInstance模式

單實(shí)例模式:
單實(shí)例模式具備singleTask模式的所有的特性宣虾,此外具有此模式的Activity只能單獨(dú)位于一個(gè)任務(wù)棧中。

在這里温数,我們以HomeActivity绣硝、MainActivity、DetailActivity三個(gè)Activity演示singleInstance模式下的頁面跳轉(zhuǎn)撑刺,其中MainActivity為singleInstance模式鹉胖,其他兩個(gè)頁面為standard模式,如下圖演示效果:

圖4.4.1 單實(shí)例模式下Activity的跳轉(zhuǎn)

在每個(gè)Activity中我們調(diào)用getTaskId()够傍,如下圖打印其棧Id,我們可以查看到standard模式的HomeActivity與DetailActivity都位于同一個(gè)棧中甫菠,而singleInstance模式下的MainActivity單獨(dú)位于一個(gè)棧中,綜上所述冕屯,系統(tǒng)會(huì)為singleInstance模式下的Activity創(chuàng)建一個(gè)新的任務(wù)棧寂诱。

圖4.4.2 打印查看棧id

五、Activity的啟動(dòng)方式

Activity的啟動(dòng)方式可以分為顯示啟動(dòng)和隱式啟動(dòng)安聘,當(dāng)兩者共存時(shí)使用的是顯示啟動(dòng)痰洒,而隱式啟動(dòng)不需要指定組件信息。兩者使用其中一種即可浴韭。那么在之后的文章中深入探究Intent以及IntentFilter在顯示丘喻、隱式開啟Activity及其他組件中的作用。

1念颈、顯示啟動(dòng)

顯示啟動(dòng)需要intent指定被啟動(dòng)對(duì)象的組件信息泉粉,包括包名和類名。顯示啟動(dòng)


圖4.1 啟動(dòng)啟動(dòng)示例圖

2、隱式啟動(dòng)

隱式啟動(dòng)調(diào)用需要Intent能夠匹配目標(biāo)組件的IntentFilter中所設(shè)置的過濾信息嗡靡,如果不匹配將無法啟動(dòng)目標(biāo)Activity跺撼。IntentFilter中過濾的信息有action、category叽躯、data财边。

  • 使用隱式Intent的時(shí)候,系統(tǒng)通過將Intent對(duì)象中的IntentFilter與組件在AndroidManifest.xml或者代碼中動(dòng)態(tài)聲明的IntentFilter進(jìn)行比較点骑,從而找到要啟動(dòng)的相應(yīng)組件。如果組件的IntentFilter與Intent中的IntentFilter正好匹配谍夭,系統(tǒng)就會(huì)啟動(dòng)該組件黑滴,并把Intent傳遞給它。如果有多個(gè)組件同時(shí)匹配到了紧索,系統(tǒng)則會(huì)彈出一個(gè)選擇框袁辈,讓用戶選擇使用哪個(gè)應(yīng)用去處理這個(gè)Intent,比如有時(shí)候點(diǎn)擊一個(gè)網(wǎng)頁鏈接珠漂,會(huì)彈出多個(gè)應(yīng)用晚缩,讓用戶選擇用哪個(gè)瀏覽器去打開該鏈接,就是這種情況媳危。

隱式啟動(dòng)Activity的代碼如下所示:

Intent intent = new Intent(Intent.ACTION_DIAL);
Uri data = Uri.parse("tel:" + "183xxxxxxxx");
intent.setData(data);
startActivity(intent);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荞彼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子待笑,更是在濱河造成了極大的恐慌鸣皂,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暮蹂,死亡現(xiàn)場(chǎng)離奇詭異寞缝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)仰泻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門荆陆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人集侯,你說我怎么就攤上這事被啼。” “怎么了浅悉?”我有些...
    開封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵趟据,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我术健,道長(zhǎng)汹碱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任荞估,我火速辦了婚禮咳促,結(jié)果婚禮上稚新,老公的妹妹穿的比我還像新娘。我一直安慰自己跪腹,他們只是感情好褂删,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冲茸,像睡著了一般屯阀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轴术,一...
    開封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天难衰,我揣著相機(jī)與錄音,去河邊找鬼逗栽。 笑死盖袭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彼宠。 我是一名探鬼主播鳄虱,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼凭峡!你這毒婦竟也來了拙已?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤想罕,失蹤者是張志新(化名)和其女友劉穎悠栓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體按价,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惭适,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楼镐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癞志。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖框产,靈堂內(nèi)的尸體忽然破棺而出凄杯,到底是詐尸還是另有隱情,我是刑警寧澤秉宿,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布戒突,位于F島的核電站,受9級(jí)特大地震影響描睦,放射性物質(zhì)發(fā)生泄漏膊存。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隔崎。 院中可真熱鬧今艺,春花似錦、人聲如沸爵卒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钓株。三九已至实牡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轴合,已是汗流浹背铲掐。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留值桩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓豪椿,卻偏偏與公主長(zhǎng)得像奔坟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搭盾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 【Android Activity】 什么是 Activity? 四大組件之一,通常一個(gè)用戶交互界面對(duì)應(yīng)一個(gè) ac...
    Rtia閱讀 3,797評(píng)論 3 18
  • 3.2 Activity詳解 3.2.1 生命周期分析 典型情況下生命周期分析 一般情況下咳秉,當(dāng)當(dāng)前Activity...
    jianhuih閱讀 1,105評(píng)論 0 0
  • 關(guān)于Activity 引用google官方文檔,是這么說的: Activity是一個(gè)應(yīng)用組件鸯隅,用戶可與其提供的屏幕...
    Cris_Ma閱讀 361評(píng)論 0 0
  • 當(dāng)你決定要學(xué)習(xí)android的時(shí)候澜建,這時(shí)候就需要制定一個(gè)學(xué)習(xí)路線,而我們應(yīng)該從哪里入手呢蝌以?你可以想象一下炕舵,當(dāng)你打開...
    強(qiáng)大帥閱讀 7,832評(píng)論 2 10
  • 生命中咽筋,總有一些人,一些事徊件,令你回味奸攻,令你感恩,令你念念不忘虱痕。而有些人睹耐,有些事,在當(dāng)時(shí)卻不覺得如何部翘,也不會(huì)記在心里...
    cola的春天閱讀 545評(píng)論 4 9