Android 四大組件(一)Activity

之前一直是在CSDN上寫的blog漓藕,感覺csdn經(jīng)常會出現(xiàn)一下bug,所以就開始向簡書上轉(zhuǎn)移。
之前csdn的博客地址
Android四大組件:Activity敌完、Service服務(wù)、Content Provider內(nèi)容提供者羊初、BroadcastReceiver廣播接收器滨溉。Activity翻譯為“活動”什湘,在android應(yīng)用中,一個Activity通常就是一個單獨的屏幕晦攒,用來與用戶進行交互闽撤。它是Android應(yīng)用中最常見、最常用的組件脯颜。


1 建立和配置Activity

建立自己的Activity需要繼承Activity類哟旗,也可以根據(jù)情況繼承Activity的子類。如下:FirstActivity.java

package com.vn.hello;  
  
import android.app.Activity;  
import android.os.Bundle;  
  
public class FirstActivity extends Activity{  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
    }  
}

除此之外還需要布局文件activity_main.xml文件用來顯示Activity界面栋操,其代碼如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:paddingBottom="@dimen/activity_vertical_margin"  
    android:paddingLeft="@dimen/activity_horizontal_margin"  
    android:paddingRight="@dimen/activity_horizontal_margin"  
    android:paddingTop="@dimen/activity_vertical_margin"  
    tools:context="com.vn.hello.FirstActivity" >  
    <Button  
        android:id="@+id/button1"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerHorizontal="true"  
        android:layout_centerVertical="true"  
        android:text="@string/first" />  
</RelativeLayout>  

布局文件可以通過修改RelativeLayout來調(diào)整頁面布局方式闸餐。可以再上述文件中間添加所需控件如:button矾芙、textview绎巨、editview等。
還有就是需要在清單文件AndroidManifest.xml文件里配置需要顯示的Activity蠕啄。

<activity  
    android:name=".FirstActivity"  
    android:label="@string/app_name" >  
    <intent-filter>  
        <action android:name="android.intent.action.MAIN" />  
  
        <category android:name="android.intent.category.LAUNCHER" />  
    </intent-filter>  
</activity>

將此元素添加到<application> </application>中間场勤。上面代碼中的
name表示該Activity的實現(xiàn)類;
label表示該Activity的標簽歼跟。
<intent-filter....../>可以有一個或多個和媳,用于指定該Activity可以響應(yīng)的Intent。配置完這些運行安裝到手機就可以顯示出這個Activity了哈街。


2 Activity的生命周期

先看一下Activity的生命周期圖:

20151015142603481.jpeg

這個是Activity的流程留瞳,

  1. 啟動Activity:系統(tǒng)會先調(diào)用onCreate方法,然后調(diào)用onStart方法骚秦,然后調(diào)用onResume她倘,Activity進入運行狀態(tài)。
  2. 用戶銷毀當前Activity:系統(tǒng)先調(diào)用onPause方法作箍,然后調(diào)用onStop方法硬梁,最后調(diào)用onDestory方法,結(jié)束當前Activity胞得。
  3. 當前Activity由被覆蓋狀態(tài)回到前臺或解鎖屏或?qū)υ捒蛳В合到y(tǒng)會調(diào)用onResume方法荧止,再次進入運行狀態(tài)。
  4. 當前Activity轉(zhuǎn)到新的Activity界面或按Home鍵回到主屏阶剑,自身退居后臺:系統(tǒng)會先調(diào)用onPause方法跃巡,然后調(diào)用onStop方法,進入停滯狀態(tài)牧愁,此時不可見素邪。
  5. 用戶后退回到此Activity:系統(tǒng)會先調(diào)用onRestart方法,然后調(diào)用onStart方法猪半,最后調(diào)用onResume方法兔朦,再次進入運行狀態(tài)猿涨。
  6. 當前Activity處于被覆蓋狀態(tài)或者后臺不可見狀態(tài)匀泊,即第2步和第4步废酷,系統(tǒng)內(nèi)存不足遂黍,殺死當前Activity俐填,而后用戶退回當前Activity:再次調(diào)用onCreate方法安接、onStart方法、onResume方法英融,進入運行狀態(tài)盏檐。
  7. 當前Activity被其他Activity覆蓋其上或被鎖屏或被對話框覆蓋:系統(tǒng)會調(diào)用onPause方法,暫停當前Activity的執(zhí)行驶悟。

