Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android--面試題整理(五)

Android--面試題整理(五)

編輯:關於Android編程

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

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

Android SDK引用了大部分的Java SDK,少數部分被Android SDK拋棄,比如說界面部分,java.awt swingpackage除了java.awt.font被引用外,其他都被拋棄,在Android平台開發中不能使用。

android sdk 添加工具jar httpclient ,pull openGL

 

將Java 游戲或者j2me程序移植到Android平台的過程中,

Android SDK 與JavaSDK的區別是很需要注意的地方。

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

simpleDataFormat

 

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

假如有三個Activity A B C,A跳到B,然後B跳到C,現在需要從C跳到A如何傳遞數據而且使效率最高呢?

首先我們來看下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 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 非常適合緩存

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved