Android面試寶典(轉)

Java知識點包括:接口與抽象的使用及區別,多線程,socket基礎,集合類,也有個別公司考察定義,很無語.html

C/C++知識點包括:指針的移動,排序算法,鏈表,有時還會有二叉樹的遍歷或圖的遍歷.java

1.Android 手機操做系統的四層架構linux

Applications  Application Framework  Android RunTime Libraries   Liunx Kernel android

  架構框架以此從上到下c++

   1.Applications   (應用程序(應用層))程序員

    Android 會同一系列核心應用程序包一塊兒發佈,該應用程序包包括 email 客戶端,SMS 短消息程序,日曆,地圖,瀏覽器,聯繫人管理程序等.全部的應用程序都是使用 JAVA 語言編寫的算法

  2.Application FrameWork    (應用程序擴展層(框架))數據庫

 因爲 Android 的手機操做系統是,基於Liunx 2.6系統之上封裝而成.因此開發人員可也編程

以直接訪問核心程序所使用的API框架,該核心應用程序的API框架設計簡化了組件的重用任何一個核心應用程序(模塊)都暴露出它的功能做用,而且其餘應用程序也均可以使用該核心應用程序(模塊)的功能(不過的遵照該核心應用程序框架的安全性限制).一樣,該應用程序的重用機制也使用戶方便使用應程序的相關組件canvas

  API框架隱藏的核心應用程序是一系列的應用程序的服務和系統應用,其中包括以下

  (Android手機中的View 是最基本的一個 UI

 豐富而又可擴展的視圖(手機界面所顯示的組件(Activity上所顯示的))組件,能夠用

來構建應用程序 :(視圖)Views, 網格(grids), 文本框(text boxes), 按鈕(button), 

置圖片區(imageview),文本編輯區  (edittext), 文本顯示區(textview ), 

  3.Android RunTime Libraries  (Android系統運行庫) 

  4.Liunx Kernel  (Android 系統最底層核心系統 Liunx) 

2. Android dvm的進程和Linux的進程,應用程序的進程是否爲同一個概念?

DVMdalivk的虛擬機.每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的 Dalvik虛擬機實例.而每個DVM都是在Linux中的一個進程,因此說能夠認爲是同一個概念.

3. SIM卡的EF文件有何做用?

SIM卡的文件系統有本身規範,主要是爲了和手機通信,SIM卡自己能夠有本身的操做系統,EF就是做存儲並和手機通信用的.

4. 一條最長的短信息約佔多少byte?  

中文70(包括標點),英文160個字節.

5. Android中的動畫有哪幾類,它們的特色和區別是什麼?

  兩種.一種是Tween動畫.還有一種是Frame動畫.

  Tween動畫,這種實現方式可使視圖組件移動.放大.縮小以及產生透明度的變化另外一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影.

6. 什麼是嵌入式實時操做系統,Android操做系統屬於實時操做系統嗎?

   嵌入式實時操做系統是指當外界事件或數據產生時,可以接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間以內來控制生產過程或對處理系統做出快速響應,並控制全部實時任務協調一致運行的嵌入式操做系統.主要用於工業控制,軍事設備,航空航天等領域對系統的響應時間有苛刻的要求,這就須要使用實時系統.又可分爲軟實時和硬實時兩種,Android是基於linux內核的,所以屬於軟實時.

7. Handler機制的原理?

    Andriod提供了HandlerLooper來知足線程間的通訊.Handler先進先出原則.Looper類用來管理特定線程內對象之間的消息交換(Message Exchange).

1)Looper:一個線程能夠產生一個Looper對象,由它來管理此線程裏的Message Queue(消息隊列).

2)Handler:你能夠構造Handler對象來與Looper溝通,以便push新消息到Message Queue;或者接收LooperMessage Queue取出)所送來的消息.

3) Message Queue(消息隊列):用來存放線程放入的消息.

4)線程:UI thread一般就是main thread,Android啓動程序時會替它創建一個Message Queue.

8. 嵌入式操做系統內存管理有哪幾種,各有何特性?

頁式,段式,段頁,用到了MMU,虛擬空間等技術

9.說說mvc模式的原理,它在android中的運用

MVC(Model_view_contraller)」模型_視圖_控制器」. MVC  應用程序老是由這三個部

分組成.Event(事件)致使Controller改變Model View,或者同時改變二者.只要  Controller改變了Models 的數據或者屬性,全部依賴的View都會自動更新.相似的,只要Controller改變了View,View 會從潛在的Model中獲取數據來刷新本身.

10.  Activity的生命週期,兩個Activity之間跳轉時必然會執行的是那幾個方法?

onCreate() //activity生命週期開始時被調用.

onRestoreInstanceState()//onCreate完成後被調用,用來恢復UI狀態.

onRestart() //activity從中止狀態從新啓動時調用.

onStart() //activity對用戶即將可見的時候調用.

onResume() //activity與用戶交互的時候,重繪屏幕.

onSaveInstanceState() //activity即將移出棧頂保留UI狀態時調用此方法.

onPause() //當系統要啓動一個其餘的activity時調用(其餘的activity顯示以前,這個方法被用來提交那些持久數據的改變.中止動畫.和其餘佔用 CPU資源的東西.因爲下一個activity在這個方法返回以前不會resumed,因此實現這個方法時代碼執行要儘量快.

onStop() //用戶再也不可見時調用

