Android知識點(diǎn)總結(jié)

1.Android系統(tǒng)的架構(gòu)

1.Android系統(tǒng)架構(gòu)之應(yīng)用程序

Android會同一系列核心應(yīng)用程序包一起發(fā)布佣赖,該應(yīng)用程序包包括email客戶端恰矩,SMS短消息程序,日歷憎蛤,地圖外傅,瀏覽器纪吮,聯(lián)系人管理程序等。所有的應(yīng)用程序都是使用JAVA語言編寫的萎胰。

2.Android系統(tǒng)架構(gòu)之應(yīng)用程序框架

開發(fā)人員可以完全訪問核心應(yīng)用程序所使用的Api框架(android.jar)碾盟。該應(yīng)用程序的架構(gòu)設(shè)計簡化了組件的重用;任何一個應(yīng)用程序都可以發(fā)布它的功能塊并且任何其他的應(yīng)用程序都可以使用其發(fā)布的功能塊技竟。

3.Android系統(tǒng)架構(gòu)之系統(tǒng)運(yùn)行庫

Android包含一些C/C++庫冰肴,這些苦能被Android系統(tǒng)中的組件使用。它們通過Android應(yīng)用程序框架為開發(fā)者提供服務(wù)榔组。

4.Android系統(tǒng)架構(gòu)之Linux內(nèi)核

Android的核心系統(tǒng)服務(wù)依賴于Linux2.6內(nèi)核熙尉,如安全性,內(nèi)存管理搓扯,進(jìn)程管理检痰,網(wǎng)絡(luò)協(xié)議棧和驅(qū)動模型。Linux內(nèi)核也同時作為硬件和軟件之間的抽象層擅编。

2.activity的生命周期

image

Activity生命周期方法主要有onCreate(),onStart(),onResume(),onPause(),onStop(),onDestroy()和onRestart()等7個方法攀细。

  • 啟動一個A Acticity,分別執(zhí)行onCreate(),onStart,onRsume()方法爱态。
  • 從A Activity 打開B Activity分別執(zhí)行A onPause(), B onCreate(),B onstart(),B onResume(),A onStop()方法谭贪。
  • 關(guān)閉B Activity,分別執(zhí)行B onPause(),A onRestart(),A onResume(),B onStop(),B onDestory()方法。
  • 橫豎屏切換A Activity,清單文件中不設(shè)置android:configChanges屬性時锦担,先銷毀onPause(),onStop(),onDestory()在重新創(chuàng)建onCreate(),onStart(),onResume()方法俭识,設(shè)置orientation|screenSize(一定要同時出現(xiàn))屬性值時,不走生命周期方法洞渔,只會執(zhí)行onConfigurationChange()方法套媚。
  • Acitivity之間的切換可以看出onPause(),onStop()這兩個方法比較特殊,切換的時候onPause()方法不要加入太多耗時操作否則會影響體驗(yàn)磁椒。

3.Fragment的生命周期

Fragment的生命周期


image.png

Fragment與Activity生命周期對比


image.png

Fragment的生命周期方法主要有onAttach(),onCreate(),onCreateView(),onActivityCreated(),onStart(),onResume(),onPause(),onStop(),onDestroyView,onDestory(),onDetach()等11個方法堤瘤。

  • 切換到該Fragment,分別執(zhí)行onAttach(),onCreate(),onCreateView(),onAcitivityCreated(),onStart(),onResume()方法浆熔。
  • 鎖屏本辐,分別執(zhí)行onPause(),onStop()方法。
  • 亮屏医增,分別執(zhí)行onStart(),onResume()方法慎皱。
  • 覆蓋,切換到其他Fragment叶骨,分別執(zhí)行onPause().onStop(),onDestoryView()方法茫多。
  • 從其他Fragment回到之前的Fragment,分別執(zhí)行onCreateView(),onActivityCreated(),onStart(),onResume()方法忽刽。

4.service生命周期

在service的生命周期里常有:

4個手動調(diào)用的方法

  • startService() 啟動服務(wù)
  • stopService() 關(guān)閉服務(wù)
  • bindService() 綁定服務(wù)
  • unbindService() 解綁服務(wù)

5個內(nèi)部自動調(diào)用的方法

  • onCreate() 創(chuàng)建服務(wù)
  • onStartCommand() 開始服務(wù)
  • onDestory() 銷毀服務(wù)
  • onBind() 綁定服務(wù)
  • onUnbind() 解綁服務(wù)
  1. 手動調(diào)用startService()啟動服務(wù)天揖,自動調(diào)用內(nèi)部方法:onCreate(),onStartCommand(),如果一個Service被startService()多次啟動夺欲,那么onCreate()也只會調(diào)用一次。
  2. 手動調(diào)用stopService()關(guān)閉服務(wù)宝剖,自動調(diào)用內(nèi)部方法:onDetroy(),如果一個service被啟動且綁定洁闰,如果在沒有解綁的前提下使用stopService()關(guān)閉服務(wù)是無法停止服務(wù)的。
  3. 手動調(diào)用bindService()后万细,自動調(diào)用內(nèi)部方法:onCreate(),onBind().
  4. 手動調(diào)用unBindService()后,自動調(diào)用內(nèi)部方法:onUnbind(),onDestory().
  5. startService()和StopService()只能開啟和關(guān)閉Service纸泄,無法操作service赖钞,調(diào)用者退出后Service仍然存在;bindService()和unBindService()可以操作Service,調(diào)用者退出后聘裁,Service隨著調(diào)用者銷毀雪营。

5.Android中動畫

Android中動畫分別幀動畫,補(bǔ)間動畫和屬性動畫(Android3.0以后的)

幀動畫

幀動畫是最容易實(shí)現(xiàn)的一種動畫衡便,這種動畫更多的依賴于完美的UI資源献起,他的原理是間一張張單獨(dú)的圖片連貫的進(jìn)行播放,從而在視覺上產(chǎn)生一種動畫的效果镣陕;有點(diǎn)類似于某些軟件制作gif動畫的方式谴餐。在有些代碼中,我們還會看到android:oneshot="false",這個oneshot的含義就是動畫執(zhí)行一次(true)還是循環(huán)執(zhí)行多次呆抑。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/a_0"
        android:duration="100" />
    <item
        android:drawable="@drawable/a_1"
        android:duration="100" />
    <item
        android:drawable="@drawable/a_2"
        android:duration="100" />
</animation-list>

補(bǔ)間動畫

補(bǔ)間動畫有可以分為四種岂嗓,分別是alpha(淡入淡出),translate(位移)鹊碍,scale(縮放大醒嵫场),rotate(旋轉(zhuǎn))侈咕。
補(bǔ)間動畫的實(shí)現(xiàn)公罕,一般會采用xml文件的形式;代碼會更容易書寫和閱讀耀销,同時也更容易復(fù)用楼眷。interpolator主要作用是可以控制動畫的變化速率,就是動畫進(jìn)行的快慢節(jié)奏树姨。pivot決定了當(dāng)前動畫執(zhí)行的參考位置

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:shareInterpolator=["true" | "false"] >
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <scale
        android:fromXScale="float"
        android:toXScale="float"
        android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float" />
    <translate
        android:fromXDelta="float"
        android:toXDelta="float"
        android:fromYDelta="float"
        android:toYDelta="float" />
    <rotate
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float" />
    <set>
        ...
    </set>
</set>

屬性動畫

屬性動畫摩桶,顧名思義它是對于對象屬性的動畫。因此帽揪,所有補(bǔ)間動畫的內(nèi)容硝清,都可以通過屬性動畫實(shí)現(xiàn)。屬性動畫的運(yùn)行機(jī)制是通過不斷地對值進(jìn)行操作來實(shí)現(xiàn)的转晰,而初始值和結(jié)束值之間的動畫過渡就是由ValueAnimator這個類來負(fù)責(zé)計算的芦拿。它的內(nèi)部使用一種時間循環(huán)的機(jī)制來值與值之間的動畫過渡士飒,我們只需要將初始值和結(jié)束值提供給ValueAnimator就會自動幫我們完成從初始值平滑地過渡到結(jié)束值這樣的效果。除此之外蔗崎,ValueAnimator還負(fù)責(zé)管理動畫的播放次數(shù)酵幕,播放模式,以及對動畫設(shè)置監(jiān)聽器等缓苛。

6.Android中的4大組件

  1. Activity:Activity是Android程序與用戶交互的窗口芳撒,是Android構(gòu)造中最基本的一種,他需要為保持各界面的狀態(tài)未桥,做很多持久化的事情笔刹,妥善管理生命周期以及一些跳轉(zhuǎn)邏輯。
  2. BroadCast Receiver:接受一種或者多種intent作觸發(fā)事件冬耿,接受相關(guān)消息舌菜,做一些簡單處理,轉(zhuǎn)換成一條Notification亦镶,統(tǒng)一了Android的事件廣播模型日月。
  3. Content Provider:是Android提供的第三方應(yīng)用數(shù)據(jù)的訪問方案,可以派生Content Provider 類缤骨,對外提供數(shù)據(jù)爱咬,可以像數(shù)據(jù)一樣進(jìn)行選擇排序,屏蔽內(nèi)部數(shù)據(jù)的存儲細(xì)節(jié),向外提供統(tǒng)一的接口模型荷憋,大大簡化上層應(yīng)用台颠,對數(shù)據(jù)的整合提供了更方便的途徑。
  4. Service:后臺服務(wù)于Activity勒庄,封裝有一個完整的功能邏輯實(shí)現(xiàn)串前,接受上層指令,完成相關(guān)的事務(wù)实蔽,定義好需要接受的intent提供同步和異步的接口荡碾。

