Activity基礎(chǔ)

Activity(活動(dòng))是一種可以包含用戶界面的組件状飞。主要用來與用戶交互留拾。每個(gè)應(yīng)用程序中可以包含零個(gè)或者多個(gè)活動(dòng)迟赃。在Manifest文件中需要聲明
image.png

android:name=".MainActivity"指明獲得的名字

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

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

這兩行指明活動(dòng)為Main活動(dòng)骑脱,當(dāng)應(yīng)用程序運(yùn)行后會(huì)加載這個(gè)活動(dòng)。應(yīng)用程序不聲明任何活動(dòng)為主活動(dòng)也可以運(yùn)行称鳞,這種情況常作為第三方服務(wù)供其他應(yīng)用程序調(diào)用涮较。

1 Activity的聲明周期:

android使用棧來管理Activity,當(dāng)使用Intent打開一個(gè)新的Activity時(shí)候就會(huì)入棧冈止,銷毀活動(dòng)就會(huì)出棧狂票。棧頂?shù)腁ctivity就是顯示在最外面與用戶交互的那個(gè)Activity。


image.png

使用Intent來啟動(dòng)一個(gè)新的活動(dòng)NewActivity

//無返回值 
Intent intent =new Intent(context,NewActivity.class);     
startActivity(intent); 


//無返回值熙暴,并且攜帶數(shù)據(jù)
  Intent intent =new Intent(context,NewActivity.class);
  //使用intent傳遞數(shù)據(jù)
  intent.putExtra("key","value");
  將數(shù)據(jù)打包進(jìn)Bundle中通過intent傳遞
  Bundle bundle=new Bundle();
  bundle.putString("bundleKey","bundleValue");
  bundle.putFloat("bundleKey2",1.534f);
  intent.putExtras(bundle);
  startActivity(intent);


// 有返回值
Intent intent =new Intent(context,NewActivity.class);     
startActivityForResult(intent,1);//1是請(qǐng)求嗎
.
.
.

//這里是NewActivity中執(zhí)行代碼闺属,將要返回的數(shù)據(jù)加入到intent中
Intent intent =new Intent();
intent.putExtra("key","value");
setResult(RESULT_OK,intent);


//這里是OldActivity慌盯,通過重寫onActivityResult()方法處理返回?cái)y帶的數(shù)據(jù),通過請(qǐng)求嗎requestCode 和 結(jié)果嗎 resultCode來確定 從哪個(gè)activity啟動(dòng)的新activity屋剑,以及從哪個(gè)activity返回的數(shù)據(jù)润匙。
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode)
        {
            case 1:
                if(resultCode==RESULT_OK)
                {
                    //這里處理data攜帶的數(shù)據(jù)

                }
        }
    }
 

這里注意intent傳遞數(shù)據(jù)是有大小限制的,一般來說是1M左右唉匾。

1.Activity的entire lifetime(全部的生命期)發(fā)生在調(diào)用onCreate()和調(diào)用onDestory()之間孕讳。在onCreate()方法中執(zhí)行全局狀態(tài)的建立(例如定義布局),在onDestroy()方法中釋放所有保存的資源巍膘。
2.Activity的visible lifetime(可見的生命期)發(fā)生在調(diào)用onStart()和onStop()之間厂财。在這個(gè)期間,用戶能在屏幕上看見Activity峡懈,和它進(jìn)行交互璃饱。系統(tǒng)在Activity的完整壽命中可能多次調(diào)用onStart()和onStop(),正如Activity交替地對(duì)用戶可見或隱藏。
3Activity的foreground lifetime (前臺(tái)的生命期)發(fā)生在調(diào)用onResume()和onPause()之間肪康。 在這期間荚恶,Activity在屏幕上所有其他Activity的前面,有用戶輸入焦點(diǎn)磷支。 一個(gè)Activity能頻繁的在前臺(tái)進(jìn)入和出去之間轉(zhuǎn)變谒撼。
我們可以使用application注冊(cè)生命周期回調(diào)來監(jiān)聽每一個(gè)Activity的生命周期,如下:

 application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                
            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }

這樣當(dāng)每個(gè)Activity對(duì)象被創(chuàng)建使用時(shí)候雾狈,除了回調(diào)自己的內(nèi)部回調(diào)方法外還會(huì)回調(diào)這個(gè)callback中相應(yīng)的方法廓潜。如onCreate()對(duì)應(yīng)onActivityCreated()方法,因此可以通過這個(gè)回調(diào)來對(duì)Activity進(jìn)行統(tǒng)一管理善榛,例如創(chuàng)建一個(gè)靜態(tài)引用List來存儲(chǔ)Activity

