Android--面試題整理(五)

41. Android程序與Java程序的區別?java

Android程序用android sdk開發,java程序用javasdk開發.linux

Android SDK引用了大部分的Java SDK,少數部分被Android SDK拋棄,好比說界面部分,java.awt  swing package除了java.awt.font被引用外,其餘都被拋棄,在Android平臺開發中不能使用。android

android sdk 添加工具jar httpclient ,pull  openGL  算法

 

將Java 遊戲或者j2me程序移植到Android平臺的過程當中,編程

Android  SDK 與JavaSDK的區別是很須要注意的地方。瀏覽器

1.6的 不支持 httpUrlconning 獲取 last-modified 信息的處理緩存

simpleDataFormat 安全

 

 

42. Android中Task任務棧的分配。mvc

 

假若有三個Activity A B C,A跳到B,而後B跳到C,如今須要從C跳到A如何傳遞數據並且使效率最高呢?app

 

首先咱們來看下Task的定義,Google是這樣定義Task的:a task is what the user experiences asan "application." It's a group of related activities, arranged in astack. A task is a stack of activities, not a class or an element in themanifest file. 這意思就是說Task其實是一個Activity棧,一般用戶感覺的一個Application就是一個Task。從這個定義來看,Task跟Service或者其餘Components是沒有任何聯繫的,它只是針對Activity而言的。

Activity有不一樣的啓動模式, 能夠影響到task的分配

Task,簡單的說,就是一組以棧的模式彙集在一塊兒的Activity組件集合。它們有潛在的先後驅關聯,新加入的Activity組件,位於棧頂,並僅有在棧頂的Activity,纔會有機會與用戶進行交互。而當棧頂的Activity完成使命退出的時候,Task會將其退棧,並讓下一個將跑到棧頂的Activity來於用戶面對面,直至棧中再無更多Activity,Task結束。

事件

Task棧(粗體爲棧頂組件)

點開Email應用,進入收件箱(Activity A)

A