7.Android中常用布局

常用的布局:

  • FrameLayout(幀布局):所有東西依次都放在左上角,會重疊局装。
  • LinearLayout(線性布局):按水平和垂直進(jìn)行數(shù)據(jù)展示坛吁。
  • RelativeLayout(相對布局):以某一個元素為參照物,來定位的布局方式铐尚。

不常用的布局:

  • TableLayout(表格布局):每一個TableLayout里面有表格行TableRow拨脉,TableRow里面可以具體定義每一個元素(Android TV上使用)
  • AbsoluteLayout(絕對布局):用x,y坐標(biāo)來指定元素的位置,元素多就不適用宣增。(機(jī)頂盒上使用)
    新增布局:
  • PercentRelativeLayout(百分比相對布局):可以通過百分比控制控件的大小玫膀。
  • PercentFrameLayout(百分比幀布局):可以通過百分比控制控件的大小。

8. Android數(shù)據(jù)存儲

  1. 使用SharedPreference存儲數(shù)據(jù)爹脾;它是Android提供的用來存儲一些簡單配置信息的一種機(jī)制帖旨,采用了XML格式將數(shù)據(jù)存儲到設(shè)備中箕昭,只能在同一個包內(nèi)使用,不能在不同包之間使用解阅。
  2. 文件存儲數(shù)據(jù)落竹;文件存儲方式是一種叫常用的方法,在Android中讀取/寫入文件的方法货抄,與java中實(shí)現(xiàn)I/O的程序是完全一樣的述召,提供了openFileInput()和openFileOutput()方法來讀取設(shè)備上的文件。
  3. SQlite數(shù)據(jù)庫存儲數(shù)據(jù)蟹地;SQlite是Android所帶的一個標(biāo)準(zhǔn)的數(shù)據(jù)庫桨武,它支持SQL語句,它是一個輕量級的嵌入式數(shù)據(jù)庫锈津。
  4. 使用ContentProvider存儲數(shù)據(jù);主要在于應(yīng)用程序之間進(jìn)行數(shù)據(jù)交換凉蜂,從而能夠讓其他的應(yīng)用保存或讀取此ContentProvider的各種數(shù)據(jù)的類型琼梆。
  5. 網(wǎng)絡(luò)存儲數(shù)據(jù);同網(wǎng)絡(luò)上提供給我們的存儲空間來上傳(存儲)和下載(獲攘浴)我們存儲在網(wǎng)絡(luò)空間中的數(shù)據(jù)信息茎杂。

9.Activity啟動模式

介紹Android啟動模式之前,先介紹兩個概念task和taskAffinity

  • task:翻譯過來就是“任務(wù)”纫雁,是一組相互關(guān)聯(lián)的activity集合煌往,可以理解為Activity是在task里面活動的。task存在于一個被稱為back stack的數(shù)據(jù)結(jié)構(gòu)中轧邪,也就是說刽脖,task是以棧的形式去管理activity的,所以也可以叫做“任務(wù)椉捎蓿”曲管。
  • taskAffinity:官方文檔翻譯是:“The task that the activity has a affinity for.”,可以翻譯為activity相關(guān)或者親和任務(wù),這個參數(shù)標(biāo)識了一個Activity所需要的任務(wù)棧的名字硕糊。默認(rèn)情況下院水,所有Activity所需要的任務(wù)棧的名字為應(yīng)用的包名。taskAffinity屬性主要和singleTask啟動模式或者allowTaskReparenting屬性配對使用简十。

