Activity 詳解

activity是Android四大組件之一,其中所有的操作都與用戶密切相關(guān)烛卧,是一個負(fù)責(zé)與用戶交互的組件佛纫,可以通過 setContentView(View) 來顯示組件。

Activity整個生命周期的4種狀態(tài)总放、7個重要方法

官方文檔

activity_lifecycle

4種基本狀態(tài)

  1. 活動(Active/Running)狀態(tài)

當(dāng)Activity運行在屏幕前臺(處于當(dāng)前任務(wù)活動棧的最上面),此時它獲取了焦點能響應(yīng)用戶的操作,屬于運行狀態(tài)呈宇,同一個時刻只會有一個Activity 處于活動(Active)或運行

  1. 暫停(Paused)狀態(tài)

當(dāng)Activity失去焦點但仍對用戶可見(如在它之上有另一個透明的Activity或Toast、AlertDialog等彈出窗口時)它處于暫停狀態(tài)局雄。暫停的Activity仍然是存活狀態(tài)(它保留著所有的狀態(tài)和成員信息并保持和窗口管理器的連接),但是當(dāng)系統(tǒng)內(nèi)存極小時可以被系統(tǒng)殺掉

  1. 停止(Stopped)狀態(tài)

如果一個Activity被另外的Activity完全覆蓋掉甥啄,叫做停止?fàn)顟B(tài)(Stopped)。它依然保持所有狀態(tài)和成員信息炬搭,但是它不再可見蜈漓,所以它的窗口被隱藏,當(dāng)系統(tǒng)內(nèi)存需要被用在其他地方的時候尚蝌,Stopped的Activity將被強行終止掉迎变。

  1. 非活動(Dead)狀態(tài)

如果一個Activity是Paused或者Stopped狀態(tài),系統(tǒng)可以將該Activity從內(nèi)存中刪除飘言,Android系統(tǒng)采用兩種方式進行刪除,要么要求該Activity結(jié)束驼侠,要么直接終止它的進程姿鸿。當(dāng)該Activity再次顯示給用戶時谆吴,它必須重新開始和重置前面的狀態(tài)。

7個重要方法(建議看上圖)

  1. onCreate(Bundle savedInstanceState);

通常用于初始化(碎片和加載器)設(shè)置:

  • 使用setContentView加載布局
  • 初始化控件和變量等
  • 連接數(shù)據(jù)庫并將數(shù)據(jù)綁定到list列表中

注1:Activity還在后臺苛预,不可見(啟動動畫那些的還是不要來了吧)
注2:這個方法會傳遞一個保存了此Activity上一狀態(tài)信息的Bundle對象句狼。緊隨其后的方法總是onStart().

  1. onStart();

在此Activity可見(顯示在前臺)之前調(diào)用。
如果接著是顯示在前臺热某,緊隨其后的方法是onResume()腻菇;如果接下來此Activity被隱藏了,則緊隨其后的方法是onStop()昔馋。

  1. onRestart()

處于停止態(tài)的Activity調(diào)用此方法筹吐,可以讓此Activity重新顯示在前臺。
緊隨其后的方法總是onStart()

  1. onResume

Activity在這個階段已經(jīng)出現(xiàn)在前臺并且可見了秘遏,可打開獨占設(shè)備(相機等)此時該Activity位于Activity棧的頂部丘薛,在等待用戶的操作(輸入數(shù)據(jù)或點擊按鈕等)。緊隨其后的方法是onPause().

  1. onPause

當(dāng)啟動其他activity時調(diào)用此方法邦危。在這個方法體里洋侨,通常用于提交未保存的數(shù)據(jù)、停止動畫/視頻和處理其他占用CPU資源的程序倦蚪,等等希坚。同時在這個方法體里處理的都是一些迅速快捷的操作,因為下一個activity會在onPause()方法執(zhí)行完之后才可以在前臺顯示陵且。
如果此Activity重新回到前臺顯示吏够,則緊隨其后的方法是onResume();如果此Activity變得不可見了滩报,則緊隨其后的方法是onStop()

  1. onStop()

當(dāng)Activity不可見時調(diào)用此方法锅知。這個方法的調(diào)用時刻是在Activity需要銷毀或者被其他otherActivity取代且覆蓋此Activity在前臺顯示時調(diào)用。
如果此Activity重新顯示在前臺脓钾,緊隨其后的方法是onRestart()售睹;如果此Activity需要被銷毀,緊隨其后的方法是onDestroy()

  1. onDestroy

