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

原文地址 點(diǎn)擊查看

五種布局: FrameLayout 褪迟、 LinearLayout 厕妖、 AbsoluteLayout 塘偎、 RelativeLayout 胃碾、 TableLayout 全都繼承自ViewGroup,各自特點(diǎn)及繪制效率對(duì)比脐帝。

  • FrameLayout(框架布局)

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

  • LinearLayout(線性布局)

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

 當(dāng)`android:orientation="horizontal`時(shí),說明你希望將水平方向的布局交給LinearLayout届垫,其子
元素的`android:layout_gravity="right|left"` 等控制水平方向的gravity值都是被忽略的释液,此時(shí)
LinearLayout中的子元素都是默認(rèn)的按照水平從左向右來排,我們可以用
`android:layout_gravity="top|bottom"`等gravity值來控制垂直展示装处。
反之误债,可以知道 當(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)參照以下生命周期流程圖


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

  • 使用android:launchMode="standard|singleInstance|singleTask|singleTop"來控制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)沒有Activity,那么系統(tǒng)就會(huì)回收這個(gè)棧,每個(gè)APP默認(rèn)只有一個(gè)棧,以APP的包名來命名.

    • 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還沒有被銷毀扁远,而僅僅是一種可能性俊鱼。這種可能性有哪些?通過重寫一個(gè)activity的所有生命周期的onXXX方法畅买,包括onSaveInstanceState和onRestoreInstanceState方法并闲,我們可以清楚地知道當(dāng)某個(gè)activity(假定為activity A)顯示在當(dāng)前task的最上層時(shí),其onSaveInstanceState方法會(huì)在什么時(shí)候被執(zhí)行谷羞,有這么幾種情況:

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

這是顯而易見的,系統(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之后才起作用逗概,如果沒有提供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)用戶離開這個(gè)activity的時(shí)候應(yīng)該在onPause()方法中存儲(chǔ)持久化數(shù)據(jù)(例如應(yīng)該被存儲(chǔ)到數(shù)據(jù)庫中的數(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)原來不一定成對(duì)被調(diào)用的K婢病)

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í)庫里的一張圖片: [圖片上傳失敗...(image-79d7ba-1527675050682)]

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

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

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

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

所以要讓非基本類型和非String/CharSequence類型的數(shù)據(jù)通過Intent/Bundle來進(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中通過public boolean bindService(Intent service,ServiceConnection conn,int flags) 方法來進(jìn)行Service與Context的關(guān)聯(lián)并啟動(dòng)瞬场,并且Service的生命周期依附于Context(不求同時(shí)同分同秒生!但求同時(shí)同分同秒屎=Ы肌贯被!)。

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)的兩種動(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退出后逗物,也就沒辦法再接受廣播了

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可以通過android:priority = "1000"這個(gè)屬性設(shè)置最高優(yōu)先級(jí)翎卓,1000是最高值,如果數(shù)字越小則優(yōu)先級(jí)越低摆寄,同時(shí)適用于廣播失暴。
  • 【結(jié)論】目前看來坯门,priority這個(gè)屬性貌似只適用于broadcast,對(duì)于Service來說可能無效

提升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)不來衍慎,所以還是無法保證

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

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

在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)用

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


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

  • tween 補(bǔ)間動(dòng)畫侧纯。通過指定View的初末狀態(tài)和變化時(shí)間、方式甲脏,對(duì)View的內(nè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ù)庫娜氏,支持基本的SQL語法,是常被采用的一種數(shù)據(jù)存儲(chǔ)方式墩新。 Android為此數(shù)據(jù)庫提供了一個(gè)名為SQLiteDatabase的類贸弥,封裝了一些操作數(shù)據(jù)庫的api

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

  • File: 即常說的文件(I/O)存儲(chǔ)方法,常用語存儲(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)用程序就通過Content Provider傳入這個(gè)URI來對(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)回主界面榴捡,如果沒有被強(qiáng)殺,執(zhí)行Activity的初始化操作朱浴,給主界面?zhèn)鬟fintent參數(shù)吊圾,主界面會(huì)調(diào)用onNewIntent方法,在onNewIntent跳轉(zhuǎn)到歡迎頁面赊琳,重新來一遍流程街夭。

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

怎樣退出終止App

Asset目錄與res目錄的區(qū)別躏筏。 res 目錄下面有很多文件,例如 drawable,mipmap,raw 等呈枉。res 下面除了 raw 文件不會(huì)被壓縮外趁尼,其余文件都會(huì)被壓縮埃碱。同時(shí) res目錄下的文件可以通過R 文件訪問。Asset 也是用來存儲(chǔ)資源酥泞,但是 asset 文件內(nèi)容只能通過路徑或者 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過程: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í)現(xiàn)原理


你用過什么框架倒慧,是否看過源碼,是否知道底層原理包券。

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語言模式
  • 夜間模式

Context區(qū)別

  • Activity和Service以及Application的Context是不一樣的,Activity繼承自ContextThemeWraper.其他的繼承自ContextWrapper
  • 每一個(gè)Activity和Service以及Application的Context都是一個(gè)新的ContextImpl對(duì)象
  • getApplication()用來獲取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成員都來自于唯一的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的問題

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

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

onStartCommand中回調(diào)了onStart,onStart中通過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語法酒请、Java

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


你是如何自學(xué)Android

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市待秃,隨后出現(xiàn)的幾起案子拜秧,更是在濱河造成了極大的恐慌,老刑警劉巖章郁,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枉氮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嘲恍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雄驹,“玉大人佃牛,你說我怎么就攤上這事∫接撸” “怎么了俘侠?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蔬将。 經(jīng)常有香客問我爷速,道長(zhǎng),這世上最難降的妖魔是什么霞怀? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任惫东,我火速辦了婚禮,結(jié)果婚禮上毙石,老公的妹妹穿的比我還像新娘廉沮。我一直安慰自己,他們只是感情好徐矩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布滞时。 她就那樣靜靜地躺著,像睡著了一般滤灯。 火紅的嫁衣襯著肌膚如雪坪稽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天鳞骤,我揣著相機(jī)與錄音窒百,去河邊找鬼。 笑死豫尽,一個(gè)胖子當(dāng)著我的面吹牛贝咙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拂募,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庭猩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了陈症?” 一聲冷哼從身側(cè)響起蔼水,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎录肯,沒想到半個(gè)月后趴腋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年优炬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颁井。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蠢护,死狀恐怖雅宾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葵硕,我是刑警寧澤眉抬,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站懈凹,受9級(jí)特大地震影響蜀变,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜介评,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一库北、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧们陆,春花似錦贤惯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烟很,卻和暖如春颈墅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雾袱。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工恤筛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芹橡。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓毒坛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親林说。 傳聞我的和親對(duì)象是個(gè)殘疾皇子煎殷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355