4種啟動模式

  1. standard:標(biāo)準(zhǔn)模式檬某,也是系統(tǒng)默認(rèn)的啟動模式。假如activity A啟動了activity B螟蝙,activity B則會運(yùn)行在activity A所在的任務(wù)棧中恢恼。而且每次啟動一個Activity,都會重新創(chuàng)建新的實(shí)例胶逢,不管這個實(shí)例在任務(wù)中是否已經(jīng)存在厅瞎。非Activity類型的context(如ApplicationContext)啟動standard模式的Activity時會報錯饰潜。非Activity類型的context并沒有所謂的任務(wù)棧,由于上面第1點(diǎn)的原因所以系統(tǒng)會報錯和簸。此解決辦法就是待啟動acti指定FLAG_ACTIVITY_NEW_TASK標(biāo)記位彭雾,這樣啟動的時候系統(tǒng)就會為它創(chuàng)建一個新的任務(wù)棧。這個時候待啟動Activity其實(shí)是以singleTask模式啟動的锁保。
  2. singleTop:棧頂復(fù)用模式薯酝。假如activity A啟動了activity B,就會判斷A所在的任務(wù)棧棧頂是否是B實(shí)例爽柒。如果是吴菠,則不創(chuàng)建新的activity B實(shí)例而是直接引用這個棧頂實(shí)例,同時onNewIntent方法會被調(diào)用浩村,通過該方法的參數(shù)可以取得當(dāng)前請求的信息做葵;如果不是,則創(chuàng)建新的activity B實(shí)例心墅。
  3. singleTask:棧內(nèi)復(fù)用模式酿矢。在第一次啟動這個Activity時,系統(tǒng)便會創(chuàng)建一個新的任務(wù)怎燥,并且初始化Activity的實(shí)例瘫筐,放在心任務(wù)的底部。不過需要滿足一定條件的铐姚。那就是需要設(shè)置taskAffinity屬性策肝。前面也說過了,taskAffinity屬性是和singleTask模式搭配使用的隐绵。
    [圖片上傳失敗...(image-4509a9-1593940979666)]
  4. singleInstance:單實(shí)例模式之众。這個時singleTask模式的加強(qiáng)版,它除了具有singleTask模式的所有特性外氢橙,它還有一點(diǎn)獨(dú)特的特性酝枢,那就是此模式的Activity只能單獨(dú)地位于一個任務(wù)棧,不與其他Activity共存于同一個任務(wù)棧悍手。

10.廣播注冊

首先寫一個類要繼承BroadCastReceiver
第一種:在清單文件中聲明帘睦,添加

<receive android:name=".BroadCastReceiverDemo">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED">
</intent-filter>
</receiver>

第二種:使用代碼進(jìn)行注冊如:

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
BroadCastReceiverDemo receiver = new BroadCastReceiver();
registerReceiver(receiver, filter);

兩種注冊類型的區(qū)別是:

  1. 第一種是常駐型廣播,也就是說當(dāng)應(yīng)用程序關(guān)閉后坦康,如果有信息廣播來竣付,程序也會被系統(tǒng)調(diào)用自動運(yùn)行。
  2. 第二種不是常駐型廣播滞欠,也就是說廣播跟隨程序的生命周期古胆。

11.Android中的ANR

ANR的全稱application not responding responding 應(yīng)用程序未響應(yīng)。

  • 在android中Activity的最長執(zhí)行事時間為5秒。
  • broadcastreceiver的最長執(zhí)行時間則是10秒逸绎。
  • Service的最長執(zhí)行時間是20秒惹恃。

超過執(zhí)行時間就會產(chǎn)生ANR。注意:ANR是系統(tǒng)拋出的異常棺牧,程序是捕捉不了這個異常的巫糙。
解決方法:

  1. 運(yùn)行在主線程里的任何方法都盡可能少做事情。特別是颊乘,Activity應(yīng)該在它的關(guān)鍵生命周期方法(如onCreate()和OnResue())里盡可能少的去做創(chuàng)建操作参淹。(可以采用重新開啟子線程的方式,然后使用hander+message的方式去做一些操作乏悄,比如更新主線程中的UI等)浙值。
  2. 應(yīng)用程序應(yīng)該避免在broadcastreceiver里面做耗時的操作或者計算。但不再是在子線程里做這些任務(wù)(因?yàn)閎roadcastreceiver的生命周期短)替代的是檩小,如果響應(yīng)intent廣播需要執(zhí)行一個耗時的動作的話开呐,應(yīng)用程序應(yīng)該啟動一個Service。

12.ListView優(yōu)化

  1. convertView重用规求,利用好convertView來重用View负蚊,切勿每次getView()都新建。ListView的核心原理就是重用View颓哮,如果重用View不改變寬高,重用View就可以減少重新分配緩存造成的內(nèi)存頻繁分配/回收鸵荠。
  2. ViewHolder優(yōu)化冕茅,使用ViewHolder的原因是findViewById方法耗時較大,如果控件個數(shù)過多蛹找,會嚴(yán)重影響性能姨伤,而使用ViewHolder主要是為了可以省去這個時間。通過setTag庸疾,getTag直接獲取View乍楚。
  3. 減少ItemView的布局層次,這是所有l(wèi)ayout都必須遵循的届慈,布局層級過深會直接導(dǎo)致View的測量和繪制浪費(fèi)大量的時間徒溪。
  4. adapter中的getView方法盡量少使用邏輯。
  5. 圖片加載采用三級緩存金顿,避免每次都要重新加載臊泌。
  6. 嘗試開啟硬件加速來使ListView的滑動更加流暢。
  7. 使用RecycleView代替揍拆。

