精品丰满熟女一区二区三区_五月天亚洲欧美综合网_亚洲青青青在线观看_国产一区二区精选

  • <menu id="29e66"></menu>

    <bdo id="29e66"><mark id="29e66"><legend id="29e66"></legend></mark></bdo>

  • <pre id="29e66"><tt id="29e66"><rt id="29e66"></rt></tt></pre>

      <label id="29e66"></label><address id="29e66"><mark id="29e66"><strike id="29e66"></strike></mark></address>
      學(xué)習啦 > 創(chuàng)業(yè)指南 > 職場 > 筆試題 > android面試題及答案

      android面試題及答案

      時間: 護托1061 分享

      android面試題及答案

        怎樣修改Android.mk文件,下面就由學(xué)習啦小編為大家介紹一下的android面試題-簡答題文章,歡迎閱讀。

        android面試題-簡答題篇1

        1、在多線程編程這塊,我們經(jīng)常要使用Handler,Thread和Runnable這三個類,那么他們之間的關(guān)系你是否弄清楚了呢?

        答:Android的CPU分配的最小單元是線程,Handler一般是在某個線程里創(chuàng)建的,因而Handler和Thread就是相互綁定的,一一對應(yīng)。而Runnable是一個接口,Thread是Runnable的子類。所以說,他倆都算一個進程。HandlerThread顧名思義就是可以處理消息循環(huán)的線程,他是一個擁有Looper的線程,可以處理消息循環(huán)。與其說Handler和一個線程綁定,不如說Handler是和Looper一一對應(yīng)的。最后需要說明的是,在UI線程(主線程)中: mHandler=new Handler();

        mHandler.post(new Runnable(){

        void run(){

        //執(zhí)行代碼...}

        });

        這個線程其實是在UI線程之內(nèi)運行的,并沒有新建線程。

        常見的新建線程的方法是:

        Thread thread = new Thread();

        thread.start();

        HandlerThread thread = newHandlerThread("string");

        thread.start();

        2、如何設(shè)定應(yīng)用程序為系統(tǒng)級別的應(yīng)用?

        答:apk 獲取system權(quán)限;如何獲取如下:

        第一個方法簡單點,不過需要在Android系統(tǒng)源碼的環(huán)境下用make來編譯:

        1. 在應(yīng)用程序的AndroidManifest.xml中的manifest節(jié)點中加入android:sharedUserId="android.uid.system"這個屬性。

        2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行

        3. 使用mm命令來編譯,生成的apk就有修改系統(tǒng)時間的權(quán)限了。

        第二個方法是直接把eclipse編出來的apk用系統(tǒng)的簽名文件簽名

        1. 加入android:sharedUserId="android.uid.system"這個屬性。

        2. 使用eclipse編譯出apk文件。

        3. 使用目標系統(tǒng)的platform密鑰來重新給apk文件簽名。首先找到密鑰文件,在我ndroid源碼目錄中的位置是"build/target/product/security",下面的platform.pk8和platform.x509.pem兩個文件。然后用Android提供的Signapk工具來簽名,signapk的源代碼是在"build/tools/signapk"下,編譯后在out/host/Linux-x86/framework下,用法為Java -jarsignapk.jar platform.x509.pem platform.pk8 input.apk output.apk"。

        加入android:sharedUserId="android.uid.system"這個屬性。通過Shared User id,擁有同一個User id的多個APK可以配置成運行在同一個進程中。那么把程序的UID配成android.uid.system,也就是要讓程序運行在系統(tǒng)進程中,這樣就有權(quán)限來修改系統(tǒng)時間了。

        只是加入UID還不夠,如果這時候安裝APK的話發(fā)現(xiàn)無法安裝,提示簽名不符,原因是程序想要運行在系統(tǒng)進程中還要有目標系統(tǒng)的platform key,就是上面第二個方法提到的platform.pk8和platform.x509.pem兩個文件。用這兩個key簽名后apk才真正可以放入系統(tǒng)進程中。第一個方法中加入LOCAL_CERTIFICATE :=platform其實就是用這兩個key來簽名。

        這也有一個問題,就是這樣生成的程序只有在原始的Android系統(tǒng)或者是自己編譯的系統(tǒng)中才可以用,因為這樣的系統(tǒng)才可以拿到platform.pk8和platform.x509.pem兩個文件。要是別家公司做的Android上連安裝都安裝不了。試試原始的Android中的key來簽名,程序在模擬器上運行OK,不過放到G3上安裝直接提示"Package... has no signatures that match those in shared user android.uid.system",這樣也是保護了系統(tǒng)的安全。

        3、談?wù)凙ndroid的IPC(進程間通信)機制

        答:Android系統(tǒng)中,每一個應(yīng)用程序都是由一些Activity和Service組成的,這些Activity和Service有可能運行在同一個進程中,也有可能運行在不同的進程中,android的IPC機制也就是Binder機制,Android系統(tǒng)是基于Linux內(nèi)核的,而Linux內(nèi)核繼承和兼容了豐富的Unix系統(tǒng)進程間通信(IPC)機制, 但是,Android系統(tǒng)沒有采用上述提到的各種進程間通信機制,而是采用Binder機制,Binder是一種進程間通信機制,它是一種類似于COM和CORBA分布式組件架構(gòu),通俗一點,其實是提供遠程過程調(diào)用(RPC)功能。從英文字面上意思看,Binder具有粘結(jié)劑的意思,那么它把什么東西粘結(jié)在一起呢?在Android系統(tǒng)的Binder機制中,由一系統(tǒng)組件組成,分別是Client、Server、Service Manager和Binder驅(qū)動程序,其中Client、Server和Service Manager運行在用戶空間,Binder驅(qū)動程序運行內(nèi)核空間。Binder就是一種把這四個組件粘合在一起的粘結(jié)劑了,其中,核心組件便是Binder驅(qū)動程序了,Service Manager提供了輔助管理的功能,Client和Server正是在Binder驅(qū)動和ServiceManager提供的基礎(chǔ)設(shè)施上,進行Client-Server之間的通信;

        1. Client、Server和Service Manager實現(xiàn)在用戶空間中,Binder驅(qū)動程序?qū)崿F(xiàn)在內(nèi)核空間中

        2. Binder驅(qū)動程序和Service Manager在Android平臺中已經(jīng)實現(xiàn),開發(fā)者只需要在用戶空間實現(xiàn)自己的Client和Server

        3.Binder驅(qū)動程序提供設(shè)備文件/dev/binder與用戶空間交互,Client、Server和Service Manager通過open和ioctl文件操作函數(shù)與Binder驅(qū)動程序進行通信

        4. Client和Server之間的進程間通信通過Binder驅(qū)動程序間接實現(xiàn)

        5. Service Manager是一個守護進程,用來管理Server,并向Client提供查詢Server接口的能力

        4、apk安裝卸載的原理

        答:APK安裝可以通過以下四種方式:

        1. 系統(tǒng)應(yīng)用安裝,開機時完成系統(tǒng)應(yīng)用的檢查,沒安裝就安裝,安裝就跳過,無安裝界面。

        2. 網(wǎng)絡(luò)下載應(yīng)用安裝,通過market應(yīng)用完成,無安裝界面。

        3. ADB工具安裝,無安裝界面

        4. 通過SD卡來安裝apk,有安裝界面,由packageinstaller.apk應(yīng)用處理安裝及卸載過程的界面。

        應(yīng)用安裝涉及到如下幾個目錄:

        system/app 系統(tǒng)自帶的應(yīng)用程序,無法刪除

        data/app 用戶程序安裝的目錄,有刪除權(quán)限

        data/data 存放應(yīng)用程序的數(shù)據(jù)

        Data/dalvik-cache 將apk中的dex文件安裝到dalvik-cache目錄下

        (dex文件是dalvik虛擬機的可執(zhí)行文件,其大小約為原始apk文件大小的四分之一)

        安裝過程:復(fù)制APK安裝包到data/app目錄下,解壓并掃描安裝包,把dex文件(Dalvik字節(jié)碼)保存到dalvik-cache目錄,并data/data目錄下創(chuàng)建對應(yīng)的應(yīng)用數(shù)據(jù)目錄。

        卸載過程:刪除安裝過程中在上述三個目錄下創(chuàng)建的文件及目錄。

        5、如何做適配

        1)android有H、L、M、X、XX四個不同的文件夾存放不同分辨率的圖片,系統(tǒng)會自動加載

        2) 偏移量d的設(shè)置可以在values-hpdi,values-mdpi,values-ldpi三種文件夾中的dimens.xml文件進行設(shè)置

        值得一提的是:

        40dp

        -14dp

        這里的負數(shù)是完全起作用的,系統(tǒng)會認為它是一個負值

        3)各大手機廠商對于Android操作系統(tǒng)都有或多或少的改動,當然這些改動會對我們應(yīng)用程序產(chǎn)生某些影響

        比如:

        (1)系統(tǒng)源代碼中連接music服務(wù)的aidl文件所在包名:com.android.music

        (2)LG則可能將該aidl文件修改所在的包(例如修改為 com.android.music.player),并且修改其中的文件內(nèi)容(增加一個方法,或者減少幾個方法,或者修改方法名稱)那么我們的應(yīng)用要想在LG的手機上發(fā)布,那么我們就必須改變所要連接的aidl文件,必須跟LG廠商修改的完全一致。

        android面試題-簡答題篇2

        1、是否進行過apk反編譯,如何防止反編譯

        反編譯:

        Android反編譯工具

        · dex2jar + jdgui

        · apktool

        防止反編譯:

        · 代碼加密

        這方式,也只能想想,一旦你自己加密了,Android系統(tǒng)都不認識你了,還怎么運行?(如果有那估計就是eoe現(xiàn)在推的愛加密吧).

        · 代碼混淆

        這種方式,其實我不大愿意將他歸類于防止反編譯,從Android、Java編譯原理上來說,針對自身代碼做混淆等操作,必然防止不了反編譯這個事實。他能做到的就是將字符,函數(shù)等混淆成各種a,b,c,d,1,2,3等。

        這種方式一般稱為,

        妨礙對反編譯代碼的閱讀、觀看和理解

        Android中主要是針對 proguard.cfg 的配置來實現(xiàn)。

        具體的實現(xiàn)網(wǎng)上針對這部分的解釋已經(jīng)太多,所以這里不詳細介紹了。

        · 動態(tài)加載類

        這種方式的啟發(fā)是根據(jù)web端來的。Web端你要防止,那就不發(fā)布唄。

        所以我們可以將我們重要的源碼,丟在服務(wù)器上,必要的時候通過DexClassLoader類去加載重要類。來防止核心代碼被反編譯。

        具體可看DexClassLoader示例

        · 用NDK開發(fā)核心代碼

        從上面已經(jīng)能知道,C/C++等編譯型語言的反匯編難度。所以我們可以放心的使用NDK去開發(fā),生成SO庫文件再來調(diào)用。

        PS:部分資源文件若十分珍貴,可以通過 #include直接編譯到庫里(當然內(nèi)存可能就大了),這種方式可以自己考慮。

        2、Android的動畫分類以及兩種動畫的闡述

        Tween動畫

        又稱“補間動畫”、“中間動畫”,最早接觸Tween類是在學(xué)習Flash時候,使用ActionScript做動畫的時候,使用過類Tween。

        Tween動畫主要的功能是在繪制動畫前設(shè)置動畫繪制的軌跡,包括時間, 位置 ,等等。但是Tween動畫的缺點是它只能設(shè)置起始點與結(jié)束點的兩幀,中間過程全部由系統(tǒng)幫我們完成。所以在幀數(shù)比較多的游戲開發(fā)中是不太會用到它的。

        Tween一共提供了4中動畫的效果

        Scale:縮放動畫

        Rotate:旋轉(zhuǎn)動畫

        Translate:移動動畫

        Alpha::透明漸變動畫

        Frame動畫

        又稱幀動畫,主要顯示方式是為動畫的總標簽,這里面放著幀動畫標簽,也就是說若干標簽的幀 組合在一起就是幀動畫了。 標簽中android:oneshot="false"這是一個非常重要的屬性,默認為false 表示 動畫循環(huán)播放, 如果這里寫true 則表示動畫只播發(fā)一次。 標簽中記錄著每一幀的信息android:drawable="@drawable/a"表示這一幀用的圖片為"a",下面以此類推。 android:duration="100" 表示這一幀持續(xù)100毫秒,可以根據(jù)這個值來調(diào)節(jié)動畫播放的速度。

        3、AIDL全稱,如何工作,可處理那些數(shù)據(jù)

        答:AIDL的英文全稱是Android Interface Define Language

        當A進程要去調(diào)用B進程中的service時,并實現(xiàn)通信,我們通常都是通過AIDL來操作的

        A工程:

        首先我們在net.blogjava.mobile.aidlservice包中創(chuàng)建一個RemoteService.aidl文件,在里面我們自定義一個接口,含有方法get。ADT插件會在gen目錄下自動生成一個RemoteService.java文件,該類中含有一個名為RemoteService.stub的內(nèi)部類,該內(nèi)部類中含有aidl文件接口的get方法。

        說明一:aidl文件的位置不固定,可以任意

        然后定義自己的MyService類,在MyService類中自定義一個內(nèi)部類去繼承RemoteService.stub這個內(nèi)部類,實現(xiàn)get方法。在onBind方法中返回這個內(nèi)部類的對象,系統(tǒng)會自動將這個對象封裝成IBinder對象,傳遞給他的調(diào)用者。

        其次需要在AndroidManifest.xml文件中配置MyService類,代碼如下:

        為什么要指定調(diào)用AIDL服務(wù)的ID,就是要告訴外界MyService這個類能夠被別的進程訪問,只要別的進程知道這個ID,正是有了這個ID,B工程才能找到A工程實現(xiàn)通信。

        說明:AIDL并不需要權(quán)限

        B工程:

        首先我們要將A工程中生成的RemoteService.java文件拷貝到B工程中,在bindService方法中綁定aidl服務(wù)

        綁定AIDL服務(wù)就是將RemoteService的ID作為intent的action參數(shù)。

        說明:如果我們單獨將RemoteService.aidl文件放在一個包里,那個在我們將gen目錄下的該包拷貝到B工程中。如果我們將RemoteService.aidl文件和我們的其他類存放在一起,那么我們在B工程中就要建立相應(yīng)的包,以保證RmoteService.java文件的報名正確,我們不能修改RemoteService.java文件

        bindService(newInten("net.blogjava.mobile.aidlservice.RemoteService"),serviceConnection,Context.BIND_AUTO_CREATE);

        ServiceConnection的onServiceConnected(ComponentName name, IBinderservice)方法中的service參數(shù)就是A工程中MyService類中繼承了RemoteService.stub類的內(nèi)部類的對象。

        4、Android系統(tǒng)中GC什么情況下不會出現(xiàn)內(nèi)存泄露

        1. 數(shù)據(jù)庫的cursor沒有關(guān)閉

        2.構(gòu)造adapter時,沒有使用緩存contentview

        衍生listview的優(yōu)化問題-----減少創(chuàng)建view的對象,充分使用contentview,可以使用一靜態(tài)類來優(yōu)化處理getview的過程/

        3.Bitmap對象不使用時采用recycle()釋放內(nèi)存

        4.activity中的對象的生命周期大于activity

        調(diào)試方法: DDMS==> HEAPSZIE==>dataobject==>[TotalSize]

        5、什么情況會導(dǎo)致Force Close ?如何避免?能否捕獲導(dǎo)致其的異常?

        答:一般像空指針啊,可以看起logcat,然后對應(yīng)到程序中 來解決錯誤

        android面試題-簡答題篇3

        1、activity的4種模式,以及不同模式的作用。activity有四種啟動模式,分別為standard,singleTop,singleTask,singleInstance。如果要使用這四種啟動模式,必須在manifest文件中標簽中的launchMode屬性中配置,如:

        android:label="@string/interstitial_label"

        android:theme="@style/Theme.Dialog"

        android:launchMode="singleTask"

        standard

        標準啟動模式,也是activity的默認啟動模式。在這種模式下啟動的activity可以被多次實例化,即在同一個任務(wù)中可以存在多個activity的實例,每個實例都會處理一個Intent對象。如果Activity A的啟動模式為standard,并且A已經(jīng)啟動,在A中再次啟動Activity A,即調(diào)用startActivity(new Intent(this,A.class)),會在A的上面再次啟動一個A的實例,即當前的桟中的狀態(tài)為A-->A。

        singleTop

        如果一個以singleTop模式啟動的activity的實例已經(jīng)存在于任務(wù)桟的桟頂,那么再啟動這個Activity時,不會創(chuàng)建新的實例,而是重用位于棧頂?shù)哪莻€實例,并且會調(diào)用該實例的onNewIntent()方法將Intent對象傳遞到這個實例中。舉例來說,如果A的啟動模式為singleTop,并且A的一個實例已經(jīng)存在于棧頂中,那么再調(diào)用startActivity(new Intent(this,A.class))啟動A時,不會再次創(chuàng)建A的實例,而是重用原來的實例,并且調(diào)用原來實例的onNewIntent()方法。這是任務(wù)桟中還是這有一個A的實例。

        如果以singleTop模式啟動的activity的一個實例已經(jīng)存在與任務(wù)桟中,但是不在桟頂,那么它的行為和standard模式相同,也會創(chuàng)建多個實例。

        singleTask

        谷歌的官方文檔上稱,如果一個activity的啟動模式為singleTask,那么系統(tǒng)總會在一個新任務(wù)的最底部(root)啟動這個activity,并且被這個activity啟動的其他activity會和該activity同時存在于這個新任務(wù)中。如果系統(tǒng)中已經(jīng)存在這樣的一個activity則會重用這個實例,并且調(diào)用他的onNewIntent()方法。即,這樣的一個activity在系統(tǒng)中只會存在一個實例。

        其實官方文檔中的這種說法并不準確,啟動模式為singleTask的activity并不會總是開啟一個新的任務(wù)。詳情請參考 解開Android應(yīng)用程序組件Activity的"singleTask"之謎,在本文后面也會通過示例來進行驗證。

        singleInstance

        總是在新的任務(wù)中開啟,并且這個新的任務(wù)中有且只有這一個實例,也就是說被該實例啟動的其他activity會自動運行于另一個任務(wù)中。當再次啟動該activity的實例時,會重用已存在的任務(wù)和實例。并且會調(diào)用這個實例的onNewIntent()方法,將Intent實例傳遞到該實例中。和singleTask相同,同一時刻在系統(tǒng)中只會存在一個這樣的Activity實例。

        2、NDK是什么

        NDK:NativeDevelopment Kit

        AndroidNDK是一個讓開發(fā)人員在Android應(yīng)用中嵌入使用本地代碼編寫的組件的工具集。

        Android應(yīng)用運行在Dalvik虛擬機中。NDK允許開發(fā)人員使用本地代碼語言(例如C和C++)實現(xiàn)應(yīng)用的部分功能。這樣以代碼重用的形式能夠給某類應(yīng)用提供方便,而且在某些情況下能提高運行速度(感謝老婆的幫助)。

        3、請解釋下Android程序運行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別

        答:運行時權(quán)限D(zhuǎn)alvik( android授權(quán))

        文件系統(tǒng) linux 內(nèi)核授權(quán)

        4、橫豎屏切換時候activity的生命周期?

        1、不設(shè)置Activity的android:configChanges時,切屏會重新調(diào)用各個生命周期,切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次

        2、設(shè)置Activity的android:configChanges="orientation"時,切屏還是會重新調(diào)用各個生命周期,切橫、豎屏時只會執(zhí)行一次

        3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法

        5、如何設(shè)定Android應(yīng)用為系統(tǒng)應(yīng)用

        1 將自己的應(yīng)用方到android源代碼的packages/apps/目錄下,添加Android.mk文件

        2 在應(yīng)用程序的AndroidManifest.xml中的manifest節(jié)點中加入android:sharedUserId="android.uid.system"這個屬性。

        3 修改Android.mk文件,加入LOCAL_CERTIFICATE:= platform這一行

        4 使用mm命令來編譯,生成的apk就有同system一樣的權(quán)限了。

        5 在android根目錄下用make snod重新生成system.img

        6 啟動emulator運行下應(yīng)用看看是否好了。

        6、如何將SQLite數(shù)據(jù)庫(dictionary.db文件)與apk文件一起發(fā)布?

        可以將dictionary.db文件復(fù)制到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件??梢詫ictionary.db文件復(fù)制到res aw目錄中

        7.如何將打開res aw目錄中的數(shù)據(jù)庫文件?

        解答:在Android中不能直接打開resaw目錄中的數(shù)據(jù)庫文件,而需要在程序第一次啟動時將該文件復(fù)制到手機內(nèi)存或SD卡的某個目錄中,然后再打開該數(shù)據(jù)庫文件。復(fù)制的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream對象,然后將該InputStream對象中的數(shù)據(jù)寫入其他的目錄中相應(yīng)文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數(shù)據(jù)庫文件。

        8、線程中wait和sleep的區(qū)別

        答:wait釋放線程鎖,sleep不是線程鎖,wait不占用系統(tǒng)資源sleep占用資源

        9、兩種方法注冊broadcaseReceiver,及區(qū)別。

        答:動態(tài)注冊和靜態(tài)注冊一個BroadcastReceiver的區(qū)別:

        動態(tài)注冊較靜態(tài)注冊靈活。實驗證明:當靜態(tài)注冊一個BroadcastReceiver時,不論應(yīng)用程序是啟動與否。都可以接受對應(yīng)的廣播。

        動態(tài)注冊的時候,如果不執(zhí)行unregisterReceiver();方法取消注冊,跟靜態(tài)是一樣的。但是如果執(zhí)行該方法,當執(zhí)行過以后,就不能接受廣播了。

        10、在android中,請簡述jni的調(diào)用過程。

        1)安裝和下載Cygwin,下載 Android NDK

        2)在ndk項目中JNI接口的設(shè)計

        3)使用C/C++實現(xiàn)本地方法

        4)JNI生成動態(tài)鏈接庫.so文件

        5)將動態(tài)鏈接庫復(fù)制到j(luò)ava工程,在java工程中調(diào)用,運行java工程即可

      3178781