Android基礎(chǔ)知識(shí)

Android:


五種布局: FrameLayout 、 LinearLayout 、 AbsoluteLayout 、 RelativeLayout 、 TableLayout 全都繼承自ViewGroup,各自特點(diǎn)及繪制效率對(duì)比。

  • FrameLayout(框架布局)

    此布局是五種布局中最簡(jiǎn)單的布局,Android中并沒(méi)有對(duì)child view的擺布進(jìn)行控制,這個(gè)布局中所有的控件都會(huì)默認(rèn)出現(xiàn)在視圖的左上角,我們可以使用android:layout_marginandroid:layout_gravity等屬性去控制子控件相對(duì)布局的位置。

  • LinearLayout(線性布局)

    一行(或一列)只控制一個(gè)控件的線性布局,所以當(dāng)有很多控件需要在一個(gè)界面中列出時(shí),可以用LinearLayout布局。
    此布局有一個(gè)需要格外注意的屬性:android:orientation=“horizontal|vertical

    • 當(dāng)android:orientation="horizontal時(shí),說(shuō)明你希望將水平方向的布局交給LinearLayout* ,其子元素的android:layout_gravity="right|left" 等控制水平方向的gravity值都是被忽略的,此時(shí)LinearLayout中的子元素都是默認(rèn)的按照水平從左向右來(lái)排*,我們可以用android:layout_gravity="top|bottom"等gravity值來(lái)控制垂直展示。
    • 反之,可以知道 當(dāng)android:orientation="vertical時(shí),LinearLayout對(duì)其子元素展示上的的處理方式。
  • AbsoluteLayout(絕對(duì)布局)

    可以放置多個(gè)控件,并且可以自己定義控件的x,y位置

  • RelativeLayout(相對(duì)布局)

    這個(gè)布局也是相對(duì)自由的布局,Android 對(duì)該布局的child view的 水平layout& 垂直layout做了解析,由此我們可以FrameLayout的基礎(chǔ)上使用標(biāo)簽或者Java代碼對(duì)垂直方向 以及 水平方向 布局中的views進(jìn)行任意的控制.

    • 相關(guān)屬性:
    
      android:layout_centerInParent="true|false"
      android:layout_centerHorizontal="true|false"
      android:layout_alignParentRight="true|false"
      
    
  • TableLayout(表格布局)

    將子元素的位置分配到行或列中,一個(gè)TableLayout由許多的TableRow組成


Activity生命周期。

  • 啟動(dòng)Activity:
    onCreate()—>onStart()—>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()

  • 解鎖:onStart()->onResume()

  • 更多流程分支,請(qǐng)參照以下生命周期流程圖



通過(guò)Acitivty的xml標(biāo)簽來(lái)改變?nèi)蝿?wù)棧的默認(rèn)行為

  • 使用android:launchMode="standard|singleInstance|singleTask|singleTop"來(lái)控制Acivity任務(wù)棧。

    任務(wù)棧是一種后進(jìn)先出的結(jié)構(gòu)。位于棧頂?shù)腁ctivity處于焦點(diǎn)狀態(tài),當(dāng)按下back按鈕的時(shí)候,棧內(nèi)的Activity會(huì)一個(gè)一個(gè)的出棧,并且調(diào)用其onDestory()方法。如果棧內(nèi)沒(méi)有Activity,那么系統(tǒng)就會(huì)回收這個(gè)棧,每個(gè)APP默認(rèn)只有一個(gè)棧,以APP的包名來(lái)命名.

    • 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í)行。
    • 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模式一樣.
    • 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)
    • singleInstance : 加強(qiáng)版的singleTask模式,這種模式的Activity只能單獨(dú)位于一個(gè)任務(wù)棧內(nèi),由于棧內(nèi)復(fù)用的特性,后續(xù)請(qǐng)求均不會(huì)創(chuàng)建新的Activity,除非這個(gè)獨(dú)特的任務(wù)棧被系統(tǒng)銷毀了