13.Thread和Runnable的區(qū)別

在程序開發(fā)中只要是多線程肯定永遠(yuǎn)以實(shí)現(xiàn)Runnable接口為主渠概,因?yàn)閷?shí)現(xiàn)Runnable接口相比。
繼承Thread類有如下好處:

  • 避免點(diǎn)繼承的局限嫂拴,一個類可以繼承多個接口播揪。
  • 適合于資源的共享

在使用Runnable定義的子類中沒有start()方法贮喧,只有Thread類中才有。此時觀察Thread類猪狈,有一個構(gòu)造方法:public Thread(Runnable targer)此構(gòu)造方法接受Runnable的子類實(shí)例箱沦,也就是說可以通過Thread類來啟動Runnable實(shí)現(xiàn)的多線程。

14.Android中activity罪裹,context饱普,application有什么不同

Content與application都繼承與contextWrapper,contextWrapper繼承于Context類状共。

Context:表示當(dāng)前上下文對象套耕,保存的是上下文中的參數(shù)和變量,它可以讓更加方便訪問到一些資源峡继。

Context通常與activity的生命周期是一樣的冯袍,application表示整個應(yīng)用程序的對象。

對于一些生命周期較長的碾牌,不要使用context康愤,可以使用application。

在activity中舶吗,盡量使用靜態(tài)內(nèi)部類征冷,不要使用內(nèi)部類。內(nèi)部里作為外部類的成員存在誓琼,不是獨(dú)立于activity检激,如果內(nèi)存中還有內(nèi)存繼續(xù)引用到context,activity如果被銷毀腹侣,context還不會結(jié)束叔收。

Context區(qū)別

  • Activity和Service以及Application的Context是不一樣的,Activity繼承自ContextThemeWraper.其他的繼承自ContextWrapper
  • 每一個Activity和Service以及Application的Context都是一個新的ContextImpl對象
  • getApplication()用來獲取Application實(shí)例的,但是這個方法只有在Activity和Service中才能調(diào)用的到傲隶。那么也許在絕大多數(shù)情況下我們都是在Activity或者Service中使用Application的饺律,但是如果在一些其它的場景,比如BroadcastReceiver中也想獲得Application的實(shí)例跺株,這時就可以借助getApplicationContext()方法复濒,getApplicationContext()比getApplication()方法的作用域會更廣一些,任何一個Context的實(shí)例乒省,只要調(diào)用getApplicationContext()方法都可以拿到我們的Application對象芝薇。
  • Activity在創(chuàng)建的時候會new一個ContextImpl對象并在attach方法中關(guān)聯(lián)它,Application和Service也差不多作儿。ContextWrapper的方法內(nèi)部都是轉(zhuǎn)調(diào)ContextImpl的方法
  • 創(chuàng)建對話框傳入Application的Context是不可以的
  • 盡管Application洛二、Activity、Service都有自己的ContextImpl,并且每個ContextImpl都有自己的mResources成員晾嘶,但是由于它們的mResources成員都來自于唯一的ResourcesManager實(shí)例妓雾,所以它們看似不同的mResources其實(shí)都指向的是同一塊內(nèi)存
  • Context的數(shù)量等于Activity的個數(shù) + Service的個數(shù) + 1,這個1為Application

15.Serializable 和 Parcelable 的區(qū)別垒迂?

如果存儲在內(nèi)存中械姻,推薦使用parcelable,使用serialiable在序列化的時候會產(chǎn)生大量的臨時變量机断,會引起頻繁的GC

如果存儲在硬盤上楷拳,推薦使用Serializable,雖然serializable效率較低

Serializable的實(shí)現(xiàn):只需要實(shí)現(xiàn)Serializable接口吏奸,就會自動生成一個序列化id

Parcelable的實(shí)現(xiàn):需要實(shí)現(xiàn)Parcelable接口欢揖,還需要Parcelable.CREATER變量

16.ListView 如何提高其效率?

當(dāng) convertView 為空時奋蔚,用 setTag()方法為每個 View 綁定一個存放控件的 ViewHolder 對象她混。當(dāng)convertView 不為空, 重復(fù)利用已經(jīng)創(chuàng)建的 view 的時候泊碑, 使用 getTag()方法獲取綁定的 ViewHolder對象坤按,這樣就避免了 findViewById 對控件的層層查詢,而是快速定位到控件馒过。 復(fù)用 ConvertView臭脓,使用歷史的 view,提升效率 200%

