四大組件
Activity卜范、Service、Broadcast Receiver 柜蜈、Content Provider
五大布局 : FrameLayout约谈、LinearLayout、AbsoluteLayout质和、RelativeLayout 稳摄、TableLayout
- FrameLayout (幀布局)
這個(gè)布局中所有的控件都會(huì)默認(rèn)出現(xiàn)在視圖的左上角,我們可以使用android:layout_margin饲宿,android:layout_gravity等屬性去控制子控件相對(duì)布局的位置厦酬。 - LinearLayout (線性布局)
這個(gè)布局根據(jù)屬性 (android:orintation = "horizontal|vertical")進(jìn)行布局。horizontal 橫向布局瘫想,所有子控件按水平方向從左至右布局仗阅;vertical 垂直布局,所有子空間按垂直方向從上至下布局国夜。 - AbsoluteLayout (絕對(duì)布局)
布局中所有控件根絕自定義的x,y坐標(biāo)布局 - RelativeLayout (相對(duì)布局)
子控件元素可以相互之間相對(duì)布局减噪,也可以相對(duì)父控件布局,默認(rèn)都在左上角车吹。 - TableLayout (表格布局)
將子元素的位置分配到行或列中筹裕,一個(gè)TableLayout由許多的TableRow組成
Activity 生命周期
如下常用情景:
- 啟動(dòng)Activity : onCreate() --> onStrart() -->onResume() ,Activity 進(jìn)入運(yùn)行態(tài)
- Activity退居后臺(tái)(當(dāng)前Activity跳轉(zhuǎn)到新的Activity界面或按Home鍵回到主屏:onPause() --> onStop())礼搁,進(jìn)入停滯狀態(tài)饶碘。
- Activity返回前臺(tái): onRestart() --> onStart() --> onResume() 目尖,再次回到運(yùn)行狀態(tài)馒吴。
- Activity退居后臺(tái),且系統(tǒng)內(nèi)存不足瑟曲, 系統(tǒng)會(huì)殺死這個(gè)后臺(tái)狀態(tài)的Activity(此時(shí)這個(gè)Activity引用仍然處在任務(wù)棧中饮戳,只是這個(gè)時(shí)候引用指向的對(duì)象已經(jīng)為null),若再次回到這個(gè)Activity,則會(huì)走onCreate()–>onStart()—>onResume()(將重新走一次Activity的初始化生命周期)
- 鎖屏:onPause()->onStop()
- 解鎖:onReStart() ->onStart()->onResume()
Fragment的生命周期
Fragment 與 Activity 生命周期對(duì)照
Activity 四種啟動(dòng)模式: startdard | singleInstance | singleTask | singleTop
//在Manifest.xml文件中設(shè)置Activity的啟動(dòng)模式
android:launchMode="standard|singleInstance|singleTask|singleTop" ```
1. standard(標(biāo)準(zhǔn)模式): ,每次啟動(dòng)Activity都會(huì)創(chuàng)建一個(gè)新的Activity實(shí)例,并且將其壓入任務(wù)棧棧頂,而不管這個(gè)Activity是否已經(jīng)存在洞拨。Activity的啟動(dòng)三回調(diào)(onCreate()->onStart()->onResume())都會(huì)執(zhí)行扯罐。
2. singleTop(棧頂復(fù)用模式):這種模式下,如果新Activity已經(jīng)位于任務(wù)棧的棧頂,那么此Activity不會(huì)被重新創(chuàng)建,所以它的啟動(dòng)三回調(diào)就不會(huì)執(zhí)行,同時(shí)Activity的onNewIntent()方法會(huì)被回調(diào).如果Activity已經(jīng)存在但是不在棧頂,那么作用與standard模式一樣。
3. singleTask(棧內(nèi)復(fù)用模式):創(chuàng)建這樣的Activity的時(shí)候,系統(tǒng)會(huì)先確認(rèn)它所需任務(wù)棧已經(jīng)創(chuàng)建,否則先創(chuàng)建任務(wù)棧.然后放入Activity,如果棧中已經(jīng)有一個(gè)Activity實(shí)例,那么這個(gè)Activity就會(huì)被調(diào)到棧頂,onNewIntent(),并且singleTask會(huì)清理在當(dāng)前Activity上面的所有Activity.(clear top)烦衣。
4. singleInstance(獨(dú)棧模式)歹河。加強(qiáng)版的singleTask模式,這種模式的Activity只能單獨(dú)位于一個(gè)任務(wù)棧內(nèi),由于棧內(nèi)復(fù)用的特性,后續(xù)請(qǐng)求均不會(huì)創(chuàng)建新的Activity,除非這個(gè)獨(dú)特的任務(wù)棧被系統(tǒng)銷毀了掩浙。
### Service(服務(wù))
Service的兩種啟動(dòng)方法
1. 在Context中通過public boolean bindService(Intent service,ServiceConnection conn,int flags) 方法來進(jìn)行Service與Context的關(guān)聯(lián)并啟動(dòng),并且Service的生命周期依附于Context(不求同時(shí)同分同秒生秸歧!但求同時(shí)同分同秒死3Α!)键菱。
2. 通過public ComponentName startService(Intent service)方法去啟動(dòng)一個(gè)Service谬墙,此時(shí)Service的生命周期與啟動(dòng)它的Context無關(guān)。
3. 要注意的是经备,whatever拭抬,都需要在xml里注冊(cè)你的Service,就像這樣:
<service
android:name=".packnameName.youServiceName"
android:enabled="true" />
### Broadcast Receiver(廣播)
- 靜態(tài)注冊(cè):在AndroidManifest.xml文件中進(jìn)行注冊(cè)侵蒙,當(dāng)App退出后造虎,Receiver仍然可以接收到廣播并且進(jìn)行相應(yīng)的處理
- 動(dòng)態(tài)注冊(cè):在代碼中動(dòng)態(tài)注冊(cè),當(dāng)App退出后纷闺,也就沒辦法再接受廣播了
### Service (保證不被殺死累奈,沒有絕對(duì)的方法)
1. Service設(shè)置成START_STICKY
kill 后會(huì)被重啟(等待5秒左右),重傳Intent急但,保持與重啟前一樣
2. 提升service優(yōu)先級(jí)
在AndroidManifest.xml文件中對(duì)于intent-filter可以通過android:priority = "1000"這個(gè)屬性設(shè)置最高優(yōu)先級(jí)澎媒,1000是最高值,如果數(shù)字越小則優(yōu)先級(jí)越低波桩,同時(shí)適用于廣播戒努。
結(jié)論:目前看來,priority這個(gè)屬性貌似只適用于broadcast镐躲,對(duì)于Service來說可能無效
3. 提升service進(jìn)程優(yōu)先級(jí)
- Android中的進(jìn)程是托管的储玫,當(dāng)系統(tǒng)進(jìn)程空間緊張的時(shí)候,會(huì)依照優(yōu)先級(jí)自動(dòng)進(jìn)行進(jìn)程的回收
- 當(dāng)service運(yùn)行在低內(nèi)存的環(huán)境時(shí)萤皂,將會(huì)kill掉一些存在的進(jìn)程撒穷。因此進(jìn)程的優(yōu)先級(jí)將會(huì)很重要,可以在startForeground()使用startForeground()將service放到前臺(tái)狀態(tài)裆熙。這樣在低內(nèi)存時(shí)被kill的幾率會(huì)低一些端礼。
- 結(jié)論:如果在極度極度低內(nèi)存的壓力下,該service還是會(huì)被kill掉入录,并且不一定會(huì)restart()
onDestroy方法里重啟service
4. service +broadcast 方式
當(dāng)service走onDestory()的時(shí)候蛤奥,發(fā)送一個(gè)自定義的廣播,當(dāng)收到廣播的時(shí)候僚稿,重新啟動(dòng)service也可以直接在onDestroy()里startService
結(jié)論:當(dāng)使用類似口口管家等第三方應(yīng)用或是在setting里-應(yīng)用-強(qiáng)制停止時(shí)凡桥,APP進(jìn)程可能就直接被干掉了,onDestroy方法都進(jìn)不來蚀同,所以還是無法保證
監(jiān)聽系統(tǒng)廣播判斷Service狀態(tài)
5. 通過系統(tǒng)的一些廣播
比如:手機(jī)重啟缅刽、界面喚醒啊掏、應(yīng)用狀態(tài)改變等等監(jiān)聽并捕獲到,然后判斷我們的Service是否還存活衰猛,別忘記加權(quán)限
結(jié)論:這也能算是一種措施脖律,不過感覺監(jiān)聽多了會(huì)導(dǎo)致Service很混亂,帶來諸多不便
6. 在JNI層,用C代碼fork一個(gè)進(jìn)程出來
這樣產(chǎn)生的進(jìn)程,會(huì)被系統(tǒng)認(rèn)為是兩個(gè)不同的進(jìn)程.但是Android5.0之后可能不行
root之后放到system/app變成系統(tǒng)級(jí)應(yīng)用
7. 放一個(gè)像素在前臺(tái)(手機(jī)QQ)腕侄,現(xiàn)在也不行的小泉。
### 動(dòng)畫:
1. tween 補(bǔ)間動(dòng)畫。通過指定View的初末狀態(tài)和變化時(shí)間冕杠、方式微姊,對(duì)View的內(nèi)容完成一系列的圖形變換來實(shí)現(xiàn)動(dòng)畫效果。 Alpha Scale Translate Rotate分预。
2. frame 幀動(dòng)畫 AnimationDrawable 控制 animation-list xml布局
3. PropertyAnimation 屬性動(dòng)畫兢交,修改View的屬性值。
### Android數(shù)據(jù)存儲(chǔ)形式:
1. SQLite:SQLite是一個(gè)輕量級(jí)的數(shù)據(jù)庫笼痹,支持基本的SQL語法配喳,是常被采用的一種數(shù)據(jù)存儲(chǔ)方式。 Android為此數(shù)據(jù)庫提供了一個(gè)名為SQLiteDatabase的類凳干,封裝了一些操作數(shù)據(jù)庫的api
2. SharedPreference: 除SQLite數(shù)據(jù)庫外晴裹,另一種常用的數(shù)據(jù)存儲(chǔ)方式,其本質(zhì)就是一個(gè)xml文件救赐,常用于存儲(chǔ)較簡(jiǎn)單的參數(shù)設(shè)置涧团。
3. File: 即常說的文件(I/O)存儲(chǔ)方法,常用語存儲(chǔ)大數(shù)量的數(shù)據(jù)经磅,但是缺點(diǎn)是更新數(shù)據(jù)將是一件困難的事情泌绣。
4. ContentProvider: Android系統(tǒng)中能實(shí)現(xiàn)所有應(yīng)用程序共享的一種數(shù)據(jù)存儲(chǔ)方式,由于數(shù)據(jù)通常在各應(yīng)用間的是互相私密的预厌,所以此存儲(chǔ)方式較少使用阿迈,但是其又是必不可少的一種存儲(chǔ)方式。例如音頻轧叽,視頻苗沧,圖片和通訊錄,一般都可以采用此種方式進(jìn)行存儲(chǔ)犹芹。每個(gè)Content Provider都會(huì)對(duì)外提供一個(gè)公共的URI(包裝成Uri對(duì)象)崎页,如果應(yīng)用程序有數(shù)據(jù)需要共享時(shí)鞠绰,就需要使用Content Provider為這些數(shù)據(jù)定義一個(gè)URI腰埂,然后其他的應(yīng)用程序就通過Content Provider傳入這個(gè)URI來對(duì)數(shù)據(jù)進(jìn)行操作。
### Asset目錄與 res目錄的區(qū)別:
res 目錄下面有很多文件蜈膨,例如 drawable,mipmap,raw 等屿笼。res 下面除了 raw 文件不會(huì)被壓縮外牺荠,其余文件都會(huì)被壓縮。同時(shí) res目錄下的文件可以通過R 文件訪問驴一。Asset 也是用來存儲(chǔ)資源休雌,但是 asset 文件內(nèi)容只能通過路徑或者 AssetManager 讀取。 [官方文檔](https://developer.android.com/studio/projects/index.html)
###Android怎么加速啟動(dòng)Activity肝断。
分兩種情況杈曲,啟動(dòng)應(yīng)用 和 普通Activity 啟動(dòng)應(yīng)用 :Application 的構(gòu)造方法,onCreate 方法中不要進(jìn)行耗時(shí)操作胸懈,數(shù)據(jù)預(yù)讀取(例如 init 數(shù)據(jù)) 放在異步中操作 啟動(dòng)普通的Activity:A 啟動(dòng)B 時(shí)不要在 A 的 onPause 中執(zhí)行耗時(shí)操作担扑。因?yàn)?B 的 onCreate 方法必須等待 A 的 onPause 執(zhí)行完成后才能運(yùn)行。
### IntentService的使用場(chǎng)景與特點(diǎn)
IntentService是Service的子類趣钱,是一個(gè)異步的涌献,會(huì)自動(dòng)停止的服務(wù),很好解決了傳統(tǒng)的Service中處理完耗時(shí)操作忘記停止并銷毀Service的問題
優(yōu)點(diǎn):
1. 一方面不需要自己去new Thread
2. 另一方面不需要考慮在什么時(shí)候關(guān)閉該Service
onStartCommand中回調(diào)了onStart首有,onStart中通過mServiceHandler發(fā)送消息到該handler的handleMessage中去燕垃。最后handleMessage中回調(diào)onHandleIntent(intent)。
### 如何自定義控件:
View與View Group分類井联。自定義View過程:onMeasure()卜壕、onLayout()、onDraw()烙常。
1. 自定義屬性的聲明和獲取
1. 分析需要的自定義屬性
2. 在res/values/attrs.xml定義聲明
3. 在layout文件中進(jìn)行使用
2. 在View的構(gòu)造方法中進(jìn)行獲取
3. 測(cè)量onMeasure
4. 布局onLayout(ViewGroup)
5. 繪制onDraw
6. onTouchEvent
7. onInterceptTouchEvent(ViewGroup)
8. 狀態(tài)的恢復(fù)與保存