Activity的堆棧管理以ActivityRecord為單位,所有的ActivityRecord都放在一個(gè)List里面.可以認(rèn)為一個(gè)ActivityRecord就是一個(gè)Activity棧


Activity緩存方法。

有a、b兩個(gè)Activity,當(dāng)從a進(jìn)入b之后一段時(shí)間,可能系統(tǒng)會(huì)把a(bǔ)回收,這時(shí)候按back,執(zhí)行的不是a的onRestart而是onCreate方法,a被重新創(chuàng)建一次,這是a中的臨時(shí)數(shù)據(jù)和狀態(tài)可能就丟失了。

可以用Activity中的onSaveInstanceState()回調(diào)方法保存臨時(shí)數(shù)據(jù)和狀態(tài),這個(gè)方法一定會(huì)在活動(dòng)被回收之前調(diào)用。方法中有一個(gè)Bundle參數(shù),putString()、putInt()等方法需要傳入兩個(gè)參數(shù),一個(gè)鍵一個(gè)值。數(shù)據(jù)保存之后會(huì)在onCreate中恢復(fù),onCreate也有一個(gè)Bundle類型的參數(shù)。

示例代碼:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //這里,當(dāng)Acivity第一次被創(chuàng)建的時(shí)候?yàn)榭?        //所以我們需要判斷一下
        if( savedInstanceState != null ){
            savedInstanceState.getString("anAnt");
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putString("anAnt","Android");

    }

一、onSaveInstanceState (Bundle outState)

當(dāng)某個(gè)activity變得“容易”被系統(tǒng)銷毀時(shí),該activity的onSaveInstanceState就會(huì)被執(zhí)行,除非該activity是被用戶主動(dòng)銷毀的,例如當(dāng)用戶按BACK鍵的時(shí)候。

注意上面的雙引號(hào),何為“容易”?言下之意就是該activity還沒(méi)有被銷毀,而僅僅是一種可能性。這種可能性有哪些?通過(guò)重寫一個(gè)activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我們可以清楚地知道當(dāng)某個(gè)activity(假定為activity A)顯示在當(dāng)前task的最上層時(shí),其onSaveInstanceState方法會(huì)在什么時(shí)候被執(zhí)行,有這么幾種情況:

1、當(dāng)用戶按下HOME鍵時(shí)。

這是顯而易見(jiàn)的,系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序,自然也不知道activity A是否會(huì)被銷毀,故系統(tǒng)會(huì)調(diào)用onSaveInstanceState,讓用戶有機(jī)會(huì)保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則

2、長(zhǎng)按HOME鍵,選擇運(yùn)行其他的程序時(shí)。

3、按下電源按鍵(關(guān)閉屏幕顯示)時(shí)。

4、從activity A中啟動(dòng)一個(gè)新的activity時(shí)。

5、屏幕方向切換時(shí),例如從豎屏切換到橫屏?xí)r。(如果不指定configchange屬性)
在屏幕切換之前,系統(tǒng)會(huì)銷毀activity A,在屏幕切換之后系統(tǒng)又會(huì)自動(dòng)地創(chuàng)建activity A,所以onSaveInstanceState一定會(huì)被執(zhí)行

總而言之,onSaveInstanceState的調(diào)用遵循一個(gè)重要原則,即當(dāng)系統(tǒng)“未經(jīng)你許可”時(shí)銷毀了你的activity,則onSaveInstanceState會(huì)被系統(tǒng)調(diào)用,這是系統(tǒng)的責(zé)任,因?yàn)樗仨氁峁┮粋€(gè)機(jī)會(huì)讓你保存你的數(shù)據(jù)(當(dāng)然你不保存那就隨便你了)。另外,需要注意的幾點(diǎn):