自定義靜態(tài)類 ViewHolder腹忽,減少 findViewById 的次數(shù)谢鹊。提升效率 50%

異步加載數(shù)據(jù),分頁加載數(shù)據(jù)留凭。

使用 WeakRefrence 引用 ImageView 對象

17.uses-permission和permission的區(qū)別

就是<uses-permission>是官方定義的權(quán)限,是調(diào)用別人的東西的時候自己需要聲明的權(quán)限偎巢,<permission>是自己定義的權(quán)限蔼夜,就是別人調(diào)用這個程序時需要用<uses-permission>來聲明。
在一般情況下實(shí)際上不需要為自己的應(yīng)用程序聲明某個權(quán)限压昼,除非你提供了供其他應(yīng)用程序調(diào)用的代碼或者數(shù)據(jù)求冷。這個時候你才需要使用<permission>這個標(biāo)簽,很顯然這個標(biāo)簽可以讓我們聲明自己程序的權(quán)限窍霞。

18.Fragment 在你們項(xiàng)目中的使用

Fragment 是 android3.0 以后引入的的概念匠题,做局部內(nèi)容更新更方便,原來為了到達(dá)這一點(diǎn)要把多個布局放到一個 activity 里面但金,現(xiàn)在可以用多 Fragment 來代替韭山,只有在需要的時候才加載Fragment,提高性能。

Fragment 的好處:

  • Fragment 可以使你能夠?qū)?activity 分離成多個可重用的組件钱磅,每個都有它自己的生命周期和UI梦裂。
  • Fragment 可以輕松得創(chuàng)建動態(tài)靈活的 UI 設(shè)計盖淡,可以適應(yīng)于不同的屏幕尺寸年柠。從手機(jī)到平板電腦。
  • Fragment 是一個獨(dú)立的模塊,緊緊地與 activity 綁定在一起褪迟∪吆蓿可以運(yùn)行中動態(tài)地移除、加入味赃、交換等掀抹。
  • Fragment 提供一個新的方式讓你在不同的安卓設(shè)備上統(tǒng)一你的 UI。
  • Fragment 解決 Activity 間的切換不流暢洁桌,輕量切換渴丸。
  • Fragment 替代 TabActivity 做導(dǎo)航,性能更好另凌。
  • Fragment 在 4.2.版本中新增嵌套 fragment 使用方法谱轨,能夠生成更好的界面效果。

19.Android 線程間通信有哪幾種方式

  • 共享內(nèi)存(變量)吠谢;
  • 文件土童,數(shù)據(jù)庫;
  • Handler工坊;
  • Java 里的 wait()献汗,notify(),notifyAll()王污;

20.Framework 工作方式及原理罢吃,Activity 是如何生成一個 view 的,機(jī)制是什么昭齐?

所有的框架都是基于反射 和 配置文件(manifest)的尿招。

普通的情況:

Activity 創(chuàng)建一個 view 是通過 ondraw 畫出來的, 畫這個 view 之前呢,還會調(diào)用 onmeasure方法來計算顯示的大小.

特殊情況:

Surfaceview 是直接操作硬件的,因?yàn)?或者視頻播放對幀數(shù)有要求阱驾,onDraw 效率太低就谜,不夠使,Surfaceview 直接把數(shù)據(jù)寫到顯存里覆。

21.Android中touch事件的傳遞機(jī)制是怎樣的?

  1. Touch事件傳遞的相關(guān)API有dispatchTouchEvent丧荐、onTouchEvent、onInterceptTouchEvent
  2. Touch事件相關(guān)的類有View喧枷、ViewGroup虹统、Activity
  3. Touch事件會被封裝成MotionEvent對象弓坞,該對象封裝了手勢按下合冀、移動荠列、松開等動作
  4. Touch事件通常從Activity#dispatchTouchEvent發(fā)出,只要沒有被消費(fèi)簿废,會一直往下傳遞夸赫,到最底層的View菩帝。
  5. 如果Touch事件傳遞到的每個View都不消費(fèi)事件,那么Touch事件會反向向上傳遞,最終交由Activity#onTouchEvent處理.
  6. onInterceptTouchEvent為ViewGroup特有茬腿,可以攔截事件.
  7. Down事件到來時呼奢,如果一個View沒有消費(fèi)該事件,那么后續(xù)的MOVE/UP事件都不會再給它