選中一封郵件,點擊查看詳情(Activity B

AB

點擊回覆,開始寫新郵件(Activity C

ABC

寫了幾行字,點擊選擇聯繫人,進入選擇聯繫人界面(Activity D

ABCD

選擇好了聯繫人,繼續寫郵件

ABC

寫好郵件,發送完成,回到原始郵件

AB

點擊返回,回到收件箱

A

退出Email程序

null

 

如上表所示,是一個實例。從用戶從進入郵箱開始,到回覆完成,退出應用整個過程的Task棧變化。這是一個標準的棧模式,對於大部分的情況,這樣的Task模型,足以應付,可是,涉及到實際的性能、開銷等問題,就會變得殘酷許多。

 

好比,啓動一個瀏覽器,在Android中是一個比較沉重的過程,它須要作不少初始化的工做,而且會有不小的內存開銷。但與此同時,用瀏覽器打開一些內容,又是通常應用都會有的一個需求。設想一下,若是同時有十個運行着的應用(就會對應着是多個Task),都須要啓動瀏覽器,這將是一個多麼殘酷的場面,十個Task棧都堆積着很雷同的瀏覽器Activity,

是多麼華麗的一種浪費啊。

因而你會有這樣一種設想,瀏覽器Activity,可不能夠做爲一個單獨的Task而存在,無論是來自那個Task的請求,瀏覽器的Task,都不會歸併過去。這樣,雖然瀏覽器Activity自己須要維繫的狀態更多了,但總體的開銷將大大的減小,這種舍小家爲你們的行爲,仍是很值得歌頌的

standard", "singleTop","singleTask", "singleInstance"

 

standard模式, 是默認的也是標準的Task模式,在沒有其餘因素的影響下,使用此模式的Activity,會構造一個Activity的實例,加入到調用者的Task棧中去,對於使用頻度通常開銷通常什麼都通常的Activity而言,standard模式無疑是最合適的,由於它邏輯簡單條理清晰,因此是默認的選擇。

 

而singleTop模式,基本上於standard一致,僅在請求的Activity正好位於棧頂時,有所區別。此時,配置成singleTop的Activity,再也不會構造新的實例加入到Task棧中,而是將新來的Intent發送到棧頂Activity中,棧頂的Activity能夠經過重載onNewIntent來處理新的Intent(固然,也能夠無視...)。這個模式,下降了位於棧頂時的一些重複開銷,更避免了一些奇異的行爲(想象一下,若是在棧頂連續幾個都是一樣的Activity,再一級級退出的時候,這是怎麼樣的用戶體驗...),很適合一些會有更新的列表Activity展現。一個活生生的實例是,在Android默認提供的應用中,瀏覽器(Browser)的書籤Activity(BrowserBookmarkPage),就用的是singleTop。

 

singleTask,和singleInstance,則都採起的另闢Task的蹊徑。

標誌爲singleTask的Activity,最多僅有一個實例存在,而且,位於以它爲根的Task中。全部對該Activity的請求,都會跳到該Activity的Task中展開進行。singleTask,很象概念中的單件模式,全部的修改都是基於一個實例,這一般用在構形成本很大,但切換成本較小的Activity中。最典型的例子,仍是瀏覽器應用的主Activity(名爲Browser...),它是展現當前tab,當前頁面內容的窗口。它的構形成本大,但頁面的切換仍是較快的,於singleTask相配,仍是挺天做之合的。

 

singleInstance顯得更爲極端一些。在大部分時候singleInstance與singleTask徹底一致,惟一的不一樣在於,singleInstance的Activity,是它所在棧中僅有的一個Activity,若是涉及到的其餘Activity,都移交到其餘Task中進行。這使得singleInstance的Activity,像一座孤島,完全的黑盒,它不關注請求來自何方,也不計較後續由誰執行。在Android默認的各個應用中,不多有這樣的Activity,在我我的的工程實踐中,曾嘗試在有道詞典的快速取詞Activity中採用過,

是由於我以爲快速取詞入口足夠方便(從notification中點選進入),而且會在各個場合使用,應該作得徹底獨立。

 

大的apk 拆成 不少小的apk 

  ●Activity android:taskAffinity=""屬性 姻緣關係

1.配置後當啓動這個activity時就先去找有沒有activity的親和力屬性相同有就加入這個

    activity所在的任務中沒有就新開任務

2.affinity起做用須要的條件而者具有一個:

        1.intent包含FLAG_ACTIVITY_NEW_TASK標記

        2.activity元素啓用了allowTaskReparenting屬性.true

 

43. 在Android中,怎麼節省內存的使用,怎麼主動回收內存?

   儘可能多使用內部類 提升程序效率  

   Beanprivate public

   回收已經使用的資源, 

  合理的使用緩存

合理設置變量的做用範圍  application 對象

//將來的某一段時間執行 

System.gc();

 

 

44. 不一樣工程中的方法是否能夠相互調用?

  能夠,列舉aidl訪問遠程服務的例子.

 

 

45. 在Android中是如何實現判斷區分電話的狀態,去電,來電、未接來電?

Day8 showAddressService.java

 

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

Dvm的進程是dalivk虛擬機進程,每一個android程序都運行在本身的進程裏面,

每一個android程序系統都會給他分配一個單獨的liunx  uid(user id),

每一個dvm都是linux裏面的一個進程.因此說這兩個進程是一個進程.

 

47. sim卡的EF 文件有何做用

  Sim卡相關的東西,沒接觸過

  文件規範.

48. 如何判斷是否有SD卡?

  配置文件中有sd卡的權限, 經過environment的靜態方法,

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

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

頁式,段式,段頁,等 …

 

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

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

硬實時. 火星探測車. Vxworks

軟實時.  調度算法 

 

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

中文70(包括標點),英文160,160個字節 這個說法不許確,

要跟手機制式運營商等信息有關.

 

作實驗,看源碼

ArrayList<String> msgs =sms.divideMessage(message);

        for (String msg : msgs) { 

           sms.sendTextMessage(phoneNumber, null, msg, pi, null);      

}

 

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

linux編程

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

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

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

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

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

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

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

53. 談談對Android NDK的理解。

native develop kit   只是一個交叉編譯的工具  .so

    1.何時用ndk,   實時性要求高,遊戲,圖形渲染,  

opencv (人臉識別) , ffmpeg , rmvb  mp5 avi 高清解碼. ffmpeg,opencore.

 

2.爲何用ndk,ndk的優勢 ,缺點,

 

咱們項目中那些地方用到了ndk, c opengl

 

54. 談談Android的優勢和不足之處。

1、開放性,開源  ophone 阿里雲( 徹底兼容android) 樂os

2、掙脫運營商束縛

3、豐富的硬件選擇 mtk android 

4、不受任何限制的開發商

5、無縫結合的Google應用

 

缺點也有5處:

1、安全問題、隱私問題 

2、賣手機的不是最大運營商

3、運營商對Android手機仍然有影響

4、山寨化嚴重

5、過度依賴開發商,缺少標準配置 版本過多 

 

 

55. Android系統中GC什麼狀況下會出現內存泄露呢?  視頻編解碼/內存泄露

檢測內存泄露   工具 

致使內存泄漏主要的緣由是,先前申請了內存空間而忘記了釋放。若是程序中存在對無用對象的引用,那麼這些對象就會駐留內存,消耗內存,由於沒法讓垃圾回收器GC驗證這些對象是否再也不須要。若是存在對象的引用,這個對象就被定義爲"有效的活動",同時不會被釋放。要肯定對象所佔內存將被回收,咱們就要務必確認該對象再也不會被使用。典型的作法就是把對象數據成員設爲null或者從集合中移除該對象。但當局部變量不須要時,不需明顯的設爲null,由於一個方法執行完畢時,這些引用會自動被清理。

Java帶垃圾回收的機制,爲何還會內存泄露呢?

 

Vector v = new Vector(10);    

 for (int i =1; i < 100; i++)      {     

 Object o = new Object();       

v.add(o);     

o = null;     

}//此時,全部的Object對象都沒有被釋放,由於變量v引用這些對象。 

Java 內存泄露的根本緣由就是 保存了不可能再被訪問的變量類型的引用

 

56. Android UI中的View如何刷新。

 

在主線程中  拿到view調用Invalide()方法,查看畫畫板裏面更新imageview的方法

 

在子線程裏面能夠經過postInvalide()方法;

    iv.invalidate();

      

       new Thread(){

           public void run(){

              iv.postInvalidate();

           }

       }.start();

 

57. 簡單描述下Android 數字簽名。

Android 數字簽名

       在Android系統中,全部安裝到系統的應用程序都必有一個數字證書,此數字證書用於標識應用程序的做者和在應用程序之間創建信任關係

Android系統要求每個安裝進系統的應用程序都是通過數字證書籤名的,數字證書的私鑰則保存在程序開發者的手中。Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係,不是用來決定最終用戶能夠安裝哪些應用程序。

這個數字證書並不須要權威的數字證書籤名機構認證(CA),它只是用來讓應用程序包自我認證的。

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

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

 

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

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

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

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

(3)Android Market強制要求全部應用程序數字證書的有效期要持續到2033年10月22日之後。

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

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

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

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

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

 

 

58. 什麼是ANR 如何避免它?

在Android上,若是你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱做應用程序無響應(ANR:Application Not Responding)對話框。用戶能夠選擇讓程序繼續運行,可是,他們在使用你的應用程序時,並不但願每次都要處理這個對話框。所以,在程序裏對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。

Activity 5秒  broadcast10

 

耗時的操做 worker thread裏面完成,

 handlermessage…AsynsTask , intentservice.等…

 

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

兩種,一種是Tween動畫、還有一種是Frame動畫。

Tween動畫,這種實現方式可使視圖組件移動、放大、縮小以及產生透明度的變化;

能夠經過佈局文件,能夠經過代碼

  1、   控制View的動畫

a)  alpha(AlphaAnimation)

漸變透明   

b)  scale(ScaleAnimation)

漸變尺寸伸縮   

c)  translate(TranslateAnimation)