Activity被銷毀時調(diào)用此方法可训。這是Activity生命周期里最后調(diào)用的一個方法昌妹。這個方法的調(diào)用可以發(fā)生在activity調(diào)用了finish()方法之后,或者是系統(tǒng)為了節(jié)省空間而銷毀了此Activity的實例握截。你可以使用isFinishing()方法來區(qū)分這兩種情況

創(chuàng)建一個Activity

編寫一個繼承 AppCompatActivity 的 Java 類并在 AndroidManifest.xml 聲明即可飞崖。

  1. 編寫 java 類
public class MainActivity extends AppCompatActivity { 
    private static final String LOG_TAG = MainActivity.class.getSimpleName(); 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);      
        setContentView(R.layout.main); 
        Log.e(LOG_TAG, "onCreate"); 
    } 
   @Override 
    protected void onStart() { 
        Log.e(LOG_TAG, "onStart"); 
        super.onStart(); 
    } 
    @Override 
    protected void onResume() { 
        Log.e(LOG_TAG, "onResume"); 
        super.onResume(); 
    } 
    @Override 
    protected void onPause() { 
        Log.e(LOG_TAG, "onPause"); 
        super.onPause(); 
    } 
    @Override 
    protected void onStop() { 
        Log.e(LOG_TAG, "onStop"); 
        super.onStop(); 
    } 
    @Override 
    protected void onDestroy() { 
        Log.e(LOG_TAG, "onDestroy "); 
        super.onDestroy(); 
    } 
 }
  1. 在 AndroidManifest.xml 聲明
<activity android:name=".MainActivity" android:label="@string/app_name"> 
     <intent-filter> 
         <action android:name="android.intent.action.MAIN" /> 
         <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
 </activity>

在一個Activity啟動另一個Activity

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

注: 兩個 Activity 都需要在 清單文件中配置

startActivityForResult

頁面跳轉(zhuǎn)之后,需要返回到之前的頁面谨胞,同時要保留用戶之前輸入的信息.

步驟:

  1. 從A頁面跳轉(zhuǎn)到B頁面時固歪,我們就不使用"startActivity()"方法了,使用"startActivityForResult"方法。
  2. 在A頁面的Activity中牢裳,需要重寫"onActivityResult"方法

方法詳解:

onActivityResult(int requestCode, int resultCode, Intent data)

第一個參數(shù): 用于標(biāo)識請求來源逢防。
比如說: 一個Activity有兩個按鈕,點擊這兩個按鈕都會打開同一個Activity
我想要知道新Activity是由那個按鈕打開的蒲讯⊥可以通過 requestCode 識別。

第二個參數(shù):返回的數(shù)據(jù)來自于哪個新Activity

第三個參數(shù):一個Intent對象判帮,帶有返回的數(shù)據(jù)局嘁。

Activity 之間通信

使用 Intent 通信

Android 中通過 Intent 對象來表示一條消息,一個 Intent 對象不僅包含有這個消息的目的地晦墙,還可以包含消息的內(nèi)容悦昵,這好比一封 Email,其中不僅應(yīng)該包含收件地址偎痛,還可以包含具體的內(nèi)容旱捧。對于一個 Intent 對象,消息“目的地”是必須的踩麦,而內(nèi)容則是可選項枚赡。

  1. 發(fā)送信息,如果我們想要給“收件人”Activity 說點什么的話谓谦,那么可以通過下面這封“e-mail”來將我們消息傳遞出去:
Intent intent =new Intent(CurrentActivity.this,OtherActivity.class);
  // 創(chuàng)建一個帶“收件人地址”的 email 
 Bundle bundle =new Bundle();// 創(chuàng)建 email 內(nèi)容
 bundle.putBoolean("boolean_key", true);// 編寫內(nèi)容
 bundle.putString("string_key", "string_value"); 
 intent.putExtra("key", bundle);// 封裝 email 
 startActivity(intent);// 啟動新的 Activity
  1. 接受信息贫橙,在 OtherActivity類的 onCreate()或者其它任何地方使用下面的代碼就可以打開這封“e-mail”閱讀其中的信息:
Intent intent =getIntent();// 收取 email 
 Bundle bundle =intent.getBundleExtra("key");// 打開 email 
 bundle.getBoolean("boolean_key");// 讀取內(nèi)容
 bundle.getString("string_key");

上面我們通過 bundle對象來傳遞信息,bundle維護了一個 HashMap< String, Object>對象反粥,將我們的數(shù)據(jù)存貯在這個 HashMap 中來進行傳遞卢肃。但是像上面這樣的代碼稍顯復(fù)雜,因為 Intent 內(nèi)部為我們準(zhǔn)備好了一個 bundle才顿,所以我們也可以使用這種更為簡便的方法:

Intent intent =new Intent(EX06.this,OtherActivity.class); 
intent.putExtra("boolean_key", true); 
intent.putExtra("string_key", "string_value"); 
startActivity(intent);

接收信息:

Intent intent=getIntent(); 
intent.getBooleanExtra("boolean_key",false); 
intent.getStringExtra("string_key");

使用 SharedPreferences

SharedPreferences 使用 xml 格式為 Android 應(yīng)用提供一種永久的數(shù)據(jù)存貯方式莫湘。對于一個 Android 應(yīng)用,它存貯在文件系統(tǒng)的 /data/ data/your_app_package_name/shared_prefs/目錄下郑气,可以被處在同一個應(yīng)用中的所有 Activity 訪問

// 寫入 SharedPreferences 
 SharedPreferences preferences = getSharedPreferences("name", MODE_PRIVATE); 
 Editor editor = preferences.edit(); 
 editor.putBoolean("boolean_key", true); 
 editor.putString("string_key", "string_value"); 
 editor.commit(); 
        
 // 讀取 SharedPreferences 
 SharedPreferences preferences = getSharedPreferences("name", MODE_PRIVATE); 
 preferences.getBoolean("boolean_key", false); 
 preferences.getString("string_key", "default_value");

其它方式

  • SQLite
  • 文件
  • IPC方式

一些關(guān)于 Activity 的技巧

鎖定 Activity 運行時的屏幕方向

有時我們的應(yīng)用程序僅能在橫屏 / 豎屏?xí)r運行幅垮,比如某些游戲,此時我們需要鎖定該 Activity 運行時的屏幕方向

< activity > 節(jié)點的 android:screenOrientation 屬性 就是控制屏幕方向的尾组。

 <activity android:name=".MainActivity"
 android:label="@string/app_name" 
 android:screenOrientation="portrait">// 豎屏 , 值為 landscape 時為橫屏
…………
 </activity>

全屏

// 設(shè)置全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
WindowManager.LayoutParams.FLAG_FULLSCREEN); 
// 去除標(biāo)題欄
requestWindowFeature(Window.FEATURE_NO_TITLE);
參考:
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忙芒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子讳侨,更是在濱河造成了極大的恐慌呵萨,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跨跨,死亡現(xiàn)場離奇詭異潮峦,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門跑杭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铆帽,“玉大人咆耿,你說我怎么就攤上這事德谅。” “怎么了萨螺?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵窄做,是天一觀的道長。 經(jīng)常有香客問我慰技,道長椭盏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任吻商,我火速辦了婚禮掏颊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘艾帐。我一直安慰自己乌叶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布柒爸。 她就那樣靜靜地躺著准浴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捎稚。 梳的紋絲不亂的頭發(fā)上乐横,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音今野,去河邊找鬼葡公。 笑死,一個胖子當(dāng)著我的面吹牛条霜,可吹牛的內(nèi)容都是我干的催什。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蛔外,長吁一口氣:“原來是場噩夢啊……” “哼蛆楞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夹厌,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤豹爹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矛纹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臂聋,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了孩等。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艾君。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肄方,靈堂內(nèi)的尸體忽然破棺而出冰垄,到底是詐尸還是另有隱情,我是刑警寧澤权她,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布虹茶,位于F島的核電站,受9級特大地震影響隅要,放射性物質(zhì)發(fā)生泄漏蝴罪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一步清、第九天 我趴在偏房一處隱蔽的房頂上張望要门。 院中可真熱鬧,春花似錦廓啊、人聲如沸欢搜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狂巢。三九已至,卻和暖如春书聚,著一層夾襖步出監(jiān)牢的瞬間唧领,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工雌续, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斩个,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓驯杜,卻偏偏與公主長得像受啥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸽心,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

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