22.描述下Handler 機(jī)制

  1. Looper: 一個線程可以產(chǎn)生一個Looper對象切平,由它來管理此線程里的MessageQueue(消息隊(duì)列)握础。
  2. Handler: 你可以構(gòu)造Handler對象來與Looper溝通,以便push新消息到MessageQueue里;或者接收Looper從Message Queue取出)所送來的消息悴品。
  3. Message Queue(消息隊(duì)列):用來存放線程放入的消息禀综。
  4. 線程:UIthread 通常就是main thread,而Android啟動程序時會替它建立一個MessageQueue苔严。

Hander持有對UI主線程消息隊(duì)列MessageQueue和消息循環(huán)Looper的引用定枷,子線程可以通過Handler將消息發(fā)送到UI線程的消息隊(duì)列MessageQueue中。

23.自定義view的基本流程

  • 自定義View的屬性 編寫attr.xml文件
  • 在layout布局文件中引用届氢,同時引用命名空間
  • 在View的構(gòu)造方法中獲得我們自定義的屬性 欠窒,在自定義控件中進(jìn)行讀取(構(gòu)造方法拿到attr.xml文件值)
  • 重寫onMesure
  • 重寫onDraw

24.事件分發(fā)中的 onTouch 和 onTouchEvent 有什么區(qū)別退子,又該如何使用岖妄?

這兩個方法都是在 View 的 dispatchTouchEvent 中調(diào)用的,onTouch 優(yōu)先于 onTouchEvent執(zhí)行寂祥。如果在 onTouch 方法中通過返回 true 將事件消費(fèi)掉荐虐,onTouchEvent 將不會再執(zhí)行。

另外需要注意的是丸凭,onTouch 能夠得到執(zhí)行需要兩個前提條件福扬,第一 OnTouchListener 的值不能為空,第二當(dāng)前點(diǎn)擊的控件必須是 enable 的贮乳。因此如果你有一個控件是非 enable 的,那么給它注冊 onTouch 事件將永遠(yuǎn)得不到執(zhí)行恬惯。對于這一類控件向拆,如果我們想要監(jiān)聽它的 touch 事件,就必須通過在該控件中重寫 onTouchEvent 方法來實(shí)現(xiàn)酪耳。

25.一般在開發(fā)項(xiàng)目中都使用什么設(shè)計模式浓恳?如何來重構(gòu)刹缝,優(yōu)化代碼?

較為常用的就是單例設(shè)計模式颈将,工廠設(shè)計模式以及觀察者設(shè)計模式,

一般需要保證對象在內(nèi)存中的唯一性時就是用單例模式,例如對數(shù)據(jù)庫操作的 SqliteOpenHelper 的對象梢夯。

工廠模式主要是為創(chuàng)建對象提供過渡接口,以便將創(chuàng)建對象的具體過程屏蔽隔離起來晴圾,達(dá)到提高靈活性的目的颂砸。

觀察者模式定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時死姚,所有依賴于它的對象都得到通知并被自動更新人乓。

26. 定位項(xiàng)目中,如何選取定位方案都毒,如何平衡耗電與實(shí)時位置的精度色罚?

開始定位,Application 持有一個全局的公共位置對象账劲,然后隔一定時間自動刷新位置戳护,每次刷新成功都把新的位置信息賦值到全局的位置對象, 然后每個需要使用位置請求的地方都使用全局的位置信息進(jìn)行請求瀑焦。

  • 該方案好處:請求的時候無需再反復(fù)定位腌且,每次請求都使用全局的位置對象,節(jié)省時間蝠猬。
  • 該方案弊端:耗電切蟋,每隔一定時間自動刷新位置,對電量的消耗比較大榆芦。

按需定位柄粹,每次請求前都進(jìn)行定位。這樣做的好處是比較省電匆绣,而且節(jié)省資源驻右,但是請求時間會變得相對較長。

27.andorid 應(yīng)用第二次登錄實(shí)現(xiàn)自動登錄

前置條件是所有用戶相關(guān)接口都走 https崎淳,非用戶相關(guān)列表類數(shù)據(jù)走 http堪夭。

  • 第一次登陸 getUserInfo 里帶有一個長效 token,該長效 token 用來判斷用戶是否登陸和換取短 token
  • 把長效 token 保存到 SharedPreferences
  • 接口請求用長效 token 換取短token拣凹,短 token 服務(wù)端可以根據(jù)你的接口最后一次請求作為標(biāo)示森爽,超時時間為一天。
  • 所有接口都用短效 token
  • 如果返回短效 token 失效嚣镜,執(zhí)行第3步爬迟,再直接當(dāng)前接口
  • 如果長效 token 失效(用戶換設(shè)備或超過一月),提示用戶登錄菊匿。