1.布局中的每一個(gè)View默認(rèn)實(shí)現(xiàn)了onSaveInstanceState()方法,這樣的話,這個(gè)UI的任何改變都會(huì)自動(dòng)地存儲(chǔ)和在activity重新創(chuàng)建的時(shí)候自動(dòng)地恢復(fù)。但是這種情況只有在你為這個(gè)UI提供了唯一的ID之后才起作用,如果沒(méi)有提供ID,app將不會(huì)存儲(chǔ)它的狀態(tài)。

2.由于默認(rèn)的onSaveInstanceState()方法的實(shí)現(xiàn)幫助UI存儲(chǔ)它的狀態(tài),所以如果你需要覆蓋這個(gè)方法去存儲(chǔ)額外的狀態(tài)信息,你應(yīng)該在執(zhí)行任何代碼之前都調(diào)用父類的onSaveInstanceState()方法(super.onSaveInstanceState())。
既然有現(xiàn)成的可用,那么我們到底還要不要自己實(shí)現(xiàn)onSaveInstanceState()?這得看情況了,如果你自己的派生類中有變量影響到UI,或你程序的行為,當(dāng)然就要把這個(gè)變量也保存了,那么就需要自己實(shí)現(xiàn),否則就不需要。

3.由于onSaveInstanceState()方法調(diào)用的不確定性,你應(yīng)該只使用這個(gè)方法去記錄activity的瞬間狀態(tài)(UI的狀態(tài))。不應(yīng)該用這個(gè)方法去存儲(chǔ)持久化數(shù)據(jù)。當(dāng)用戶離開(kāi)這個(gè)activity的時(shí)候應(yīng)該在onPause()方法中存儲(chǔ)持久化數(shù)據(jù)(例如應(yīng)該被存儲(chǔ)到數(shù)據(jù)庫(kù)中的數(shù)據(jù))。

4.onSaveInstanceState()如果被調(diào)用,這個(gè)方法會(huì)在onStop()前被觸發(fā),但系統(tǒng)并不保證是否在onPause()之前或者之后觸發(fā)。

二、onRestoreInstanceState (Bundle outState)

至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對(duì)的被調(diào)用的,(本人注:我昨晚調(diào)試時(shí)就發(fā)現(xiàn)原來(lái)不一定成對(duì)被調(diào)用的!)

onRestoreInstanceState被調(diào)用的前提是,activity A“確實(shí)”被系統(tǒng)銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會(huì)被調(diào)用,例如,當(dāng)正在顯示activity A的時(shí)候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到activity A,這種情況下activity A一般不會(huì)因?yàn)閮?nèi)存的原因被系統(tǒng)銷毀,故activity A的onRestoreInstanceState方法不會(huì)被執(zhí)行

另外,onRestoreInstanceState的bundle參數(shù)也會(huì)傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數(shù)據(jù)還原。
還有onRestoreInstanceState在onstart之后執(zhí)行。
至于這兩個(gè)函數(shù)的使用,給出示范代碼(留意自定義代碼在調(diào)用super的前或后):

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
        savedInstanceState.putBoolean("MyBoolean", true);
        savedInstanceState.putDouble("myDouble", 1.9);
        savedInstanceState.putInt("MyInt", 1);
        savedInstanceState.putString("MyString", "Welcome back to Android");
        // etc.
        super.onSaveInstanceState(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
        double myDouble = savedInstanceState.getDouble("myDouble");
        int myInt = savedInstanceState.getInt("MyInt");
        String myString = savedInstanceState.getString("MyString");
}


Fragment的生命周期和activity如何的一個(gè)關(guān)系

這我們引用本知識(shí)庫(kù)里的一張圖片:


Mou icon
Mou icon

為什么在Service中創(chuàng)建子線程而不是Activity中