List<Activity> activitys=new ArrayList<>();
//在創(chuàng)建activity時(shí)候加入到這個(gè)list中辩蛋,銷毀時(shí)候從list中刪除。
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                activity.add(activity);
            }

          ·
          ·
          ·

            @Override
            public void onActivityDestroyed(Activity activity) {
              activity.remove(activity);
            }
        });
    }

2 臨時(shí)存儲(chǔ)數(shù)據(jù)

當(dāng)活動(dòng)進(jìn)入停止?fàn)顟B(tài)時(shí)候移盆,就可能由于內(nèi)存不足被系統(tǒng)回收悼院,這時(shí)候可以通過onSaveInstanceState()方法來臨時(shí)存儲(chǔ)一些數(shù)據(jù),當(dāng)activity被重建時(shí)候可以通過onCreate()方法中的Bunble參數(shù)來提取到之前存儲(chǔ)的數(shù)據(jù)咒循。

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        String saveData="lalala";
        outState.putString("key",saveData);
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(savedInstanceState!=null)
        {
            String saveData=savedInstanceState.getString("key");
        }
    }

3 四種啟動(dòng)模式

Activity提供四種啟動(dòng)模式:standard樱蛤、singleTask、singleTop剑鞍、singleInstance昨凡,可以通過AndroidManifest.xml文件中activity標(biāo)間指定android:launchMode=··· 來設(shè)置啟動(dòng)模式

 android:launchMode="standard"

standard:這是系統(tǒng)默認(rèn)的啟動(dòng)模式,這種模式下不會(huì)在乎這個(gè)活動(dòng)是否已經(jīng)被創(chuàng)建蚁署,當(dāng)使用intent啟動(dòng)一個(gè)新活動(dòng)時(shí)就會(huì)創(chuàng)建一個(gè)新的Activity對(duì)象壓入棧頂便脊。

singleTop:當(dāng)一個(gè)活動(dòng)處于棧頂時(shí)在啟動(dòng)一個(gè)相同的活動(dòng)時(shí)不會(huì)創(chuàng)建新的實(shí)例,但是會(huì)調(diào)用onNewIntent()方法光戈。

singleTask:顧名思義哪痰,這種模式每個(gè)活動(dòng)只允許棧中存在一個(gè)實(shí)例遂赠,當(dāng)返回棧中存在某種活動(dòng)時(shí),開啟一個(gè)新活動(dòng)不會(huì)創(chuàng)建新的實(shí)例晌杰,只會(huì)將這個(gè)存在實(shí)例上面其他活動(dòng)出棧跷睦,使它成為棧頂活動(dòng),同樣會(huì)調(diào)用onNewIntent()方法肋演。
singleInstance:這種啟動(dòng)模型不適用默認(rèn)的返回棧抑诸,會(huì)啟用一個(gè)新的返回棧來管理這個(gè)活動(dòng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市爹殊,隨后出現(xiàn)的幾起案子蜕乡,更是在濱河造成了極大的恐慌,老刑警劉巖梗夸,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件层玲,死亡現(xiàn)場離奇詭異,居然都是意外死亡反症,警方通過查閱死者的電腦和手機(jī)辛块,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铅碍,“玉大人憨降,你說我怎么就攤上這事「眯铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵士嚎,是天一觀的道長呜魄。 經(jīng)常有香客問我,道長莱衩,這世上最難降的妖魔是什么爵嗅? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮笨蚁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘括细。我一直安慰自己伪很,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布奋单。 她就那樣靜靜地躺著锉试,像睡著了一般。 火紅的嫁衣襯著肌膚如雪览濒。 梳的紋絲不亂的頭發(fā)上呆盖,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天拖云,我揣著相機(jī)與錄音,去河邊找鬼应又。 笑死宙项,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的株扛。 我是一名探鬼主播尤筐,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼席里!你這毒婦竟也來了叔磷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤奖磁,失蹤者是張志新(化名)和其女友劉穎改基,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咖为,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秕狰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躁染。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸣哀。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吞彤,靈堂內(nèi)的尸體忽然破棺而出我衬,到底是詐尸還是另有隱情,我是刑警寧澤饰恕,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布挠羔,位于F島的核電站,受9級(jí)特大地震影響埋嵌,放射性物質(zhì)發(fā)生泄漏破加。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一雹嗦、第九天 我趴在偏房一處隱蔽的房頂上張望范舀。 院中可真熱鬧,春花似錦了罪、人聲如沸锭环。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽田藐。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間汽久,已是汗流浹背鹤竭。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留景醇,地道東北人臀稚。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像三痰,于是被迫代替她去往敵國和親吧寺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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