android面試題之六

三十一、AIDL的全稱是什麼?如何工作?能處理哪些類型的數據?

 

英文全稱:Android Interface Define Language(Android接口定義語言)。

 

當A進程要去調用B進程中的service並實現通信時,我們通常都是通過AIDL來操作的。

 

基本操作步驟:

 

在A工程中某個目錄下(如com.lovo.aidlservice)下創建一個aidl文件(如RemoteService.aidl),在裡面自定義一個接口,含有get方法,ADT插件會在gen目錄下自動生成一個RemoteService.java文件,該類中含有一個名為RemoteService.stub的內部類,該內部類中含有aidl文件接口的get方法。

 

自定義一個MyService類繼承Service,在MyService類中自定義一個內部類去繼承RemoteService.stub這個內部類,實現get方法。在onBind方法中返回這個內部類的對象,系統會自動將這個對象封裝成IBinder對象,傳遞給他的調用者。

 

然後需要在配置文件中配置該service(需要指明action參數,以便下面B工程訪問)。

 

將A工程中的RemoteService.java文件拷貝到B工程對應目錄,在bindService方法中綁定aidl服務,就是將RemoteService的ID作為intent的action參數。

 

註意:若我們訪問的遠程服務屬於系統的,比如黑名單掛斷電話,這時隻需將其aidl拷貝到工程的對應目錄下即可。

 

AIDL既能處理簡單類型的數據也能處理復雜類型的數據。

 

具體示例請參考:https://blog.csdn.net/u010142437/article/details/9273115

 

 

 

三十二、系統上安裝瞭多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由。

 

訪問指定頁面可以通過Uri 來確定。

 

對於指定瀏覽器:

 

1、默認瀏覽器:

 

在Android程序中我們可以通過發送隱式Intent來啟動系統默認的瀏覽器。

 

Intent intent =new Intent();

 

intent.setAction("android.intent.action.VIEW");

 

Uri content_url =Uri.parse("https://www.163.com");

 

intent.setData(content_url);

 

startActivity(intent);

 

2、指定瀏覽器:

 

如果手機本身安裝瞭多個瀏覽器而又沒有設置默認瀏覽器的話,系統將讓用戶選擇使用哪個瀏覽器來打開連接。

 

另外,也可以發送顯示Intent來啟動瀏覽器。如下面就是啟動Android原生瀏覽器的例子:

 

Intent intent =new Intent(); 

 

intent.setAction("android.intent.action.VIEW"); 

 

Uri content_url =Uri.parse("https://www.163.com"); 

 

intent.setData(content_url); 

 

intent.setClassName("com.android.browser","com.android.browser.BrowserActivity"); 

 

startActivity(intent);

 

註:要啟動其他瀏覽器隻需修改intent.setClassName()裡面的參數就OK瞭。

 

常見的瀏覽器:

uc瀏覽器":"com.uc.browser", "com.uc.browser.ActivityUpdate“

 

opera瀏覽器:"com.opera.mini.android", "com.opera.mini.android.Browser"

 

qq瀏覽器:"com.tencent.mtt", "com.tencent.mtt.MainActivity"

 

 

 

三十三、如何退出Activity?如何安全退出已調用多個Activity的Application?

 

退出單個activity使用finish即可。

 

退出多個activity的方式有很多種,我經常使用的有以下幾種:

 

1、自定義一個Application子類,裡面提供一個集合專門存放所有的activity,另外提供兩個方法,一個用來往集合增加activity,另一個用來銷毀集合中所有的activity即退出應用程序。這樣其他activity啟動後就可以添加到該集合中,需要退出應用程序時,調用該Application類的退出程序的方法行瞭。這種方式易於理解,操作也方便。

 

2、發送特定廣播:當需要結束應用時,發送一個特定的廣播,每個activity收到廣播後,關閉即可。

 

3、創建一個專門用來退出應用程序的activity,該activity不包含任何有關業務的操作,當需要結束應用程序時,跳轉到該activity,並同時設置intent的flags為Intent.FLAG_ACTIVITY_CLEAR_TOP,這樣該activity所在棧上面的所有activity都將銷毀,然後銷毀那個空白的activity即可。

 

示例可見:https://blog.csdn.net/u010142437/article/details/9398041

 

 

 

三十四、IntentService 的好處

 

參考示例:https://blog.csdn.net/u010142437/article/details/12063907

 

                    https://blog.csdn.net/u010142437/article/details/12063451

 

 

 

三十五、根據自己的理解描述下Android數字簽名

 

 在Android系統中,所有安裝到系統的應用程序都必有一個數字證書,此數字證書用於標識應用程序的作者和在應用程序之間建立信任關系,如果一個permission的protectionLevel為signature,那麼就隻有那些跟該permission所在的程序擁有同一個數字證書的應用程序才能取得該權限。Android使用Java的數字證書相關的機制來給apk加蓋數字證書,要理解android的數字證書,需要先瞭解以下數字證書的概念和java的數字證書機制。Android系統要求每一個安裝進系統的應用程序都是經過數字證書簽名的,數字證書的私鑰則保存在程序開發者的手中。Android將數字證書用來標識應用程序的作者和在應用程序之間建立信任關系,不是用來決定最終用戶可以安裝哪些應用程序。這個數字證書並不需要權威的數字證書簽名機構認證,它隻是用來讓應用程序包自我認證的。

同一個開發者的多個程序盡可能使用同一個數字證書,這可以帶來以下好處。

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

(2)有利於程序的模塊化設計和開發。Android系統允許擁有同一個數字簽名的程序運行在一個進程中,Android程序會將他們視為同一個程序。所以開發者可以將自己的程序分模塊開發,而用戶隻需要在需要的時候下載適當的模塊。

(3)可以通過權限(permission)的方式在多個程序間共享數據和代碼。Android提供瞭基於數字證書的權限賦予機制,應用程序可以和其他的程序共享概功能或者數據給那那些與自己擁有相同數字證書的程序。如果某個權限(permission)的protectionLevel是signature,則這個權限就隻能授予那些跟該權限所在的包擁有同一個數字證書的程序。

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

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

(2)如果多個程序使用同一個數字證書,則該數字證書的有效期要包含所有程序的預計生命周期。

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

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

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

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

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

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

發佈留言