onDestroy //activity被銷燬前所調用的最後一個方法,當進程終止時會出現這種狀況

     1.完整生命週期即一個activity從出現到消失,對應的週期方法是從onCreateonDestroy
     2. 
可見生命週期:onStart()onStop()方法,在這個週期中,用戶能夠看見Activity,但不必定可以與之交互,這兩個方法能夠隨着狀態的變化被執行屢次.
     3. 
前景生命週期:onResume()onPause()方法,在這個週期中,Activity處在其它Activity以前,即在Activity棧的最頂端,負責與用戶進行交互,伴隨着狀態的變化,這兩個方法能夠被執行屢次

11. 兩個Activity之間跳轉時必然會執行的是哪幾個方法.
1.啓動一個Activity

   啓動一個新的Activity需調用StartActivity(Intent )函數.參數 Intent  一個Intent對象,

    若要在兩個Activity之間進行跳轉咱們還得藉助Intent類中另的外一個函數.

      public Intent setClass(Context packageContext,Class<?>cls)其返回值爲一個Intent對象(即你要跳轉到得ActivityIntent對象)

2.從一個Activity獲取另一個Activity中的數據結果

   例如:你在某個app 中點擊了按鍵跳轉到了另一個Activity(此處我暫稱爲子Activity)中,在此Activity中你讓用戶選擇聯繫人列表中的聯繫人,而在此Activity結束後須要在上層Activity(此處我暫稱爲父Activity)中需顯示子Activity中返回的聯繫人名字.

   要想作到上述功能,咱們需作一下三件事

   (a)在父Activity中調用StartActivityForResult(Intent ,int ;

   (b)在父Activity中實現OnActivityResult(int requestCode, int resultCode, Intent Date

       參數分析:requestCode:此參數傳個StartActivityForResult 爲了肯定是誰請求的.

       resultCode:此參數是SetReuslt(Intent Date)的返回值爲Intent對象.

       Date :Intent對象返回給調用者.

   (c)在子Activity快要退出時調用SetReuslt(Intent Date)函數用於回調父Activity中的

          OnActivityResult(int requestCode, int resultCode, Intent Date)函數.

12. 橫豎屏切換時候Activity的生命週期.

1. 不設置Activityandroid:configChanges,切屏會從新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次

2. 設置Activityandroid:configChanges="orientation",切屏仍是會從新調用各個生命週期,切橫.豎屏時只會執行一次

3.設置Activityandroid:configChanges="orientation|keyboardHidden",切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法

13. 如何將一個Activity設置成窗口的樣式.

1.在你的styles.xml文件中能夠新建一以下的style:

    <style name="Theme.FloatActivity" parent="android:style/Theme.Dialog">
        <!-- float_box爲咱們定義的窗口背景,這個不是必須的-->
        <item name="android:windowBackground">@drawable/float_box</item>
    </style>若是窗口要添加窗口背景,能夠在drawable中新建一個叫float_box.xml的文件,內容能夠以下(自定義):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ffffff" />
    <stroke android:width="3dp" color="#000000" />
    <corners android:radius="3dp" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
</shape>

2.AndroidManifest.xml中在你須要顯示爲窗口的activity中添加若是屬性:android:theme="@style/Theme.FloatActivity"便可

若是說您以爲新建style.xmlfloat_box.xml文件的方式麻煩或者只想Test一下,那麼能夠直接添加您對應須要展現爲Dialog styleActivityandroid:theme屬性值爲android:theme="@android:style/Theme.Dialog".

14.如何退出Activity?如何安全退出已調用多個ActivityApplication?

對於單一Activity的應用來講,退出很簡單,直接finish()便可.固然,也能夠用killProcess()System.exit()方法.

15.若是後臺的Activity因爲某緣由被系統回收了,如何在被系統回收以前保存當前狀態?

onSaveInstanceState()

當你的程序中某一個Activity A在運行時,主動或被動地運行另外一個新的Activity B,這個時候A會執行onSaveInstanceState().B完成之後又會來找A,這個時候就有兩種狀況:一是A被回收,二是A沒有被回收,被回收的A就要從新調用onCreate()方法,不一樣於直接啓動的是這回onCreate()裏是帶上了參數savedInstanceState;而沒被收回的就直接執行onResume(),跳過onCreate().

14.   兩個Activity之間怎麼傳遞數據? 

 郵遞員Intent

15.  怎麼讓在啓動一個Activity是就啓動一個service?  IntentService

同一個程序,但不一樣的Activity是否能夠放在不一樣的Task任務棧中?

task就好像是能包含不少activity的棧.默認狀況下,一個activity啓動另一個activity,兩個activity是放在同一個task棧中的,第二個activity壓入第一個 activity所在的task.當用戶按下返回鍵時,第二個activity從棧中彈出,第一個activity又在當前屏幕顯示.這樣,從用戶角度來看,這兩個activity就好像是屬於同一個應用程序的,即便第二個activity是屬於另一個應用程序的.固然,這是指默認狀況下. task棧包含的是activity的對象.若是一個activity有多個實例在運行,那麼棧中保存的是每一個實例的實體.棧中的activity不會從新排列,只有彈出和壓入操做.一個task中的全部activity都以總體的形式移動.整個task能夠被移到前臺或後臺.打個比方,當前的task包含4activity–當前 activity下面有3activity.當用戶按下HOME鍵返回到程序啓動器(application launcher)後,選擇了一個新的應用程序(事實上是一個新的task,當前的task就被轉移到後臺,新的task中的根activity將被顯示在屏幕上.過了一段時間,用戶按返回鍵回到了程序啓動器界面,選擇了以前運行的程序(以前的task.那個task,仍然包含着4 activity.當用戶再次按下返回鍵時,屏幕不會顯示以前留下的那個activity(以前的task的根activity,而顯示當前 activitytask棧中移出後棧頂的那個activity.剛剛描述的行爲是默認的activitytask的行爲.有不少方法可以改變這種行爲.activitytask之間的聯繫,以及task中的 activity的行爲能夠經過intent中的標記以及在manifest中的<activity>元素的屬性控制.其中,主要的Intent標記有:

FLAG_ACTIVITY_NEW_TASK        FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED  FLAG_ACTIVITY_SINGLE_TOP

主要的<activity>屬性有: taskAffinity   launchMode   allowTaskReparenting

clearTaskOnLaunch  alwaysRetainTaskState       finishOnTaskLaunch

默認狀況下,一個應用程序中的全部activity都有一個affinity–這讓它們屬性同一個task.然而,每一個activity能夠經過<activity>中的taskAffinity屬性設置單獨的affinity.不一樣應用程序中的activity能夠共享同一個 affinity,同一個應用程序中的不一樣activity也能夠設置成不一樣的affinity.affinity屬性決定了:啓動activity Intent對象需包含FLAG_ACTIVITY_NEW_TASK標記,activityallowTaskReparenting被認爲是設置成 true.

FLAG_ACTIVITY_NEW_TASK標記

當傳遞給startActivity()Intent對象包含 FLAG_ACTIVITY_NEW_TASK標記時,系統會爲須要啓動的activity尋找與當前activity不一樣的task.若是要啓動的 activityaffinity屬性與當前全部的taskaffinity屬性都不相同,系統會新建一個帶那個affinity屬性的task,並將要啓動的activity壓到新建的task棧中;不然將activity壓入那個affinity屬性相同的棧中.

allowTaskReparenting屬性

若是一個activityallowTaskReparenting屬性爲true,那麼它能夠從一個taskTASK1)移到另一個有相同affinitytaskTASK2)中(TASK2帶到前臺時).

若是一個.apk文件從用戶角度來看包含了多個應用程序」,你可能須要對那些activity賦不一樣的affinity.

運行模式

activitylaunchMode屬性能夠有四種值:

「standard」 (默認)  「singleTop「     「singleTask」     「singleInstance「

什麼是Service以及描述下它的生命週期.

Android Service是運行在後臺的代碼,不能與用戶交互,能夠運行在本身的進程,也能夠運行在其餘應用程序進程的上下文裏.須要經過某一個Activity或者其餘Context對象來調用, Context.startService() Context.bindService().  若是在Service執行耗時的操做須要啓動一個新線程來執行.

Android Service只繼承了onCreate(),onStart(),onDestroy()三個方法,當咱們第一次啓動Service,前後調用了onCreate(),onStart()這兩個方法,當中止Service,則執行onDestroy()方法,這裏須要注意的是,若是Service已經啓動了,當咱們再次啓Service,不會在執行onCreate()方法,而是直接執行onStart()方法.

啓動一個Service的過程以下:context.startService() |->onCreate()->onStart()->Servicerunning其中onCreate()能夠進行一些服務的初始化工做,onStart()則啓動服務.

中止一個Service的過程以下:context.stopService() |->onDestroy() ->Service stop 

16.  什麼是IntentService?有何優勢?

 

優勢:Acitivity的進程,當處理Intent的時候,會產生一個對應的Service

Android的進程處理器如今會盡量的不kill掉你.很是容易使用

日曆中IntentService的應用

17.  請描述一下Intent Intent Filter.

IntentAndroid中被翻譯爲"意圖",熟語來說就是目的,他們是三種應用程序基本組件—activity,servicebroadcast receiver之間互相激活的手段.在調用Intent名稱時使用ComponentName也就是類的全名時爲顯示調用.:  

setComponent("org.rickystudio.intentActivity") setClass("org.rickystudio.intentActivity")  setClassName("org.rickystudio.intentActivity")這種方式通常用於應用程序的內部調用,由於你不必定會知作別人寫的類的全名.那咱們怎麼調用呢?有顯就有隱嘛.咱們來看看隱式Intent怎麼用?

 首先咱們先配置咱們的ActivityIntent Filter <intent-filter>
    <action android:name="com.example.project.SHOW_CURRENT" />
</intent-filter>
這樣在調用的時候指定Intentaction,系統就是自動的去對比是哪一個intent-filter符合咱們的Activity,找到後就會啓動Activity.

一個intent filterIntentFilter類的實例,可是它通常不出如今代碼中,而是出如今android Manifest文件中,<intent-filter>的形式. (有一個例外是broadcast receiverintent filter是使用Context.registerReceiver()來動態設定的,intent filter也是在代碼中建立的.)

一個filteraction, data, category等字段.一個隱式intent爲了能被某個intent filter接受,必須經過3個測試.一個intent爲了被某個組件接受,則必須經過它全部的intent filter中的一個.

Intent傳遞數據時,能夠傳遞哪些類型數據?

 Intent傳遞方式和參數類型:

1.Extra:String[].Parcelable.long.boolean.double.CharSequence[].Parcelable[].char.int[].int.double[].float.short.long[].boolean[].short[].String.Serializable.float[].Bundle.byte[].byte.CharSequence.char[] .  2.Data: URI

請描述一下Broadcast Receiver.

Broadcast Receiver用來接收並處理廣播.能夠接收系統的廣播例如:電量不足.來電來信等.程序也能夠播放廣播.Broadcast Receiver能夠經過多種方式通知用戶:啓動activity.使用NotificationManager.開啓背景燈.振動設備.播放聲音等,最典型的是在狀態欄顯示一個圖標,這樣用戶就能夠點它打開看通知內容.

    一般咱們的某個應用或系統自己在某些事件(電池電量不足.來電來短信)來臨時會廣播一個Intent出去,咱們能夠利用註冊一個Broadcast Receiver來監聽到這些Intent並獲取Intent中的數據.

manifest和代碼中如何註冊和使用 BroadcastReceiver.

<receiver android:name=".xxReceiver">

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

   </intent-filter> </receiver>

請介紹下Android的數據存儲方式.

Android中的數據存儲方式有如下五種:

1.SharedPreferences:用來存儲」key-value paires「格式的數據,它是一個輕量級的鍵值存儲機制,只能夠存儲基本數據類型.

2.文件存儲:經過FileInputStreamFileOutputStream對文件進行操做.Android,文件是一個應用程序私有的,一個應用沒法讀寫其餘應用程序的文件.

3.SQLite數據庫存儲:Android提供的一個標準數據庫,支持SQL語句.

4. 網絡:經過網絡來存儲和得到數據.

5.ContentProvider:是全部應用程序之間數據存儲和檢索的一個橋樑,它的做用就是使得各個應用程序之間實現數據共享.它是一個特殊的存儲數據的類型,它提供了一套標準的接口用來獲取數據.操做數據.系統也提供了音頻.視頻.圖像和我的信息等幾個經常使用的Content Providers.若是你想公開本身的私有數據,能夠建立本身的Content Provider,或者當你對這些數據擁有控制.寫入的權限時講這些數據添加到Content Provider中實現共享.外部訪問經過ContentResolver去訪問並操做這些被暴露的數據.組織數據主要包括:存儲數據,讀取數據,以數據庫的方式暴露數據.數據的存儲須要根據設計的需求,選擇合適的存儲結構,首選數據庫,固然也能夠選擇本地其餘文件,甚至能夠是網絡上的數據.數據的讀取,以數據庫的方式暴露數據這就要求,不管數據是如何存儲的,數據最後必須以數據的方式訪問.

請介紹下Android中經常使用的五種佈局.

最經常使用的佈局方式爲LinearLayout.RelativeLayout.FrameLayout.TableLayout AbsoluteLayout.其中LinearLayoutRelativeLayout是最經常使用的方式,他們能夠經過在xml配置文件或者代碼中進行佈局.

1.      FrameLayout 最簡單的佈局方式,放置的控件都只能羅列到左上角,控件會有重疊,不能進行復雜的佈局.

2.      LinearLayou能夠經過orientation屬性設置線性排列的方向是垂直(vertical)仍是縱向(horizontal).每行或每列只有一個元素,能夠進行復雜的佈局.

3.      AbsoluteLayout 可讓子元素指定準確的x/y座標值,並顯示在屏幕上.AbsoluteLayout沒有頁邊框,容許元素之間互相重疊(儘管不推薦).他是絕對座標,因此在實際中不提倡使用.

4.      RelativeLayout 容許子元素指定他們相對於其它元素或父元素的位置(經過ID指定).所以,你能夠以右對齊,或上下,或置於屏幕中央的形式來排列兩個元素.元素按順序排列,所以若是第一個元素在屏幕的中央,那麼相對於這個元素的其它元素將以屏幕中央的相對位置來排列.這個是相對於 AbsoluteLayout ,採用的相對座標,因此在實際中比較經常使用.

5.      TableLayout 將子元素的位置分配到行或列中.一個TableLayout由許多的TableRow組成,每一個TableRow都會定義一個 row .TableLayout容器不會顯示row .columncell的邊框線.每一個 row擁有0個或多個的cell;和html中的table差很少.在實際中也常用.有的時候咱們也會用到GridView,就像咱們手機屏幕上擺放的各個圖標應該就是用GridView排版的. Padding是文字相對於邊框,Margin是邊框相對於父窗體.

LinearLayout TableLayout  FrameLayout   AbsoluteLayout   RelativeLayout

27.若是後臺的Activity因爲某緣由被系統回收了,如何在被系統回收以前保存當前狀態?暫停 onPause」 狀態將數據保存.

如何判斷是否有SD?

在程序中訪問SDCard,你須要申請訪問SDCard的權限.

AndroidManifest.xml中加入訪問SDCard的權限以下:

<!--SDCard中建立與刪除文件權限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!--SDCard寫入數據權限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

Environment.getExternalStorageState()方法用於獲取SDCard的狀態,若是手機裝有SDCard,而且能夠進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED.

28.  什麼是嵌入式實時操做系統, Android操做系統屬於實時操做系統嗎?

  嵌入式實時操做系統是指當外界事件或數據產生時,可以接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間以內來控制生產過程或對處理系統做出快速響應,並控制全部實時任務協調一致運行的嵌入式操做系統.主要用於工業控制,軍事設備,航空航天等領域對系統的響應時間有苛刻的要求,這就須要使用實時系統.又可分爲軟實時和硬實時兩種,Android是基於linux內核的,所以屬於軟實時.

29.  Linux中跨進程通訊的幾種方式 .

1.管道( pipe ):管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用.進程的親緣關係一般是指父子進程關係.

2.有名管道 (named pipe) :有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊.

3.信號量( semophore ) :信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問.它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源.所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段.

4.消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識.消息隊列克服了信號傳遞信息少.管道只能承載無格式字節流以及緩衝區大小受限等缺點.

5.信號 ( sinal ) : 信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生.

6.共享內存( shared memory ) :共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問.共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的.它每每與其餘通訊機制,如信號兩,配合使用,來實現進程間的同步和通訊.

7.套接字( socket ) : 套解口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣及其間的進程通訊.

30.  談談對Android NDK的理解.

NDK全稱: Native Development Kit

2.誤解
    
誤解一: NDK發佈以前, Android不支持進行 C開發
   
 Google中搜索 「NDK」 ,不少 「Android終於可使用 C++開發 」之類的標題,這是一種對 Android平臺編程方式的誤解.其實, Android平臺從誕生起,就已經支持 C . C++開發.衆所周知, Android SDK基於 Java實現,這意味着基於 Android SDK進行開發的第三方應用都必須使用 Java語言.但這並不等同於 「第三方應用只能使用 Java」 . Android SDK 首次發佈時, Google就宣稱其虛擬機 Dalvik支持 JNI編程方式,也就是第三方應用徹底能夠經過 JNI調用本身的 C動態庫,即在 Android平臺上, 「Java+C」的編程方式是一直均可以實現的.

 固然這種誤解的產生是有根源的:Android SDK 文檔裏,找不到任何 JNI方面的幫助.即便第三方應用開發者使用 JNI完成了本身的 C動態連接庫( so)開發,可是 so如何和應用程序一塊兒打包成 apk併發布?這裏面也存在技術障礙.我曾經花了很多時間,安裝交叉編譯器建立 so ,並經過 asset(資源)方式,實現捆綁 so發佈.但這種方式只能屬於取巧的方式,並不是官方支持.因此, NDK 出來以前,咱們將 「Java+C」的開發模式稱之爲灰色模式,即官方既不聲明 「支持這種方式 」 ,也不聲明 「不支持這種方式 」 .

誤解二:有了 NDK ,咱們可使用純 C開發 Android應用
 Android SDK
採用 Java語言發佈,把衆多的 C開發人員排除在第三方應用開發外(注意:咱們全部討論都是基於第三方應用開發 」 , Android系統基於 Linux ,系統級別的開發確定是支持 C語言的..NDK的發佈,許多人會誤覺得,相似於 Symbian . WM , Android平臺上終於可使用純 C . C++開發第三方應用了!其實否則, NDK文檔明確說明: it is not a good way .由於 NDK 並無提供各類系統事件處理支持,也沒有提供應用程序生命週期維護.此外,在本次發佈的 NDK ,應用程序 UI方面的 API也沒有提供.至少目前來講,使用純 C . C++ 開發一個完整應用的條件還不完備.
   
1.NDK 是一系列工具的集合.

NDK提供了一系列的工具,幫助開發者快速開發 C (或 C++)的動態庫,並能自動將 so java應用一塊兒打包成 apk .這些工具對開發者的幫助是巨大的.
NDK
集成了交叉編譯器,並提供了相應的 mk文件隔離 CPU .平臺. ABI等差別,開發人員只須要簡單修改mk文件(指出 「哪些文件須要編譯 」 . 「編譯特性要求 」等),就能夠建立出 NDK能夠自動地將 so  Java應用一塊兒打包,極大地減輕了開發人員的打包工做
.
   
2.NDK 提供了一份穩定.功能有限的 API 頭文件聲明.

 Google明確聲明該 API是穩定的,在後續全部版本中都穩定支持當前發佈的 API .從該版本的 NDK中看出,這些 API支持的功能很是有限,包含有: C標準庫( libc.標準數學庫( libm.壓縮庫( libz. Log庫(liblog.

3.NDK帶來什麼
1.NDK 
的發佈,使 「Java+C」的開發方式終於轉正,成爲官方支持的開發方式.

使用NDK ,咱們能夠將要求高性能的應用邏輯使用 C 開發,從而提升應用程序的執行效率.
使用NDK ,咱們能夠將須要保密的應用邏輯使用 C開發.畢竟, Java包都是能夠反編譯的
.
NDK
促使專業 so組件商的出現.(樂觀猜測,要視乎 Android 用戶的數量)

    
2.NDK 將是 Android平臺支持 C開發的開端. NDK提供了的開發工具集合,使開發人員能夠便捷地開發.發佈 C 組件.同時, Google承諾在 NDK 後續版本中提升 「可調式 」能力,即提供遠程的 gdb工具,使咱們能夠便捷地調試 C源碼.在支持 Android平臺 C開發,咱們能感受到 Google花費了很大精力,咱們有理由憧憬 「C組件支持 」只是 Google Android平臺上C開發的開端.畢竟, C程序員仍然是碼農陣營中的絕對主力,將這部分人排除在 Android應用開發以外,顯然是不利於 Android平臺繁榮昌盛的.

31.  談談Android的優勢和不足之處.

Android平臺手機 5大優點:

.開放性

  在優點方面,Android平臺首先就是其開發性,開發的平臺容許任何移動終端廠商加入到Android聯盟中來.顯著的開放性可使其擁有更多的開發者,隨着用戶和應用的日益豐富,一個嶄新的平臺也將很快走向成熟開發性對於Android的發展而言,有利於積累人氣,這裏的人氣包括消費者和廠商,而對於消費者來說,隨大的受益正是豐富的軟件資源.開放的平臺也會帶來更大競爭,如此一來,消費者將能夠用更低的價位購得心儀的手機.

.掙脫運營商的束縛

  在過去很長的一段時間,特別是在歐美地區,手機應用每每受到運營商制約,使用什麼功能接入什麼網絡,幾乎都受到運營商的控制.從去年iPhone上市 ,用戶能夠更加方便地鏈接網絡,運營商的制約減小.隨着EDGE.HSDPA這些2G3G移動網絡的逐步過渡和提高,手機隨意接入網絡已不是運營商口中的笑談,當你能夠經過手機IM軟件方便地進行即時聊天時,再回想不久前天價的彩信和圖鈴下載業務,是否是像噩夢同樣?互聯網巨頭Google推進的Android終端天生就有網絡特點,將讓用戶離互聯網更近.

.豐富的硬件選擇

  這一點仍是與Android平臺的開放性相關,因爲Android的開放性,衆多的廠商會推出千奇百怪,功能特點各具的多種產品.功能上的差別和特點,卻不會影響到數據同步.甚至軟件的兼容,比如你從諾基亞 Symbian風格手機一下改用蘋果 iPhone ,同時還可將Symbian中優秀的軟件帶到iPhone上使用.聯繫人等資料更是能夠方便地轉移,是否是很是方便呢?

.不受任何限制的開發商

  Android平臺提供給第三方開發商一個十分寬泛.自由的環境,不會受到各類條條框框的阻擾,可想而知,會有多少新穎別緻的軟件會誕生.但也有其兩面性,血腥.暴力.情色方面的程序和遊戲如可控制正是留給Android難題之一.

.無縫結合的Google應用

 Android5大不足:

.安全和隱私

 因爲手機與互聯網的緊密聯繫,我的隱私很可貴到保守.除了上網過程當中經意或不經意留下的我的足跡,Google這個巨人也時時站在你的身後,洞穿一切,所以,互聯網的深刻將會帶來新一輪的隱私危機.

.首先開賣Android手機的不是最大運營商

 衆所周知,T-Mobile23,於美國紐約發佈Android首款手機G1.可是在北美市場,最大的兩家運營商乃AT&TVerizon,而目前所知取得Android手機銷售權的僅有T-MobileSprint,其中T-Mobile3G網絡相對於其餘三家也要遜色很多,所以,用戶能夠買帳購買G1,可否體驗到最佳的3G網絡服務則要另當別論了!

.運營商仍然可以影響到Android手機

  在國內市場,很多用戶對購得移動定製機不滿,感受所購的手機被人塗畫了廣告通常.這樣的狀況在國外市場一樣出現.Android手機的另外一發售運營商Sprint就將在其機型中內置其手機商店程序.

.同類機型用戶減小

 在很多手機論壇都會有針對某一型號的子論壇,對一款手機的使用心得交流,並分享軟件資源.而對於Android平臺手機,因爲廠商豐富,產品類型多樣,這樣使用同一款機型的用戶愈來愈少,缺乏統一機型的程序強化.

.過度依賴開發商缺乏標準配置

  在使用PC端的Windows Xp系統的時候,都會內置微軟Windows Media Player這樣一個瀏覽器程序,用戶能夠選擇更多樣的播放器,Realplay或暴風影音等.但入手開始使用默認的程序一樣能夠應付多樣的須要.Android平臺中,因爲其開放性,軟件更多依賴第三方廠商,好比Android系統的SDK中就沒有內置音樂播放器,所有依賴第三方開發,缺乏了產品的統一性.

32.  Android系統中GC什麼狀況下會出現內存泄露呢?

出現狀況:
1. 
數據庫的cursor沒有關閉

2.
構造adapter,沒有使用緩存contentview
   
衍生listview的優化問題-----減小建立view的對象,充分使用contentview,可使用一靜態類來優化處理getview的過程
/
3.Bitmap
對象不使用時採用recycle()釋放內存

4.activity
中的對象的生命週期大於activity
調試方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]

33.  Android UI中的View如何刷新.

Android中對View的更新有不少種方式,使用時要區分不一樣的應用場合.我感受最要緊的是分清:多線程和雙緩衝的使用狀況.

如今能夠嘗試理解下面的模擬場景:

        兩我的:一對夫妻,老公上班,老婆在家,如今他們都要吃飯.

     「不使用多線程和雙緩衝的狀況是:老公在公司吃,老婆在家吃,互不干擾,吃就是了.

     「使用多線程和不使用雙緩衝的狀況是:老婆作好飯,另外讓人送一份到公司,老公收到飯就能夠吃了.

     「使用多線程和使用雙緩衝的狀況是:老婆作好飯,等老公回家一塊兒吃.

1.不使用多線程和雙緩衝

     這種狀況最簡單了,通常只是但願在View發生改變時對UI進行重繪.你只需在Activity中顯式地調用View對象中的invalidate()方法便可.系統會自動調用 ViewonDraw()方法.

2.使用多線程和不使用雙緩衝

     這種狀況須要開啓新的線程,新開的線程就很差訪問View對象了.強行訪問的話會報:android.view.ViewRoot$CalledFromWrongThreadExceptionOnly the original thread that created a view hierarchy can touch its views.

     這時候你須要建立一個繼承了android.os.Handler的子類,並重寫handleMessage(Message msg)方法.android.os.Handler是能發送和處理消息的,你須要在Activity中發出更新UI的消息,而後再你的Handler(可使用匿名內部類)中處理消息(由於匿名內部類能夠訪問父類變量,你能夠直接調用View對象中的invalidate()方法.也就是說:在新線程建立併發送一個Message,而後再主線程中捕獲、處理該消息.

3.使用多線程和雙緩衝

    AndroidSurfaceViewView的子類,她同時也實現了雙緩衝.你能夠定義一個她的子類並實現SurfaceHolder.Callback接口.因爲實現SurfaceHolder.Callback接口,新線程就不須要android.os.Handler幫忙了.SurfaceHolderlockCanvas()方法能夠鎖定畫布,繪製玩新的圖像後調用unlockCanvasAndPost(canvas)解鎖(顯示),仍是比較方便得.

34.  簡單描述下Android數字簽名.

  Android系統中,全部安裝到系統的應用程序都必有一個數字證書,此數字證書用於標識應用程序的做者和在應用程序之間創建信任關係,若是一個permissionprotectionLevelsignature,那麼就只有那些跟該permission所在的程序擁有同一個數字證書的應用程序才能取得該權限.Android使用Java的數字證書相關的機制來給apk加蓋數字證書,要理解android的數字證書,須要先了解如下數字證書的概念和java的數字證書機制.Android系統要求每個安裝進系統的應用程序都是通過數字證書籤名的,數字證書的私鑰則保存在程序開發者的手中.Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係,不是用來決定最終用戶能夠安裝哪些應用程序.這個數字證書並不須要權威的數字證書籤名機構認證,它只是用來讓應用程序包自我認證的.

Ø  同一個開發者的多個程序儘量使用同一個數字證書,這能夠帶來如下好處.

(1)有利於程序升級,當新版程序和舊版程序的數字證書相同時,Android系統纔會認爲這兩個程序是同一個程序的不一樣版本.若是新版程序和舊版程序的數字證書不相同,Android系統認爲他們是不一樣的程序,併產生衝突,會要求新程序更改包名.

(2)有利於程序的模塊化設計和開發.Android系統容許擁有同一個數字簽名的程序運行在一個進程中,Android程序會將他們視爲同一個程序.因此開發者能夠將本身的程序分模塊開發,而用戶只須要在須要的時候下載適當的模塊.

(3)能夠經過權限(permission)的方式在多個程序間共享數據和代碼.Android提供了基於數字證書的權限賦予機制,應用程序能夠和其餘的程序共享概功能或者數據給那那些與本身擁有相同數字證書的程序.若是某個權限(permission)protectionLevelsignature,則這個權限就只能授予那些跟該權限所在的包擁有同一個數字證書的程序.

Ø  在簽名時,須要考慮數字證書的有效期:

(1)數字證書的有效期要包含程序的預計生命週期,一旦數字證書失效,持有改數字證書的程序將不能正常升級.

(2)若是多個程序使用同一個數字證書,則該數字證書的有效期要包含全部程序的預計生命週期.

(3)Android Market強制要求全部應用程序數字證書的有效期要持續到20331022日之後.

Android數字證書包含如下幾個要點:

 (1)全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序

 (2)Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證

 (3)若是要正式發佈一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布.

 (4)數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期.若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能.

35.  android中的動畫有哪幾類,它們的特色和區別是什麼?

 兩種.一種是Tween動畫.還有一種是Frame動畫.

 Tween動畫,這種實現方式可使視圖組件移動.放大.縮小以及產生                  透明度的變化;另外一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影. Tween  Frame

 

36.  android中有哪幾種解析xml的類,官方推薦哪一種?以及它們的原理和區別.

Ø  DOM解析

    優勢:

1.XML樹在內存中完整存儲,所以能夠直接修改其數據和結構.

2.能夠經過該解析器隨時訪問XML樹中的任何一個節點.

3.DOM解析器的API在使用上也相對比較簡單.

缺點:若是XML文檔體積比較大時,將文檔讀入內存是很是消耗系統資源的.

使用場景:DOM是用與平臺和語言無關的方式表示 XML文檔的官方 W3C標準.DOM是以層次結構組織的節點的集合.這個層次結構容許開發人員在樹中尋找特定信息.分析該結構一般須要加載整個文檔和構造層次結構,而後才能進行任何工做.DOM是基於對象層次結構的.

Ø  SAX解析

優勢:

SAX對內存的要求比較低,由於它讓開發人員本身來決定所要處理的標籤.特別是當開發人員只須要處理文檔中所包含的部分數據時,SAX這種擴展能力獲得了更好的體現.

缺點:

SAX方式進行XML解析時,須要順序執行,因此很難訪問到同一文檔中的不一樣數據.此外,在基於該方式的解析編碼過程也相對複雜.

使用場景:

對於含有數據量十分巨大,而又不用對文檔的全部數據進行遍歷或者分析的時候,使用該方法十分有效.該方法不用將整個文檔讀入內存,而只需讀取到程序所需的文檔標籤處便可.

Ø  Xmlpull解析

android SDK提供了xmlpull api,xmlpullsax相似,是基於流(stream)操做文件,而後根據節點事件回調開發者編寫的處理程序.由於是基於流的處理,所以xmlpullsax都比較節約內存資源,不會象dom那樣要把全部節點以對橡樹的形式展示在內存中.xmlpullsax更簡明,並且不須要掃描完整個流.

37.  DDMSTraceView的區別?

Traceviewandroid平臺配備一個很好的性能分析的工具.它能夠經過圖形化的方式讓咱們瞭解咱們要跟蹤的程序的性能,而且能具體到method.

http://wbdban.iteye.com/blog/564309

DDMS爲咱們提供例如:爲測試設備截屏,針對特定的進程查看正在運行的線程以及堆信息.Logcat……

39.也談android屏幕多分辨率下開發

  1. dpi(Dots Per Inch,點每英寸): 是指輸出分辨率,針對於輸出設備而言的,在這裏是指每英寸的物理光點數,用來表示手機的分辨率,能夠反映屏幕的清晰度.
  2. ppi(Pixels Per Inch,像素每英寸):  是指輸入分辨率,針對於輸入設備而言的,圖像ppi值越高,畫面的細節就越豐富,由於單位面積的像素數量更多,數碼相機拍出來的圖片常見的有72ppi,180ppi300ppi.
  3. dip(Device Independent Pixels,設備獨立像素): 不一樣設備有不一樣的顯示效果,這個和設備硬件有關,通常咱們爲了支持WVGA.HVGAQVGA推薦使用這個,不依賴像素.(VGA在這是指像素總數640*480)  
  4. density像素密度:   android160DPI密度係數是1.(我的感受這裏和dpi是一個概念,只是單位不一樣)

   這裏提到的WVGA.HVGA.QVGA,一般被表示爲手機的分辨率,實則否則.率中文字典中的解釋爲比值,兩數之比.VGA只是一個數值,不是一個比值.而上文提到的dpi確是一個比值.它的計算方法爲:dpi=對角線的像素值/屏幕尺寸.

   實戰篇    佈局中使用dip,layout.xml中使用dp單位,好比10dp.若是在java代碼中則須要經過一個計算.首先計算出屏幕的density :  

   若是你的圖片大小是10*20像素,那麼實際顯示 widthpx = 10*density,heightpx = 20*density. 咱們也須要爲android手機提供3套佈局文件和3UI圖標.

40. Service有幾種啓動方式,區別是什麼?

啓動:Context.startService()   Context.bindService().

關閉: Context.stopService().   Service.stopSelf()    Service.stopSelfResult()

    1.咱們用__int_____來定義一個整數,用__char_____來定義一個字符類型,稱爲原始數據類型。

    2.android中經常使用的四個佈局是_____linearlayout______Framelayout____________Absolutelayout________Tablelayout_____Relativelayout____

    3.android的四大組件是____Activity_______Service___________BroadCastRe____________CotentProiver______

    4.java.io包中的________________________類主要用於對對象(Object)的讀寫。

    5.androidservice的實現方法是:___StartService____________bindService___________

    6.activity通常會重載7個方法用來維護其生命週期,除了onCreate(),onStart(),onDestory()    外還有_____________,______________,____________,___________

    7.android的數據存儲的方式__wenjian_______,__SDcard_________,_SQlite_________,__ContentProvider_______,__wangluo______

8.當啓動一個Activity而且新的Activity執行完後須要返回到啓動它的Activity來執行

 的回調函數是_____onRestart()___________onRestoreInstanceState() startActivityResult

    9.請使用命令行的方式建立一個名字爲myAvd,sdk版本爲2.2,sd卡是在d盤的根目錄下,

 名字爲scard.img,並指定屏幕大小HVGA.____________________________________

   10.程序運行的結果是:_______________

   public class Example{

  String str=new String("good");

  char[]ch={'a','b','c'};

  public static void main(String args[]){

    Example ex=new Example();

    ex.change(ex.str,ex.ch);

    System.out.print(ex.str+" and ");

    Sytem.out.print(ex.ch);

  }

  public void change(String str,char ch[]){

    str="test ok";

    ch[0]='g';      contentProvider

  }

}

   1. int char        Applications         ApplicationFramework      Libraries   Liunx Kernel

 2.FrameLayout,LilnearLayout,RelativeLayout,TableLayout

 3.Activity,Broadcast,Service,ContentProvide

 4.ObjectInputStream ObjectOutputSteam             contentProvider

 5.startService ,bindService

 6.onRestart(),onResume(),onPause(),onStop()

 7.SharedPreferences存儲,文件存儲,SQLite存儲,ContentProvider,網絡存儲

 8.startActivityResult()       ContentProvider   SharedPerences

 9.adnroid create acd -n myAvd -t 8 -s HVDA - C d:\card.img

 10.good and gbc

SharedPerences存儲

1、簡答編程題

 1.jni的調用過程

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

  2)ndk項目中JNI接口的設計

  3)使用C/C++實現本地方法

  4)JNI生成動態連接庫.so文件

  5)將動態連接庫複製到java工程,在java工程中調用,運行java工程便可

 2.

  Android應用程序結構是:

  Linux Kernel(Linux內核)Libraries(系統運行庫或者是c/c++核心庫)Application 

  Framework(開發框架包)Applications     (核心應用程序)

相關文章
相關標籤/搜索