關于activity的一些事

AndroidAPI中Activity的一些內容,詳情:android API
<h3>概述:</h3>
Activity是這樣一個程序組件,它為用戶提供一個用于任務交互的畫面。例如,撥打電話,拍照,發郵件。或者查看地圖。每一個activity都被分配一個窗口。在這個窗口里,你可以繪制用戶交互的內容。 這個窗口通常占滿屏幕,但也有可能比屏幕小,并且浮在其它窗口的上面。
一個應用程序通常由多個activity組成,它們彼此保持弱的綁定狀態。典型的,當一個activity在一個應用程序內被指定為主activity, 那么當程序第一次啟動時,它將第一個展現在用戶面前。為了展現不同的內容,每一個activity可以啟動另外一個。 每當一個新的activity被啟動,那么之前的將被停止。但系統將會把它壓入一個棧(“back stack”即后退棧),當一個新的activity啟動,它將被 放到棧頂并獲得用戶焦點。后臺棧遵循后進先出的棧機制。所以當用戶完成當前頁面并按下返回按鈕時,它將被pop出棧(并銷毀),之前的activity將被恢復。 (關于后退棧的更多討論在任務和后退棧
當一個activity因為另一個activity的啟動而被停止,那么其生命周期中的回調方法,將會以狀態改變的形式被調用。 activity通過它自身狀態的改變可以收到多個回調方法。當系統創建,停止,恢復,銷毀它的時候。并且每個回調方法都給你做相應處理工作的機會。 例如,當停止的時候,你的activity應當釋放比較大的對象,例如網絡連接,數據連接。當你的activity恢復時,你可以請求必須的資源并恢復一些被打斷的動作。 這些狀態事務的處理就構成了activity的生命周期。
接下來將討論如何搭建和使用activity,完整討論activity的生命周期是怎么工作的,這樣你就可以合理地管理不同activity狀態間的事務處理。
<h4 id=“1”>1.創建一個Activity</h4>
要創建一個activity,你必須創建一個Activity
(或者它存在的子類)的子類。 在你的子類里,你需要實現系統調用的回調方法,這些方法用于activity在生命周期中進行事務處理。例如創建,停止,恢復,銷毀。其中兩個最重要的回調方法分別為:
onCreate()

你必須實現這個方法。系統會在創建activity的時候調用這個方法。 在實現這個方法的同時,你需要實現你activity的重要組件。 最重要的是,你必須在這里調用 setContentView()來定義你activity用于用戶交互的布局。
onPause()
系統將會調用這個方法作為用戶離開activity的首先提示(雖然這并不意味著activity正在被銷毀)。這通常是你應該在用戶會話之前提交并保存任何更改的時機。 (因為用戶可能不會再回到這個activity).

你還應該會用到一些其他的生命周期回調方法,它們將幫助你在activity和可能導致你的activity停止甚至銷毀之間保持流暢的用戶體驗。 所有的生命周期回調方法都將在后面討論。
<h4 id=“2”>2.實現一個用戶交互界面</h4>
activity的用戶接口由一些View的派生類組成的層級結構提供。 每一個view控制acitivity所在window的一個特殊的矩形空間。并且可以響應用戶的交互。 例如,一個view可能是一個按鈕,當用戶碰觸的時候將發起動作。
"Layouts"是一組繼承了ViewGroup的布局。它們為子視圖提供了唯一的布局模型。 例如線性布局,表格布局,相對布局。你也可以繼承View和ViewGroup
(或它們的子類)去創建你自己的組件或布局,并用它們組成activity布局。
定義布局最常用的方式是使用XML布局文件,它保存在你程序的資源中。這種方式可以保證你的業務邏輯代碼和用戶交互界面分開。你可以通過setContentView()
傳遞布局文件的ID來設置程序UI。 當然,你也可以在activity代碼里自己新建View
,并通過插入子View到ViewGroup。 然后把這些視圖的根視圖傳入到setContentView()。
<h4 id=“3”>3.使用filter</h4>
<activity> 也可以用很多<intent-filter>來指定其他的組件怎樣激活它。當你使用Android SDK tools來創建一個程序,主activity將會自動包含一個被分類為"launcher"的intent filter,如下:

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<action> 元素指定程序的入口。 <category> 指出該activity應該被列如系統的啟動器(launcher)(允許用戶啟動它)

如果你想要你的程序更加獨立,并不想讓其他程序訪問你的activity,那么你就不必聲明intent filter,只有一個activity 應該有"main"action和"launcher"分類,例如上述例子。你不想公開的activity應該不包含任何intent filter.但你可以使用明確 的intent來啟動它們。(下文將詳述)。

然而,如果你想要你的activity響應其他程序(或當前程序)的隱式intent,你必須為activity定義額外的intent filter。 每一個你想響應的intent,都必須包含一個 <intent-filter> ,并包含一個 <action> 元素,另外,可以包含一個 <category> 也可以包含一個 <data> 元素。 這些元素指定了intent 的類型。
<h4 id=“4”>4.在manifest中聲明activity</h4>
為了能讓系統訪問到你的activity,必須在manifest文件里對其進行聲明。 要聲明activity,請打開你的mainifest文件并添加一個 <activity> 元素,它必須是<application>元素的子元素。例如:

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

該元素中還可以包含很多其它的屬性,用于定義諸如activity的label、activity的圖標、activity UI的外觀theme之類。 android:name 屬性是唯一必需的屬性——它定義了activity的類名。應用程序一經發布,你就不得修改此名稱了。 假如修改了名稱,就可能破壞了某些功能,比如應用程序的快捷方式
<h4 id=“5”>5.啟動activity</h4>
可以通過調用 startActivity() 來啟動另一個activity,調用時傳遞一個描述了所要啟動activity的 Intent 。這個intent或是精確指定了所要啟動的activity,或是指明了需要執行的action類型 (然后系統會為你選擇一個合適的activity,甚至可以是其它應用程序中的activity)。 intent還可以攜帶少量的數據,這些數據可被所啟動的activity使用。

當應用程序運行時,經常會需要能夠便捷地啟動其它已知的activity。 這只要通過創建一個顯式的intent即可,這個intent用類名明確指定了你想要啟動的activity。 例如,下面是一個activity如何啟動另一個名為SignInActivity的activity:

Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);

不過,你的應用程序也許還需要執行一些其它的action,比如發送一個email、文本信息或者狀態更新信息之類,而這些action又需要用到你的activity中的數據。 這種情況下,你的應用程序本身可能不存在執行這些action的activity,所以你可以 利用本設備上其它應用提供的activity來為你執行這些動作。 這就是intent真正有價值的地方——你可以創建一個說明了你要執行action的intent, 而系統會從其它應用程序中啟動一個合適的activity。 如果存在多個activity都能夠處理此intent,那么用戶可以自己選擇一個來執行。 例如,如果你想要允許用戶發送一個email信息,可創建如下的intent:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);

附加在intent的extra部分中的EXTRA_EMAIL信息是一個有關email目標地址的字符串數組。 當email應用程序響應這個intent時, 它會讀取extra部分中的字符串數組并將它們填入撰寫email表單中的“to”字段。 在這種情況下,email應用程序的activity將會被啟動。并且當用戶完成發送后,你的activity將會恢復運行。
<h4 id=“6”>6. 啟動activity并返回結果</h4>
有時你可能需要從你啟動的activity里返回一個結果。 這種情況下,請通過調用 startActivityForResult() 來啟動一個activity(而不是 startActivity() )。然后,要想從被啟動的activity里接收到結果,請實現 onActivityResult() 回調方法。當該activity完成操作后,它會把一個包含結果的 Intent 返回到你的 onActivityResult() 中。
比如,也許你需要用戶選取一個聯系人,以便于你的activity能夠根據聯系人信息執行一些操作。下面就是創建intent并處理結果的示例:

private void pickContact() {
    // Create an intent to "pick" a contact, as defined by the content provider URI
    Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
    startActivityForResult(intent, PICK_CONTACT_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   
    // 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
        Cursor cursor = getContentResolver().query(data.getData(),
        new String[] {Contacts.DISPLAY_NAME}, null, null, null);
        if (cursor.moveToFirst()) { // True if the cursor is not empty
            int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
            String name = cursor.getString(columnIndex);
            // Do something with the selected contact's name...
        }
    }
}

以上例子展示了使用 onActivityResult() 方法來處理activity返回結果的基本邏輯。 第一個判斷條件是檢查請求是否成功——如果成功了resultCode 應該是RESULT_OK ,以及要求響應的請求是否是可識別的——在這種情況下,requestCode會與傳入 startActivityForResult() 的第二個參數相比較。 接下來,代碼通過查詢Intent 返回的數據(data參數)來處理activity的返回結果。

接下來,ContentResolver 通過content provider執行了一個查詢,查詢返回了一個包含查到數據以供讀取的 Cursor 。
<h4 id=“7”>7.關閉activity</h4>
可以調用activity的 finish() 方法來關閉它。也可以用 finishActivity() 方法來關閉一個你先前已經啟動的單個activity。
注意: 在大多數的情況下,不應該使用這些方法來顯式地關閉一個activity。 正如以下關于activity生命周期的部分所述,Android系統會替你管理activity的生命周期,所以你不需要關閉你的activity。 調用這些方法可能會對預期的用戶體驗產生不利的影響,僅當你確實不想讓用戶再返回到這個activity的實例時才會用到它們。
<h4 id=“8”>8.管理activity的生命周期</h4>
通過實現回調方法來管理你的activity的生命周期,對于開發一個健壯而又靈活的應用程序而言是至關重要的。 與其它activity的關聯性、自身的任務和back stack直接影響著一個activity的生命周期。

activity可能處于三種基本的狀態:

Resumed
activity在屏幕的前臺并且擁有用戶的焦點。(這個狀態有時也被叫做“running”。)
Paused
另一個activity在前臺并擁有焦點,但是本activity還是可見的。 也就是說,另外一個activity覆蓋在本activity的上面,并且那個activity是部分透明的或沒有覆蓋整個屏幕。 一個paused的activity是完全存活的(Activity 對象仍然保留在內存里,它保持著所有的狀態和成員信息,并且保持與window manager的聯接),但在系統內存嚴重不足的情況下它能被殺死。
Stopped
本activity被其它的activity完全遮擋住了(本activity目前在后臺)。 一個stopped的activity也仍然是存活的(Activity 對象仍然保留在內存中,它保持著所有的狀態和成員信息,但是不再與window manager聯接了)。 但是,對于用戶而言它已經不再可見了,并且當其它地方需要內存時它將會被殺死。
如果activity被paused或stopped了,則系統可以從內存中刪除它,通過請求finish(調用它的 finish() 方法)或者直接殺死它的進程。 當這個activity被再次啟動時(在被finish或者kill后),它必須被完全重建。
<h4 id=“9”>9.實現生命周期回調方法</h4>
當一個activity在上述描述的狀態之間轉換時,它將通過各種回調方法來獲得通知。 所有的回調方法都是鉤子(hook),當activity狀態發生改變時你都可以 重寫這些方法來執行對應的工作。 以下的activity提綱包含了所有基本的生命周期方法:

public class ExampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // The activity is being created.
    }
    @Override
    protected void onStart() {
        super.onStart();
        // The activity is about to become visible.
    }
    @Override
    protected void onResume() {
        super.onResume();
        // The activity has become visible (it is now "resumed").
    }
    @Override
    protected void onPause() {
        super.onPause();
        // Another activity is taking focus (this activity is about to be "paused").
    }
    @Override
    protected void onStop() {
        super.onStop();
        // The activity is no longer visible (it is now "stopped")
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // The activity is about to be destroyed.
    }
}

注意:實現這些生命周期方法時,必須保證在其它代碼之前首先調用一下父類的方法,如上例所示。
總體來講,這些方法定義了一個activity的完整的生命周期。 通過實現這些方法,你可以監控activity生命周期中三個嵌套的循環:

activity的完整生存期會在 onCreate() 調用和 onDestroy() 調用之間發生。 你的activity應該在 onCreate() 方法里完成所有“全局global”狀態的設置(比如定義layout), 而在onDestroy() 方法里釋放所有占用的資源。 例如,如果你的activity有一個后臺運行的線程,用于從網絡下載數據,那么你應該在 onCreate() 方法里創建這個線程并且在 onDestroy() 方法里停止這個線程。
activity的可見生存期會在 onStart() 調用和 onStop() 調用之間發生。在這期間,用戶可在屏幕上看見這個activity并可與之交互。 例如,當一個新的activity啟動后調用了 onStop() 方法,則這個activity就無法被看見了。 在這兩個方法之間,你可以管理那些顯示activity所需的資源。例如,你可以在 onStart() 方法里注冊一個 BroadcastReceiver 用于監控影響用戶界面的改動。并且當用戶不再看到你的顯示內容時,在 onStop() 方法里注銷掉它。 系統會在activity的整個生存期內多次調用 onStart() 和onStop(), 因為activity可能會在顯示和隱藏之間不斷地來回切換。
activity的前臺生存期會在 onResume() 調用和 onPause() 之間發生。在這期間,activity是位于屏幕上所有其它的activity之前,并且擁有用戶的輸入焦點。 activity可以頻繁地進入和退出前臺——例如, 當設備進入休眠時或者彈出一個對話框時, onPause() 就會被調用。因為這個狀態可能會經常發生轉換,為了避免切換遲緩引起的用戶等待,這兩個方法中的代碼應該相當地輕量化。
圖1說明了activity在狀態之間可能行走的這些循環和路徑。矩形代表了你可以實現的回調方法,用于activity狀態轉換時執行相應操作。