3 Activity跳轉(zhuǎn)

看一下這個例子兩個Activity的跳轉(zhuǎn):
FirstActivity.java

package com.vn.test;  
  
import android.app.Activity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.widget.Button;  
  
public class FirstActivity extends Activity {  
    private String TAG = "FirstActivity";  
    private Button mButton;  
  
    //Activity創(chuàng)建時調(diào)用  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_first);  
        Log.i(TAG, "First--onCreate");  
        mButton=(Button) findViewById(R.id.button1);  
        mButton.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                startActivity(new Intent(FirstActivity.this,SecondActivity.class));  
            }  
        });  
    }  
    //Activity創(chuàng)建胡野、從后臺重新回到前臺時被調(diào)用  
    @Override  
    protected void onStart() {  
        super.onStart();  
        Log.i(TAG ,"First--onStart");  
    }  
    //Activity從后臺回到前臺  
    @Override  
    protected void onRestart() {  
        super.onRestart();  
        Log.i(TAG ,"First--onRestart");  
    }  
    //Activity從創(chuàng)建、被覆蓋到顯示痕鳍、從后臺回到前臺  
    @Override  
    protected void onResume() {  
        super.onResume();  
        Log.i(TAG ,"First--onResume");  
    }  
    //獲取或失去焦點  
    @Override  
    public void onWindowFocusChanged(boolean hasFocus) {  
        super.onWindowFocusChanged(hasFocus);  
        Log.i(TAG ,"First--onWindowFocusChanged "+hasFocus);  
    }  
  
    @Override  
    protected void onPause() {  
        super.onPause();  
        Log.i(TAG ,"First--onPause");  
    }  
  
    @Override  
    protected void onStop() {  
        super.onStop();  
        Log.i(TAG ,"First--onStop");  
    }  
  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        Log.i(TAG ,"First--onDestroy");  
    }  
  
    @Override  
    protected void onSaveInstanceState(Bundle outState) {  
        super.onSaveInstanceState(outState);  
    }  
  
    @Override  
    protected void onRestoreInstanceState(Bundle savedInstanceState) {  
        super.onRestoreInstanceState(savedInstanceState);  
    }  
}

第二個Activity SecondActivity.java

package com.vn.test;  
  
import android.app.Activity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
  
public class SecondActivity extends Activity {  
    private String TAG = "SecondActivity";  
    private Button jump;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.second);  
        Log.i(TAG ,"Second--onCreate");  
        jump=(Button) findViewById(R.id.button1);  
        jump.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                startActivity(new Intent(SecondActivity.this,FirstActivity.class));  
            }  
        });  
    }  
    @Override  
    protected void onStart() {  
        super.onStart();  
        Log.i(TAG ,"Second-onStart");  
    }  
    //Activity從后臺回到前臺  
    @Override  
    protected void onRestart() {  
        super.onRestart();  
        Log.i(TAG ,"Second--onRestart");  
    }  
    @Override  
    protected void onResume() {  
        super.onResume();  
        Log.i(TAG ,"Second--onResume");  
    }  
    @Override  
    public void onWindowFocusChanged(boolean hasFocus) {  
        super.onWindowFocusChanged(hasFocus);  
        Log.i(TAG ,"Second--onWindowFocusChanged "+hasFocus);  
    }  
    @Override  
    protected void onPause() {  
        super.onPause();  
        Log.i(TAG ,"Second--onPause");  
    }  
    @Override  
    protected void onStop() {  
        super.onStop();  
        Log.i(TAG ,"Second--onStop");  
    }  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        Log.i(TAG ,"Second--onDestroy");  
    }  
}

