七月中旬正式進(jìn)入公司,八月初正式開始接觸android竞慢。三個多月以來筹煮,一直沒些什么東西,這一篇是首秀败潦,后面還會陸續(xù)寫一些 。對自己了解到的一些東西做一下總結(jié)檬洞。下面進(jìn)入正題沟饥,Android有四大組件:activity、service广料、content provider和broadcast幼驶。今天先來說說activity。
活動主要用于用戶交互糜颠,它最容易吸引到用戶,可以包含用戶界面的組件顶瞒,也可以只在里面添加邏輯元旬。一個App里面可以包含一個或者多個activity,不包含任何activity的應(yīng)用基本沒有坑资。
activity包括它的創(chuàng)建穆端,布局構(gòu)造,多個活動之間的交互攒巍,生命周期等等荒勇。activity的創(chuàng)建要根據(jù)開發(fā)平臺來處理,eclipse和android studio的創(chuàng)建方法類似兢孝,屬于基本操作仅偎。創(chuàng)建完成一個activity之后,系統(tǒng)會自動生成一個layout文件(用于調(diào)整這個activity的布局)并且在Androidmanifest中注冊這個活動(平臺一般會自動生成):
package="com.example.activity"
<application
android:allowBackup=="true"
android:icon="@mipmap/ic_lunch"
android:lable="@string/app_name" ? ? ? ? ? ? ? ? ??
android:supportRtl="true"
android:theme="@style/AppTheme" ? ? ? ? ? ? ? ? ??
<activity android:name=".FirstActivity"></activity>
allowbackup:是否允許返回 ? ? ? ? ? ? ? ?icon:圖標(biāo) ? ? ? ? ? ? ? ? lable:標(biāo)題欄的內(nèi)容
theme:頁面風(fēng)格窗轩,后面toolbar的時候會用到這個東西威恼。
name:活動名稱
在activity的主界面會自動重寫onCreate這個方法箫措,這個方法里面添加要在頁面上的顯示的內(nèi)容邏輯衬潦。除了onCreate之外還有onStart、onResume镀岛、onPause、onStop驾锰,onDestory、onRestart耻瑟。
onCreate:在活動第一次創(chuàng)建的時候調(diào)用赏酥,加載布局裸扶,綁定事件。
onStart:每次活動由不見變?yōu)榭梢姷氖菚r候調(diào)用呵晨。
onResume:在活動準(zhǔn)備好與用戶進(jìn)行交互的時候調(diào)用,此時活動位于返回棧的棧頂何荚。
onPause:在系統(tǒng)準(zhǔn)備去啟動或者恢復(fù)另一個活動的時候調(diào)用,在此過程中將消耗cpu的資源釋放掉妥衣,且速度要快
onStop:活動完全不可見時調(diào)用戒傻。
onDestory:活動被銷毀前調(diào)用,之后變?yōu)殇N毀態(tài)芦倒。
onRestart:由停止態(tài)轉(zhuǎn)換為運行狀態(tài)之前調(diào)用不翩。
上面的順序也是一個活動的生命周期口蝠。onStart可以添加影響app界面狀態(tài)的接口調(diào)用邏輯。onResume里面添加界面的刷新相關(guān)的邏輯妙蔗。活動的生命周期是一個返回棧的結(jié)構(gòu)昙啄。主要有四個狀態(tài):
運行態(tài):活動位于棧頂時梳凛,就是運行態(tài)
暫停狀態(tài):活動不在棧頂,但仍然可見
停止態(tài):活動不在棧頂且不可見韧拒,系統(tǒng)會為它保留相應(yīng)狀態(tài)和成員變量叭莫,但空間不足時,系統(tǒng)會將其回收雇初。
銷毀態(tài):活動從返回棧移除時靖诗,就處于銷毀態(tài),可以保證內(nèi)存充足刊橘。
完整生存期促绵。活動在onCreate()方法和 onDestroy()方法之間所經(jīng)歷的浓冒,就是完整生存期尖坤。一般情況下,一個活動會在 onCreate()方法中完成各種初始化操作场梆,而在onDestroy()方法中完成釋放內(nèi)存的操作纯路。
可見生存期:活動在 onStart()方法和 onStop()方法之間所經(jīng)歷的,就是可見生存期装哆。在可見生存期內(nèi)定嗓,活動對于用戶總是可見的,即便有可能無法和用戶進(jìn)行交互凌简。我們可以通過這兩個方法恃逻,合理地管理那些對用戶可見的資源。比如在 onStart()方法中對資源進(jìn)行加載凸郑,而在 onStop()方法中對資源進(jìn)行釋放矛市,從而保證處于停止?fàn)顟B(tài)的活動不會占用過多內(nèi)存。
前臺生存期而昨≌姨铮活動在 onResume()方法和 onPause()方法之間所經(jīng)歷的就是前臺生存期墩衙。在前臺生存期內(nèi),活動總是處于運行狀態(tài)的植袍,此時的活動是可以和用戶進(jìn)行交互的籽懦,我們平時看到和接觸最多的也就是這個狀態(tài)下的活動。
Intent用于一個活動喚醒另一個活動:
顯式調(diào)用
Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
隱式調(diào)用:
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="com.intent.category.DEFAULT"/>
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
在系統(tǒng)調(diào)用startActivity的時候會自動把android.Intent.category加到Intent里面去厅篓。必須action和category都匹配上才可以啟動相對應(yīng)的活動捶码。
關(guān)于Intent intent=new Intent(Intent.ACTION_VIEW);
Intent.setData(Uri.prase("+網(wǎng)址"))
先指定Intent的action是ACTION_VIEW這是一個內(nèi)置的常量惫恼,后面setData來調(diào)用資源,把網(wǎng)址解析成uri傳進(jìn)去令宿。相對應(yīng)的可以在<intent_filter>這里添加標(biāo)簽,詳細(xì)說明是什么類型的數(shù)據(jù)筛婉。數(shù)據(jù)類型有:http癞松、host、part硕勿、path枫甲、mimetype。寫法如下
<data android:scheme="http"/>
打電話软能,打開另一個app都可以通過類似的方式實現(xiàn)举畸。
接下來就是Intent來傳遞數(shù)據(jù)了
A頁面:
Intent intent=new Intent(Firstactivity.this,secondactivity.class);
intent.putextrra=("extra——data",data); ? ?//第一個參數(shù)是鍵,第二個是帶著內(nèi)容的參數(shù)跋核。
B接受頁面:
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
這時候data就讀取到了前一個頁面的信息data了叛买。
返回數(shù)據(jù)給前一個activity:
A頁面:startActivityForResult(intent率挣,1);
B頁面:Intent intent =new Intent ;
intent.putExtra=("data_extra","hello");
setResult(RESULT_OK,intent);
finish;
最后來說一說Activity的啟動模式:
standard 是活動默認(rèn)的啟動模式捶箱,在不進(jìn)行顯式指定的情況下动漾,所有活動都會自動使用這種啟動模式。因此晨川,到目前為止我們寫過的所有活動都是使用的 standard 模式。經(jīng)過上一節(jié)的學(xué)習(xí)愧怜,你已經(jīng)知道了 Android 是使用返回棧來管理活動的看蚜,在 standard 模式(即默認(rèn)情況)下供炎,每當(dāng)啟動一個新的活動疾党,它就會在返回棧中入棧,并處于棧頂?shù)奈恢媒叨邸τ谑褂?standard 模式的活動雹洗,系統(tǒng)不會在乎這個活動是否已經(jīng)在返回棧中存在时肿,每次啟動都會創(chuàng)建該活動的一個新的實例。
singleTop可能在有些情況下螃成,你會覺得 standard 模式不太合理寸宏。活動明明已經(jīng)在棧頂了羔巢,為什么再次啟動的時候還要創(chuàng)建一個新的活動實例呢罩阵?別著急,這只是系統(tǒng)默認(rèn)的一種啟動模式而已袍辞,你完全可以根據(jù)自己的需要進(jìn)行修改常摧,比如說使用 singleTop 模式。當(dāng)活動的啟動模式指定為singleTop谎懦,在啟動活動時如果發(fā)現(xiàn)返回棧的棧頂已經(jīng)是該活動界拦,則認(rèn)為可以直接使用它,不會再創(chuàng)建新的活動實例截碴。
singleTask使用 singleTop 模式可以很好地解決重復(fù)創(chuàng)建棧頂活動的問題蛉威,但是正如你在上一節(jié)所看到的,如果該活動并沒有處于棧頂?shù)奈恢谜芟海€是可能會創(chuàng)建多個活動實例的择示。那么有沒有什么辦法可以讓某個活動在整個應(yīng)用程序的上下文中只存在一個實例呢栅盲?這就要借助 singleTask 模式來實現(xiàn)了。當(dāng)活動的啟動模式指定為 singleTask摩瞎,每次啟動該活動時系統(tǒng)首先會在返回棧中檢查是否存在該活動的實例孝常,如果發(fā)現(xiàn)已經(jīng)存在則直接使用該實例,并把在這個活動之上的所有活動統(tǒng)統(tǒng)出棧上渴,如果沒有發(fā)現(xiàn)就會創(chuàng)建一個新的活動實例喜颁。
singleInstance 模式應(yīng)該算是 4 種啟動模式中最特殊也最復(fù)雜的一個了半开,你也需要多花點功夫來理解這個模式。不同于以上 3 種啟動模式奢米,指定為 singleInstance 模式的活動會啟用一個新的返回棧,在每一次啟動頁面的時候會調(diào)用這個回棧來管理這個活動(其實如果 singleTask 模式指定了不同的 taskAffinity谒拴,也會啟動一個新的返回棧涉波。后面會詳細(xì)來說一說activity的啟動模式。
第一篇暫時就這樣吧啤覆。