activity_lifecycle.png

圖上為activity生命周期
同樣的生命周期回調方法已經在表中列出了,該表更詳細地描述了每個回調方法,并且指明了每個方法在activity的全生命周期中的位置, 包括回調方法完成后系統是否會殺死這個activity。
activity生命周期回調方法匯總


activity方法解析.png

activity方法解析2.png

標為“之后可否被殺死?”的列指明了系統是否可以在這個方法返回之后的任意時刻殺掉這個activity的宿主進程, 而不再執行其它流程上的activity代碼。 有三個方法是標為“可以”:( onPause()、 onStop()、 和onDestroy())。 因為onPause()是三個方法中的第一個, 一旦activity被創建, onPause() 就是進程可以被殺死之前最后一個能確保被調用的方法 ——如果系統在某種緊急情況下必須回收內存,則 onStop() 和onDestroy() 可能就不會被調用了。因此,你應該使用 onPause() 來把至關重要的需長期保存的數據寫入存儲器(比如用戶所編輯的內容)。 不過,應該對必須通過 onPause() 方法進行保存的信息有所選擇,因為該方法中所有的阻塞操作都會讓切換到下一個activity的停滯,并使用戶感覺到遲緩。

“之后可否被殺死?”列中標為“否”的方法,在它們被調用時的那一刻起,就會保護本activity的宿主進程不被殺掉。 因此,只有在 onPause() 方法返回時至 onResume() 方法被調用時之間,activity才會被殺掉。直到 onPause() 再次被調用并返回時,activity都不會再次允許被殺死。

Note:表1中標明的技術上不“可殺”的activity仍然有可能會被系統殺死——但那只有在沒有任何資源的極端情況下才會發生。 什么時候activity會被殺掉,已在文檔進程和線程里詳細說明了。
<h4 id=“10”>10.保存activity的狀態</h4>
[管理Activity生命周期]一節中已簡單提到,當一個activity被paused或者stopped時,activity的狀態可以被保存。 的確如此,因為 Activity 對象在paused或者stopped時仍然被保留在內存之中——它所有的成員信息和當前狀態都仍然存活。 這樣用戶在activity里所作的改動全都還保存著,所以當activity返回到前臺時(當它“resume“),那些改動仍然有效。
不過,如果系統是為了回收內存而銷毀activity,則這個 Activity 對象就會被銷毀,這樣系統就無法簡單地resume一下就能還原完整狀態的activity。 如果用戶要返回到這個activity的話,系統必須重新創建這個Activity 對象。可是用戶并不知道系統是先銷毀activity再重新創建了它的,所以,他很可能希望activity完全保持原樣。 這種情況下,你可以保證activity狀態的相關重要信息都由另一個回調方法保存下來了,此方法讓你能保存activity狀態的相關信息: onSaveInstanceState()。
在activity變得很容易被銷毀之前,系統會調用 onSaveInstanceState()方法。 調用時系統會傳入一個Bundle對象, 你可以利用 putString() 之類的方法,以鍵值對的方式來把activity狀態信息保存到該Bundle對象中。 然后,如果系統殺掉了你的application進程并且用戶又返回到你的activity,系統就會重建activity并將這個 Bundle 傳入onCreate() 和onRestoreInstanceState() 中,你就可以從 Bundle 中解析出已保存信息并恢復activity狀態。如果沒有儲存狀態信息,那么傳入的 Bundle 將為null(當activity第一次被創建時就是如此)。


restore_instance.png

圖 2. activity狀態完整地返回給用戶的兩種方式:被銷毀destroyed后再被重建,而且必須恢復了之前保存的狀態;或是被停止stopped后再被恢復resumed,狀態都完整保留著。

注意: activity被銷毀之前,并不能確保每次都會調用 onSaveInstanceState() ,因為存在那些不必保存狀態的情況(比如用戶使用BACK鍵離開了你的activity,因為用戶明顯是關了這個activity)。 如果系統要調用 onSaveInstanceState() 方法,那么它通常會在 onStop() 方法之前并且可能是在 onPause() 之前調用。