28.怎樣對 android 進(jìn)行優(yōu)化付呕?

  • 對 listview 的優(yōu)化计福。
  • 對圖片的優(yōu)化。
  • 對內(nèi)存的優(yōu)化徽职。
  • 具體一些措施
  • 盡量不要使用過多的靜態(tài)類 static
  • 數(shù)據(jù)庫使用完成后要記得關(guān)閉 cursor
  • 廣播使用完之后要注銷

29.wait()和sleep()的區(qū)別

sleep()方法是線程類(Thread)的靜態(tài)方法象颖,導(dǎo)致此線程暫停執(zhí)行指定時間,將執(zhí)行機(jī)會給其他線程姆钉,但是監(jiān)控狀態(tài)依然保持说订,到時后會自動恢復(fù)(線程回到就緒(ready)狀態(tài)),因?yàn)檎{(diào)用sleep 不會釋放對象鎖育韩。wait()是Object 類的方法克蚂,對此對象調(diào)用wait()方法導(dǎo)致本線程放棄對象鎖(線程暫停執(zhí)行),進(jìn)入等待此對象的等待鎖定池筋讨,只有針對此對象發(fā)出notify 方法(或notifyAll)后本線程才進(jìn)入對象鎖定池準(zhǔn)備獲得對象鎖進(jìn)入就緒狀態(tài)埃叭。

30.自定義View過程:

  • onMeasure()
  • onLayout()
  • onDraw()。

如何自定義控件:

  1. 自定義屬性的聲明和獲取
  • 分析需要的自定義屬性
  • 在res/values/attrs.xml定義聲明
  • 在layout文件中進(jìn)行使用
  • 在View的構(gòu)造方法中進(jìn)行獲取
  1. 測量onMeasure
  2. 布局onLayout(ViewGroup)
  3. 繪制onDraw
  4. onTouchEvent
  5. onInterceptTouchEvent(ViewGroup)
  6. 狀態(tài)的恢復(fù)與保存
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悉罕,一起剝皮案震驚了整個濱河市赤屋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壁袄,老刑警劉巖类早,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嗜逻,居然都是意外死亡涩僻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門栈顷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逆日,“玉大人,你說我怎么就攤上這事萄凤∈页椋” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵靡努,是天一觀的道長坪圾。 經(jīng)常有香客問我,道長惑朦,這世上最難降的妖魔是什么兽泄? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮漾月,結(jié)果婚禮上病梢,老公的妹妹穿的比我還像新娘。我一直安慰自己栅屏,他們只是感情好飘千,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著栈雳,像睡著了一般护奈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哥纫,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天霉旗,我揣著相機(jī)與錄音,去河邊找鬼蛀骇。 笑死厌秒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的擅憔。 我是一名探鬼主播鸵闪,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暑诸!你這毒婦竟也來了蚌讼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤个榕,失蹤者是張志新(化名)和其女友劉穎篡石,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體西采,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凰萨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了械馆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胖眷。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狱杰,靈堂內(nèi)的尸體忽然破棺而出瘦材,到底是詐尸還是另有隱情,我是刑警寧澤仿畸,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布食棕,位于F島的核電站,受9級特大地震影響错沽,放射性物質(zhì)發(fā)生泄漏簿晓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一千埃、第九天 我趴在偏房一處隱蔽的房頂上張望憔儿。 院中可真熱鬧,春花似錦放可、人聲如沸谒臼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜈缤。三九已至拾氓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間底哥,已是汗流浹背咙鞍。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趾徽,地道東北人续滋。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像孵奶,于是被迫代替她去往敵國和親疲酌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,744評論 25 707
  • Android Studio JNI流程首先在java代碼聲明本地方法 用到native關(guān)鍵字 本地方法不用去實(shí)現(xiàn)...
    MigrationUK閱讀 11,846評論 7 123
  • 【書目】《大思想的神奇》 格局也就是對自我的一個認(rèn)知了袁,這個認(rèn)知在任何一個階段都會有所變化徐勃,當(dāng)你對自身非常了解了...
    魔妖精閱讀 109評論 0 0
  • 曾經(jīng),有人說過早像,當(dāng)你想哭的時候僻肖,一定要仰起頭,因?yàn)橹挥心菢勇校蹨I才不會從眼角滑落臀脏! 也有人說過,當(dāng)你想哭的時候...
    小沐童閱讀 181評論 0 1
  • pdf對比小工具冀自,應(yīng)用場景揉稚,深圳電信測試, 背景:這個客戶寫報告的想法和我們不一樣熬粗,需要看rsrp等分布的變化搀玖,不...
    zhenzhu201706閱讀 175評論 0 0