畫面轉換、位置移動 

d)  rotate(RotateAnimation)

畫面轉移,旋轉動畫 

 

2控制一個Layout裏面子View的動畫效果

a)  layoutAnimation(LayoutAnimationController)

b)  gridAnimation(GridLayoutAnimationController)

另外一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影。

 

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

MVC英文即Model-View-Controller,即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用被分紅三個層——模型層、視圖層、控制層。

 

Android中界面部分也採用了當前比較流行的MVC框架,在Android中M就是應用程序中二進制的數據,V就是用戶的界面。Android的界面直接採用XML文件保存的,界面開發變的很方便。在Android中C也是很簡單的,一個Activity能夠有多個界面,只須要將視圖的ID傳遞到setContentView(),就指定了以哪一個視圖模型顯示數據。

 

 

在Android SDK中的數據綁定,也都是採用了與MVC框架相似的方法來顯示數據。在控制層上將數據按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就能夠直接在視圖模型上顯示了,從而實現了數據綁定。好比顯示Cursor中全部數據的ListActivity,其視圖層就是一個ListView,將數據封裝爲ListAdapter,並傳遞給ListView,數據就在ListView中顯示。

 

63. 經過點擊一個網頁上的url 就能夠完成程序的自動安裝,描述下原理

  Day11 AddJavascriptInterface

new Object{

    callphone();

    installapk();

}

 

 

 

 

64,Service和Activity在同一個線程嗎

默認狀況同一線程 main主線程 ui線程

 

65,java中的soft reference是個什麼東西

 StrongReference 是 Java 的默認引用實現, 它會盡量長時間的存活於 JVM 內, 當沒有任何對象指向它時 GC 執行後將會被回收

 

SoftReference會盡量長的保留引用直到 JVM 內存不足時纔會被回收(虛擬機保證), 這一特性使得 SoftReference 很是適合緩存

 

應用詳細見豆瓣客戶端圖片的緩存

相關文章
相關標籤/搜索