這是因?yàn)锳ctivity很難對(duì)Thread進(jìn)行控制,當(dāng)Activity被銷毀之后,就沒(méi)有任何其它的辦法可以再重新獲取到之前創(chuàng)建的子線程的實(shí)例。而且在一個(gè)Activity中創(chuàng)建的子線程,另一個(gè)Activity無(wú)法對(duì)其進(jìn)行操作。但是Service就不同了,所有的Activity都可以與Service進(jìn)行關(guān)聯(lián),然后可以很方便地操作其中的方法,即使Activity被銷毀了,之后只要重新與Service建立關(guān)聯(lián),就又能夠獲取到原有的Service中Binder的實(shí)例。因此,使用Service來(lái)處理后臺(tái)任務(wù),Activity就可以放心地finish,完全不需要擔(dān)心無(wú)法對(duì)后臺(tái)任務(wù)進(jìn)行控制的情況。

Intent的使用方法,可以傳遞哪些數(shù)據(jù)類型。

通過(guò)查詢Intent/Bundle的API文檔,我們可以獲知,Intent/Bundle支持傳遞基本類型的數(shù)據(jù)和基本類型的數(shù)組數(shù)據(jù),以及String/CharSequence類型的數(shù)據(jù)和String/CharSequence類型的數(shù)組數(shù)據(jù)。而對(duì)于其它類型的數(shù)據(jù)貌似無(wú)能為力,其實(shí)不然,我們可以在Intent/Bundle的API中看到Intent/Bundle還可以傳遞Parcelable(包裹化,郵包)和Serializable(序列化)類型的數(shù)據(jù),以及它們的數(shù)組/列表數(shù)據(jù)。

所以要讓非基本類型和非String/CharSequence類型的數(shù)據(jù)通過(guò)Intent/Bundle來(lái)進(jìn)行傳輸,我們就需要在數(shù)據(jù)類型中實(shí)現(xiàn)Parcelable接口或是Serializable接口。

http://blog.csdn.net/kkk0526/article/details/7214247

Fragment生命周期

注意和Activity的相比的區(qū)別,按照?qǐng)?zhí)行順序

  • onAttach(),onDetach()
  • onCreateView(),onDestroyView()

Service的兩種啟動(dòng)方法,有什么區(qū)別
1.在Context中通過(guò)public boolean bindService(Intent service,ServiceConnection conn,int flags) 方法來(lái)進(jìn)行Service與Context的關(guān)聯(lián)并啟動(dòng),并且Service的生命周期依附于Context(不求同時(shí)同分同秒生!但求同時(shí)同分同秒屎!!)。

2.通過(guò)public ComponentName startService(Intent service)方法去啟動(dòng)一個(gè)Service,此時(shí)Service的生命周期與啟動(dòng)它的Context無(wú)關(guān)。

3.要注意的是,whatever,都需要在xml里注冊(cè)你的Service,就像這樣:

<service
        android:name=".packnameName.youServiceName"
        android:enabled="true" />

廣播(Broadcast Receiver)的兩種動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)有什么區(qū)別。

  • 靜態(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退出后,也就沒(méi)辦法再接受廣播了

ContentProvider使用方法

http://blog.csdn.net/juetion/article/details/17481039


目前能否保證service不被殺死

Service設(shè)置成START_STICKY

  • kill 后會(huì)被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣

提升service優(yōu)先級(jí)

  • 在AndroidManifest.xml文件中對(duì)于intent-filter可以通過(guò)android:priority = "1000"這個(gè)屬性設(shè)置最高優(yōu)先級(jí),1000是最高值,如果數(shù)字越小則優(yōu)先級(jí)越低,同時(shí)適用于廣播
  • 【結(jié)論】目前看來(lái),priority這個(gè)屬性貌似只適用于broadcast,對(duì)于Service來(lái)說(shuō)可能無(wú)效

提升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

  • 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)不來(lái),所以還是無(wú)法保證