不過,即使你沒有實現 onSaveInstanceState() 方法,有些activity狀態還是會通過 Activity 類缺省實現的onSaveInstanceState() 方法保存下來。特別的是,缺省為layout中的每個 View 實現了調用相應的onSaveInstanceState() 方法,這允許每一個view提供自己需被保存的信息。 幾乎Android框架下所有的widget都會在適當的時候實現該方法,這樣,任何UI上可見的變化都會自動保存下來,并在activity重建后自動恢復。 例如,EditText widget會保存所有用戶已經輸入的文本, CheckBoxwidget 也會保存是否被選中。你所要做的工作僅僅是為每一個你想要保存其狀態的widget提供一個唯一的ID(就是 android:id 屬性)。如果這個widget沒有ID的話,系統是無法保存它們的狀態的。

通過把android:saveEnabled 設置為"false",或者調用 setSaveEnabled() 方法,你也可以顯式地阻止layout中的某個view保存狀態。 通常不應該禁用保存,不過假如你需要恢復activity UI的各個不同的狀態,也許可以這么做。

盡管缺省實現的 onSaveInstanceState() 方法會保存activity UI的有用信息,你仍然需要覆蓋它來存入更多的信息。 例如,你可能需要保存在activity生命周期中改變的成員變量值(可能是關于UI恢復的值,但是默認情況下,存放這些UI狀態的成員變量值是不會被恢復的)。

因為默認實現的 onSaveInstanceState() 方法已經幫你保存了一些UI的狀態,所以如果你重寫此方法是為了保存更多的狀態信息,那么在執行自己的代碼之前應該確保先調用一次父類的 onSaveInstanceState() 方法。同理,如果重寫 onRestoreInstanceState() 的話,也應該調用一次父類的該方法,這樣缺省的代碼就能正常恢復view的狀態了。

注意:因為 onSaveInstanceState() 并不保證每次都會被調用,所以你應該只用它來記錄activity的一些臨時狀態信息(UI的狀態)——千萬不要用它來保存那些需要長久保存的數據。 替代方案是,你應該在用戶離開activity的時候利用 onPause() 來保存永久性數據(比如那些需要存入數據庫里的數據)。

一個檢測應用程序狀態恢復能力的好方法就是旋轉設備,使得屏幕方向發生改變。 當屏幕的方向改變時,因為要換用符合實際屏幕參數的資源,系統會銷毀并重建這個activity。 正因如此,你的activity能夠在被重建時完整地恢復狀態是非常重要的,因為用戶會在使用應用程序時會頻繁地旋轉屏幕。
<h4 id=“11”>11.多Activity的合作</h4>
當activity啟動另一個activity時,它倆生命周期的狀態都會發生轉換。 第一個activity paused并stopped(盡管它也可能不會被stopped,如果它仍然后臺可見的話),而另一個activity是被created。 如果這兩個activity共用了保存在磁盤或其它地方的數據,那么請明白:在第二個activity被created之前,第一個activity還沒有完全被stopped,這點非常重要。 或多或少,第二個activity的啟動進程與第一個activity的關閉進程在時間上會發生重疊。
生命周期回調方法的順序是很明確的,特別是兩個activity位于同一個進程中、一個啟動另一個的時候。 下面就是Aactivity A啟動Activity B時的操作順序:
Activity A的 onPause()方法,如果活動后臺不可見的話,onStop()方法同樣運行,否則不運行。
Activity B的 onCreate() ,onStart() 和onResume() 方法依次運行。(Activity B現在獲得用戶焦點。)
以上預設的生命周期回調方法順序使你能夠對一個activity啟動另一個activity時的轉換信息進行管理。 例如,如果第一個activity停止時你須寫入數據庫以便后續的activity可以讀取數據,那么你應該在 onPause() 方法而不是 onStop() 方法里寫入數據庫。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容

  • Activity https://developer.android.com/guide/components/a...
    XLsn0w閱讀 714評論 0 4
  • Activity是一個應用組件,用戶可與其提供的屏幕進行交互。以執行撥打電話,拍攝照片,發送電子郵件或查看地圖等操...
    DanieX閱讀 1,110評論 0 4
  • Activity 是一個應用組件,用戶可與其提供的屏幕進行交互,以執行撥打電話、拍攝照片、發送電子郵件或查看地圖等...
    岳小川閱讀 492評論 0 3
  • /** Java方法的使用 @author bo */ public class JavaMet { }publi...
    133sheiya閱讀 467評論 0 0
  • “醫院的墻壁聆聽了比教堂更多的祈禱,機場的大廳見證了比婚禮上更真誠的親吻。” 我在一家國內著名的傳媒公司做節目總監...
    我愛喝酸奶吖閱讀 349評論 0 0