當應(yīng)用程序開啟時輸出log:

First--onCreate  
First--onStart  
First--onResume  
First--onWindowFocusChanged true

當點擊FirstActivity的按鈕會跳轉(zhuǎn)到SecondActivity硫豆,調(diào)用方法順序(可能會因為Andorid版本的改動而有所變動):

First--onPause  
Second--onCreate  
Second-onStart  
Second--onResume  
First--onWindowFocusChanged false  
Second--onWindowFocusChanged true  
First--onStop

onWindowFocusChanged方法在Activity窗口獲得或失去焦點時被調(diào)用。不一定在第二個界面顯示出來才調(diào)用笼呆,我試了兩個手機熊响,結(jié)果不一樣。版本低的是上述的情況诗赌,另一個版本較高的手機順序是:

First--onPause  
First--onWindowFocusChanged false  
Second--onCreate  
Second--onStart  
Second--onResume  
Second--onWindowFocusChanged true  
First--onStop 

從新回到FirstActivity汗茄,調(diào)用方法順序:

Second--onPause  
Second--onWindowFocusChanged false  
First--onRestart  
First--onStart  
First--onResume  
First--onWindowFocusChanged true  
Second--onStop

當鎖屏或屏幕休眠時,依次調(diào)用方法:

First--onPause  
First--onStop

重新解鎖:

First--onRestart  
First--onStart  
First--onResume

并沒有調(diào)用onWindowFocusChanged方法铭若。

而當按home鍵時洪碳,回到手機主頁面,依次調(diào)用方法如下叼屠,屏幕失去焦點瞳腌。

First--onPause  
First--onWindowFocusChanged false  
First--onStop

重新進入程序打開FirstActivity,獲取焦點镜雨。調(diào)用方法:

First--onRestart  
First--onStart  
First--onResume  
First--onWindowFocusChanged true

當?shù)谝粋€界面彈出一個對話框(沒有全部覆蓋FirstActivity)纯趋,或者SecondActivity是對話框形式的。方法如下:

First--onPause  
First--onWindowFocusChanged false  
Second--onCreate  
Second-onStart  
Second--onResume  
Second--onWindowFocusChanged true  
//第一個界面并沒有調(diào)用onStop方法冷离。只有全部覆蓋才會調(diào)用onStop方法吵冒。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市西剥,隨后出現(xiàn)的幾起案子痹栖,更是在濱河造成了極大的恐慌,老刑警劉巖瞭空,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揪阿,死亡現(xiàn)場離奇詭異疗我,居然都是意外死亡,警方通過查閱死者的電腦和手機南捂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門吴裤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人溺健,你說我怎么就攤上這事麦牺。” “怎么了鞭缭?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵剖膳,是天一觀的道長。 經(jīng)常有香客問我岭辣,道長吱晒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任沦童,我火速辦了婚禮仑濒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偷遗。我一直安慰自己躏精,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布鹦肿。 她就那樣靜靜地躺著矗烛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箩溃。 梳的紋絲不亂的頭發(fā)上瞭吃,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音涣旨,去河邊找鬼歪架。 笑死,一個胖子當著我的面吹牛霹陡,可吹牛的內(nèi)容都是我干的和蚪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼烹棉,長吁一口氣:“原來是場噩夢啊……” “哼攒霹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浆洗,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤催束,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伏社,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抠刺,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡塔淤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了速妖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片高蜂。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖罕容,靈堂內(nèi)的尸體忽然破棺而出备恤,到底是詐尸還是另有隱情,我是刑警寧澤杀赢,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布烘跺,位于F島的核電站湘纵,受9級特大地震影響脂崔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梧喷,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一砌左、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铺敌,春花似錦汇歹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弯囊,卻和暖如春痰哨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匾嘱。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工斤斧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霎烙。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓撬讽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悬垃。 傳聞我的和親對象是個殘疾皇子游昼,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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