監(jiān)聽(tīng)系統(tǒng)廣播判斷Service狀態(tài)

  • 通過(guò)系統(tǒng)的一些廣播,比如:手機(jī)重啟、界面喚醒、應(yīng)用狀態(tài)改變等等監(jiān)聽(tīng)并捕獲到,然后判斷我們的Service是否還存活,別忘記加權(quán)限
  • 【結(jié)論】這也能算是一種措施,不過(guò)感覺(jué)監(jiān)聽(tīng)多了會(huì)導(dǎo)致Service很混亂,帶來(lái)諸多不便

在JNI層,用C代碼fork一個(gè)進(jìn)程出來(lái)

  • 這樣產(chǎn)生的進(jìn)程,會(huì)被系統(tǒng)認(rèn)為是兩個(gè)不同的進(jìn)程.但是Android5.0之后可能不行

root之后放到system/app變成系統(tǒng)級(jí)應(yīng)用

大招: 放一個(gè)像素在前臺(tái)(手機(jī)QQ)


動(dòng)畫有哪兩類,各有什么特點(diǎn)?三種動(dòng)畫的區(qū)別

  • tween 補(bǔ)間動(dòng)畫。通過(guò)指定View的初末狀態(tài)和變化時(shí)間、方式,對(duì)View的內(nèi)容完成一系列的圖形變換來(lái)實(shí)現(xiàn)動(dòng)畫效果。
    Alpha
    Scale
    Translate
    Rotate。

  • frame 幀動(dòng)畫
    AnimationDrawable 控制
    animation-list xml布局

  • PropertyAnimation 屬性動(dòng)畫


Android的數(shù)據(jù)存儲(chǔ)形式。

  • SQLite:SQLite是一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù),支持基本的SQL語(yǔ)法,是常被采用的一種數(shù)據(jù)存儲(chǔ)方式。
    Android為此數(shù)據(jù)庫(kù)提供了一個(gè)名為SQLiteDatabase的類,封裝了一些操作數(shù)據(jù)庫(kù)的api

  • SharedPreference: 除SQLite數(shù)據(jù)庫(kù)外,另一種常用的數(shù)據(jù)存儲(chǔ)方式,其本質(zhì)就是一個(gè)xml文件,常用于存儲(chǔ)較簡(jiǎn)單的參數(shù)設(shè)置。

  • File: 即常說(shuō)的文件(I/O)存儲(chǔ)方法,常用語(yǔ)存儲(chǔ)大數(shù)量的數(shù)據(jù),但是缺點(diǎn)是更新數(shù)據(jù)將是一件困難的事情。

  • 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)用程序就通過(guò)Content Provider傳入這個(gè)URI來(lái)對(duì)數(shù)據(jù)進(jìn)行操作。


Sqlite的基本操作。

http://blog.csdn.net/zgljl2012/article/details/44769043


如何判斷應(yīng)用被強(qiáng)殺

在Application中定義一個(gè)static常量,賦值為-1,在歡迎界面改為0,如果被強(qiáng)殺,application重新初始化,在父類Activity判斷該常量的值。

應(yīng)用被強(qiáng)殺如何解決

如果在每一個(gè)Activity的onCreate里判斷是否被強(qiáng)殺,冗余了,封裝到Activity的父類中,如果被強(qiáng)殺,跳轉(zhuǎn)回主界面,如果沒(méi)有被強(qiáng)殺,執(zhí)行Activity的初始化操作,給主界面?zhèn)鬟fintent參數(shù),主界面會(huì)調(diào)用onNewIntent方法,在onNewIntent跳轉(zhuǎn)到歡迎頁(yè)面,重新來(lái)一遍流程。

Json有什么優(yōu)劣勢(shì)。

怎樣退出終止App

Asset目錄與res目錄的區(qū)別。
res 目錄下面有很多文件,例如 drawable,mipmap,raw 等。res 下面除了 raw 文件不會(huì)被壓縮外,其余文件都會(huì)被壓縮。同時(shí) res目錄下的文件可以通過(guò)R 文件訪問(wèn)。Asset 也是用來(lái)存儲(chǔ)資源,但是 asset 文件內(nèi)容只能通過(guò)路徑或者 AssetManager 讀取。 官方文檔

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 的 onResume 方法必須等待 A 的 onPause 執(zhí)行完成后才能運(yùn)行

Android內(nèi)存優(yōu)化方法:ListView優(yōu)化,及時(shí)關(guān)閉資源,圖片緩存等等。

Android中弱引用與軟引用的應(yīng)用場(chǎng)景。

Bitmap的四種屬性,與每種屬性隊(duì)形的大小。

View與View Group分類。自定義View過(guò)程:onMeasure()、onLayout()、onDraw()。

如何自定義控件:

  1. 自定義屬性的聲明和獲取

    • 分析需要的自定義屬性
    • 在res/values/attrs.xml定義聲明
    • 在layout文件中進(jìn)行使用
    • 在View的構(gòu)造方法中進(jìn)行獲取
  2. 測(cè)量onMeasure

  3. 布局onLayout(ViewGroup)

  4. 繪制onDraw

  5. onTouchEvent

  6. onInterceptTouchEvent(ViewGroup)

  7. 狀態(tài)的恢復(fù)與保存

Android長(zhǎng)連接,怎么處理心跳機(jī)制。


View樹(shù)繪制流程


下拉刷新實(shí)現(xiàn)原理


你用過(guò)什么框架,是否看過(guò)源碼,是否知道底層原理。

Retrofit

EventBus

glide


Android5.0、6.0新特性。

Android5.0新特性:

  • MaterialDesign設(shè)計(jì)風(fēng)格
  • 支持多種設(shè)備
  • 支持64位ART虛擬機(jī)

Android6.0新特性

  • 大量漂亮流暢的動(dòng)畫
  • 支持快速充電的切換
  • 支持文件夾拖拽應(yīng)用
  • 相機(jī)新增專業(yè)模式

Android7.0新特性

  • 分屏多任務(wù)
  • 增強(qiáng)的Java8語(yǔ)言模式
  • 夜間模式

Context區(qū)別

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

IntentService的使用場(chǎng)景與特點(diǎn)。

IntentService是Service的子類,是一個(gè)異步的,會(huì)自動(dòng)停止的服務(wù),很好解決了傳統(tǒng)的Service中處理完耗時(shí)操作忘記停止并銷毀Service的問(wèn)題

優(yōu)點(diǎn):

  • 一方面不需要自己去new Thread
  • 另一方面不需要考慮在什么時(shí)候關(guān)閉該Service

onStartCommand中回調(diào)了onStart,onStart中通過(guò)mServiceHandler發(fā)送消息到該handler的handleMessage中去。最后handleMessage中回調(diào)onHandleIntent(intent)。


圖片緩存

查看每個(gè)應(yīng)用程序最高可用內(nèi)存:

    int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);  
    Log.d("TAG", "Max memory is " + maxMemory + "KB");  

Gradle

構(gòu)建工具、Groovy語(yǔ)法、Java

Jar包里面只有代碼,aar里面不光有代碼還包括代碼還包括資源文件,比如 drawable 文件,xml 資源文件。對(duì)于一些不常變動(dòng)的 Android Library,我們可以直接引用 aar,加快編譯速度


你是如何自學(xué)Android

首先是看書(shū)和看視頻敲代碼,然后看大牛的博客,做一些項(xiàng)目,向github提交代碼,覺(jué)得自己API掌握的不錯(cuò)之后,開(kāi)始看進(jìn)階的書(shū),以及看源碼,看完源碼學(xué)習(xí)到一些思想,開(kāi)始自己造輪子,開(kāi)始想代碼的提升,比如設(shè)計(jì)模式,架構(gòu),重構(gòu)等。


也歡迎關(guān)注我的CSDNgithub主頁(yè)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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