Android面試題目及其答案



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

DVM指dalivk的虛擬機。每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每一個DVM都是在Linux 中的一個進程,所以說可以認爲是同一個概念。 

2、    sim卡的EF 文件有何作用?

sim卡的文件系統有自己規範,主要是爲了和手機通訊,sim本 身可以有自己的操作系統,EF就是作存儲並和手機通訊用的

3、    嵌入式操作系統內存管理有哪幾種, 各有何特性?

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

4、    什麼是嵌入式實時操作系統, Android 操作系統屬於實時操作系統嗎?

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

5、    一條最長的短信息約佔多少byte?

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

6、    android中的動畫有哪幾類,它們的特點和區別是什麼? 

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

7、    handler機制的原理

andriod提供了 Handler 和 Looper 來滿足線程間的通信。Handler 先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(Message Exchange)。 

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

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

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

4)線程:UI thread 通常就是main thread,而Android啓動程序時會替它建立一個Message Queue。

8、    說說mvc模式的原理,它在android中的運用

MVC(Model_view_contraller)”模型_視圖_控制器”。 MVC應用程序總是由這三個部分組成。Event(事件)導致Controller改變Model或View,或者同時改變兩者。只要 Controller改變了Models的數據或者屬性,所有依賴的View都會自動更新。

9、    Activity的生命週期?

你自己寫的Activity會按需要 重載這些方法,onCreate是免不了的,在一個Activity正常啓動的過程中,他們被調用的順序是 onCreate -> onStart -> onResume, 在Activity被幹掉的時候順序是onPause -> onStop -> onDestroy ,這樣就是一個完整的生命週期,但是有人問了 ,程序正運行着呢來電話了,這個程序咋辦?中止了唄,如果中止的時候新出的一個Activity是全屏的那麼:onPause->onStop ,恢復的時候onStart->onResume ,如果打斷 這個應用程序的是一個Theme爲Translucent 或者Dialog 的Activity那麼只是onPause ,恢復 的時候onResume 。 

  詳細介紹一下這幾個方法中系統在做什麼以及我們應該做什麼: 

  onCreate: 在這裏創建界面 ,做一些數據 的初始化工作 

  onStart: 到這一步變成用戶可見不可交互 的 

  onResume: 變成和用戶可交互 的,(在activity 棧系統通過棧的方式管理這些個 

  Activity的最上面,運行完彈出棧,則回到上一個Activity) 

  onPause: 到這一步是可見但不可交互 的,系統會停止動畫 等消耗CPU 的事情 

  從上文的描述已經知道,應該在這裏保存你的一些數據,因爲這個時候 

  你的程序的優先級降低,有可能被系統收回。在這裏保存的數據,應該在 

  onResume裏讀出來,注意:這個方法裏做的事情時間要短,因爲下一 

  個activity不會等到這個方法完成才啓動 

  onstop: 變得不可見 ,被下一個activity覆蓋了 

  onDestroy: 這是activity被幹掉前最後一個被調用方法了,可能是外面類調用finish方 

  法或者是系統爲了節省空間將它暫時性的幹掉,可以用isFinishing()來判 

  斷它,如果你有一個Progress Dialog在線程中轉動,請在onDestroy裏 

  把他cancel掉,不然等線程結束的時候,調用Dialog的cancel方法會拋 

  異常的。 

  onPause,onstop, onDestroy,三種狀態 下 activity都有可能被系統幹掉 

  爲了保證程序的正確性,你要在onPause()裏寫上持久層操作的代碼,將用戶編輯的內容都保存到存儲介質上(一般都是數據庫 )。實際工作中因爲生命週期的變化而帶來的問題也很多,比如你的應用程序起了新的線程在跑,這時候中斷了,你還要去維護那個線程,是暫停還是殺掉還是數據回滾,是吧?因爲Activity可能被殺掉,所以線程中使用的變量和一些界面元素就千萬要注意了,一般我都是採用Android的消息機制 [Handler,Message]來處理多線程和界面交互的問題。

10、 讓Activity變成一個窗口:Activity屬性設定

在AndroidManifest.xml 中定義 Activity的 地方加一句話:

android:theme="@android:style/Theme.Dialog"(對話框)或者

android:theme="@android:style/Theme.Translucent" (半透明)

11、 你後臺的Activity被系統回收怎麼辦?

當你的程序中某一個Activity A 在運行時中,主動或被動地運行另一個新的Activity B 

  這個時候A會執行 

  Java代碼 

  1. public 

  2. void onSaveInstanceState(Bundle outState) { 

  3. super.onSaveInstanceState(outState); 

  4. outState.putLong("id", 1234567890); 

  5. } 

  public 

  void onSaveInstanceState(Bundle outState) { 

  super.onSaveInstanceState(outState); 

  outState.putLong("id", 1234567890); 

  } 

  B 完成以後又會來找A, 這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回 

  收的A就要重新調用onCreate()方法,不同於直接啓動的是這回onCreate()裏是帶上參數 

  savedInstanceState,沒被收回的就還是onResume就好了。 

  savedInstanceState是一個Bundle對象,你基本上可以把他理解爲系統幫你維護的一個Map對象。在onCreate()裏你可能會用到它,如果正常啓動onCreate就不會有它,所以用的時候要判斷一下是否爲空。 

  Java代碼 

  1. if(savedInstanceState != null){ 

  2. long id = savedInstanceState.getLong("id"); 

  3. } 

  if(savedInstanceState != null){ 

  long id = savedInstanceState.getLong("id"); 

  } 

  就像官方的Notepad教程 裏的情況,你正在編輯某一個note,突然被中斷,那麼就把這個note的id記住,再起來的時候就可以根據這個id去把那個note取出來,程序就完整一些。這也是看你的應用需不需要保存什麼,比如你的界面就是讀取一個列表,那就不需要特殊記住什麼,哦, 沒準你需要記住滾動條的位置...

12、 調用與被調用:我們的通信使者Intent

要說Intent了,Intent就是這個這個意圖 ,應用程序間Intent進行交流,打個電話啦,來個 

  電話啦都會發Intent, 這個是Android架構的鬆耦合的精髓部分,大大提高了組件的複用性,比如你要在你的應用程序中點擊按鈕,給某人打電話,很簡單啊,看下代碼先: 

  Java代碼 

  1. Intent intent = new Intent(); 

  2. intent.setAction(Intent.ACTION_CALL); 

  3. intent.setData(Uri.parse("tel:" + number)); 

4. startActivity(intent); 

  Intent intent = new Intent(); 

  intent.setAction(Intent.ACTION_CALL); 

  intent.setData(Uri.parse("tel:" + number)); 

  startActivity(intent); 

  扔出這樣一個意圖,系統看到了你的意圖就喚醒了電話撥號程序,打出來電話。什麼讀聯繫人,發短信啊,郵件啊,統統只需要扔出intent就好了,這個部分設計 地確實很好啊。 

  那Intent通過什麼來告訴系統需要誰來接受他呢? 

  通常使用Intent有兩種方法,第一種是直接說明需要哪一個類來接收代碼如下: 

  Java代碼 

  1. Intent intent = new Intent(this, MyActivity.class); 

  2. intent.getExtras().putString("id", "1"); 

  3. tartActivity(intent); 

  Intent intent = new Intent(this, MyActivity.class); 

  intent.getExtras().putString("id", "1"); 

  tartActivity(intent); 

  第一種方式很明顯,直接指定了MyActivity爲接受者,並且傳了一些數據給MyActivity,在MyActivity裏可以用getIntent()來的到這個intent和數據。 

  第二種就需要先看一下AndroidMenifest中的intentfilter的配置了 

  Xml代碼 

  < intent-filter> 

  < action android:name="android.intent.action.VIEW" 

  /> 

  < action android:value="android.intent.action.EDIT" 

  /> 

  < action android:value="android.intent.action.PICK" 

  /> 

  < category android:name="android.intent.category.DEFAULT" 

  /> 

  < data android:mimeType="vnd.android.cursor.dir/vnd.google.note" 

  /> 

  < /intent-filter> 

  這裏面配置用到了action, data, category這些東西,那麼聰明的你一定想到intent裏也會有這些東西,然後一匹配不就找到接收者了嗎? 

  action其實就是一個意圖的字符串名稱。 

  上面這段intent-filter的配置文件說明了這個Activity可以接受不同的Action,當然相應的程序邏輯也不一樣咯,提一下那個 mimeType,他是在ContentProvider裏定義的,你要是自己實現一個ContentProvider就知道了,必須指定 

mimeType才能讓數據被別人使用。 

  不知道原理說明白沒,總結一句,就是你調用別的界面不是直接new那個界面,而是通過扔出一個intent,讓系統幫你去調用那個界面,這樣就多麼鬆藕合啊,而且符合了生命週期被系統管理的原則。 

  想知道category都有啥,Android爲你預先定製好的action都有啥等等,請親自訪問官方鏈接Intent 

  ps:想知道怎麼調用系統應用程序的同學,可以仔細看一下你的logcat,每次運行一個程序的時候是不是有一些信息比如: 

  Starting activity: Intent { action=android.intent.action.MAINcategories={android.intent.category.LAUNCHER} flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker} } 

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

1,藉助系統的API 

首先,2.2以前和2.2以後採用的方法是不同的。但都是針對系統級別的東西進行操作。從進程和包的角度來達到此效果。 

所以需要添加授權,但是遺憾的是,這些方法涉及底層,而且在我們的應用中是起不到效果的。 這個方案被我排除了。 


2,拋出異常,Force Close 

這個我覺得很不靠譜。這確實能一下子退出應用。 

但是,其一:不能保證所有的Activity都被finish;其二:Force Close的窗口,這個是很糟糕的,當然可以重寫一些方法,使不彈出這個窗口。 

這個方案也被我排除了。 


3,遞歸退出 

使用startActivityForResult打開新的Activity,並加上標識。 

在onActivityResult中進行處理,遞歸關閉。 

這個方式我不是很清楚其具體做法,感覺有些複雜。 


4,發送特定廣播 

這個辦法是我最贊同的,但是實際操作起來確遇到了問題。 

首先看onReceive(Context context, Intent intent)方法, 

可以通過context取得ActivityManager,之後取得當前運行的task的信息,看起來離成功不遠了。 

Activity是被組織在task中的,獲得了task信息,那是不是就可以取得其中的Activity實例? 

先看看代碼: 


//通過context獲取系統服務,得到ActivityManager

ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

//獲取當前運行中的TaskInfo 

//獲取的是一個List集合,也就是說當前系統中的task有多個,在我測試代碼中有2個

//關於該方法的參數,我從源碼看了下,是指返回集合的最大可能條目數,實際返回數可能

//小於這個數目,取決於用戶啓動了幾個task

List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(10);


包含task信息的是一個ActivityManager的靜態內部類,RunningTaskInfo。 

不過從中能取得的信息有限: 


//task棧底的Activity

ComponentName baseActivity = task.baseActivity;

//task棧頂的Activity

ComponentName topActivity = task.topActivity;


這就有兩個問題, 

其一,無法取得task中的每一個Activity 

其二,不能取得Activity的實例 

我的研究到此止步,希望有達人能爲我解惑。 


5,記錄每一個創建的Activity,這也是我最後採用的方法。 

爲入口Activity添加一個靜態的List<Activity>, 

之後,每一個Activiity的onCreate方法中,將自身加入這個List, 

當程序退出時,遍歷這個List,執行finish方法 


    for (Activity act : MainActivity.tasks) {

           if(!act.isFinishing()){

              act.finish();

           }

       }

       MainActivity.tasks = null;


測試了一下,能達到效果。 

但是還是有一點擔心,這就是Activity成員變量的生命週期問題, 

當該成員變量的生命週期大於Activity的生命週期,就有可能造成內存泄露。

14、 請介紹下Android中常用的五種佈局

Android佈局是應用界面開發的重要一環,在Android中,共有五種佈局方式,分別是:FrameLayout(框架佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)


   一、FrameLayout

    這個佈局可以看成是牆腳堆東西,有一個四方的矩形的左上角牆腳,我們放了第一個東西,要再放一個,那就在放在原來放的位置的上面,這樣依次的放,會蓋住原來的東西。這個佈局比較簡單,也只能放一點比較簡單的東西。    


    二、LinearLayout

 線性佈局,這個東西,從外框上可以理解爲一個div,他首先是一個一個從上往下羅列在屏幕上。每一個LinearLayout裏面又可分爲垂直佈局

(android:orientation="vertical")和水平佈局(android:orientation="horizontal" 

)。當垂直佈局時,每一行就只有一個元素,多個元素依次垂直往下;水平佈局時,只有一行,每一個元素依次向右排列。  linearLayout中有一個重要的屬性 android:layout_weight="1",這個weight在垂直佈局時,代表行距;水平的時候代表列寬;weight值越大就越大。    

    三、AbsoluteLayout    

絕對佈局猶如div指定了absolute屬性,用X,Y座標來指定元素的位置android:layout_x="20px" 

android:layout_y="12px" 這種佈局方式也比較簡單,但是在垂直隨便切換時,往往會出問題,而且多個元素的時候,計算比較麻煩。

     四、RelativeLayout

    相對佈局可以理解爲某一個元素爲參照物,來定位的佈局方式。主要屬性有:

        相對於某一個元素

    android:layout_below="@id/aaa" 該元素在 id爲aaa的下面

    android:layout_toLeftOf="@id/bbb" 改元素的左邊是bbb

        相對於父元素的地方

     android:layout_alignParentLeft="true"  在父元素左對齊

    android:layout_alignParentRight="true" 在父元素右對齊

        還可以指定邊距等,具體詳見API

五。TableLayout

       表格佈局類似Html裏面的Table。每一個TableLayout裏面有表格行TableRow,TableRow裏面可以具體定義每一個元素,設定他的對齊方式 android:gravity="" 。

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

Android提供了5種方式存儲數據:

1.使用SharedPreferences存儲數據;

2.文件存儲數據;

3.SQLite數據庫存儲數據;

4.使用ContentProvider存儲數據;

5.網絡存儲數據;

其中3,4已經在Android SQLite解析、Android 應用程序之間數據共享篇幅中詳細說明,不在此重複說明,現將其他3種方式詳細介紹。

使用SharedPreferences存儲數據

首先說明SharedPreferences存儲方式,它是Android提供的用來存儲一些簡單配置信息的一種機制,例如:登錄用戶的用戶名與密碼。其採用了Map數據結構來存儲數據,以鍵值的方式存儲,可以簡單的讀取與寫入,具體實例如下:

void  ReadSharedPreferences()

{

String  strName,strPassword;

SharedPreferences   user = getSharedPreferences(“user_info”,0);

strName = user.getString(“NAME”,””);

strPassword = user getString(“PASSWORD”,””);

}

void  WriteSharedPreferences(String  strName,String strPassword)

{

SharedPreferences   user = getSharedPreferences(“user_info”,0);

uer.edit();

user.putString(“NAME”, strName);

user.putString(“PASSWORD” ,strPassword);

user.commit();

}

數據讀取與寫入的方法都非常簡單,只是在寫入的時候有些區別:先調用edit()使其處於編輯狀態,然後才能修改數據,最後使用commit()提交修改的數據。實際上SharedPreferences是採用了XML格式將數據存儲到設備中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。以上面的數據存儲結果爲例,打開後可以看到一個user_info.xml的文件,打開後可以看到:

<?xml version=”1.0″ encoding=”UTF-8″?>

<map>

<string name=”NAME”>moandroid</string>

<string name=” PASSWORD”>SharedPreferences</string>

</map>

使用SharedPreferences是有些限制的:只能在同一個包內使用,不能在不同的包之間使用。

文件存儲數據

文件存儲方式是一種較常用的方法,在Android中讀取/寫入文件的方法,與Java中實現I/O的程序是完全一樣的,提供了openFileInput()和openFileOutput()方法來讀取設備上的文件。FilterInputStream, FilterOutputStream等可以到Java  io  package說明中去詳細學習,不再此詳細說明,具體實例如下:

String fn = “moandroid.log”;

FileInputStream fis = openFileInput(fn);

FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);

除此之外,Android還提供了其他函數來操作文件,詳細說明請閱讀Android SDK。

網絡存儲數據

網絡存儲方式,需要與Android 網絡數據包打交道,關於Android 網絡數據包的詳細說明,請閱讀Android SDK引用了Java SDK的哪些package?。

總結說明

以上5中存儲方式,在以後的開發過程中,根據設計目標、性能需求、空間需求等找到合適的數據存儲方式。Android 中的數據存儲都是私有的,其他應用程序都是無法訪問的,除非通過ContentResolver獲取其他程序共享的數據。

16、 請介紹下ContentProvider是如何實現數據共享的

Android是如何實現應用程序之間數據共享的?一個應用程序可以將自己的數據完全暴露出去,外界更本看不到,也不用看到這個應用程序暴露的數據是如何存儲的,或者是使用數據庫還是使用文件,還是通過網上獲得,這些一切都不重要,重要的是外界可以通過這一套標準及統一的接口和這個程序裏的數據打交道,例如:添加(insert)、刪除(delete)、查詢(query)、修改(update),當然需要一定的權限纔可以。

如何將應用程序的數據暴露出去? Android提供了ContentProvider,一個程序可以通過實現一個Content provider的抽象接口將自己的數據完全暴露出去,而且Content providers是以類似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。要想使應用程序的數據公開化,可通過2種方法:創建一個屬於你自己的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型並且有寫入Content provider的權限。

17、 如何啓用Service,如何停用Service。

一.步驟

第一步:繼承Service類

public class SMSService extends Service { }


第二步:在AndroidManifest.xml文件中的<application>節點裏對服務進行配置:

<service android:name=".DemoService" />

二.Context.startService()和Context.bindService


服務不能自己運行,需要通過調用Context.startService()或Context.bindService()方法啓動服務。這兩個方法都可

以啓動Service,但是它們的使用場合有所不同。


1.使用startService()方法啓用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。


使用bindService()方法啓用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止。


2.採用Context.startService()方法啓動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,


接着調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調用onStart()方法。


採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。


3.採用Context.bindService()方法啓動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,


接着調用onBind()方法。這個時候調用者和服務綁定在一起,調用者退出了,系統就會先調用服務的onUnbind()方法,接着調用onDestroy()方法。如果調用bindService()方法前服務已經被綁定,多次調用bindService()方法並不會導致多次創建服務及綁定(也就是說onCreate()和onBind()方法並不會被多次調用)。如果調用者希望與正在綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致系統調用服務的onUnbind()-->onDestroy()方法。


1.Service常用生命週期回調方法如下:

onCreate() 該方法在服務被創建時調用,該方法只會被調用一次,無論調用多少次startService()或bindService()方法,


服務也只被創建一次。 onDestroy()該方法在服務被終止時調用。


2. Context.startService()啓動Service有關的生命週期方法


onStart() 只有採用Context.startService()方法啓動服務時纔會回調該方法。該方法在服務開始運行時被調用。


多次調用startService()方法儘管不會多次創建服務,但onStart() 方法會被多次調用。

3. Context.bindService()啓動Service有關的生命週期方法


onBind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務綁定時被調用,


當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用。


onUnbind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務解除綁定時被調用。


備註:


1.       採用startService()啓動服務    

Intent intent = new Intent(DemoActivity.this, DemoService.class);

   startService(intent);

2.       Context.bindService()啓動

Intent intent = new Intent(DemoActivity.this, DemoService.class);

    bindService(intent, conn, Context.BIND_AUTO_CREATE);

   //unbindService(conn);//解除綁定


18、 註冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意

兩種:一種是XML,一種是代碼註冊

      Xml註冊的優點是:方便,易讀

      缺點是當手機處於關機狀態時,仍然可以監聽到廣播,不靈活

      代碼註冊的優點:靈活,手機處於關機狀態時,不在監聽廣播

          缺點:不方便,不容易讀

1.    請描述下Activity的生命週期。


      答:onCreate(),Activity第一次加載時調用,用戶構建窗體。


           onStart()Activity能被用戶看到時調用


           onResume()Activity能夠得到用戶焦點時調用


           onRestart()Activity第二次被加載時調用,不在調用onCreate()


           onPause()Activity在啓動另一個activity時調用,推動用戶焦點


           onStop()Activity被第二個activity完全覆蓋時調用


           onDestory()Activity被第二個ActivitY從棧中取出時調用,也可以說第二個Activity反回第一個Activity時,Activity的onDestory,銷燬Activity。



2.    如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態?


       答:在系統回收或者用戶調用Finish方法 ,都會銷燬Activity,此時會調用Ondestory方法,利用onDestory方法保存Activity狀態。


3.    如何將一個Activity設置成窗口的樣式。(Edited by Sodino)


     答:在androidMinifest.xml文件中配置Activity的屬性的主題爲:


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


4.    如何退出Activity?如何安全退出已調用多個Activity的Application?


     答:單個的activity調用Finish,killprocess(),system.exit()方法退出


         多個Activity


          在2.1之前,可以使用ActivityManager的RestartPackage方法


          它可以直接結束整個應用,在使用時需要權限android.permission.RESTART_PACKAGES


           在2.2這個方法失效了,新添加了一個方法,killBackgroundProcesses().需要權限android.permission.KILL_BACKGTOUND_PROCESSE


5.    請介紹下Android中常用的五種佈局。


答:LinearLayout線性佈局


    RelativeLayout相對佈局


    AbsoluteLayout根據座標佈局


    TableLayout表格佈局


    FrameLayout幀佈局


6.    請介紹下Android的數據存儲方式。(Edited by Sodino)


     答:sharedPreferences鍵值對的存儲


         Sqllite數據庫存儲


         Files文件存儲


         NetWork網絡存儲


7.    請介紹下ContentProvider是如何實現數據共享的。(Edited by Sodino)


      答:ContentProvider負責:組織應用程序的數據,向其他應用程序提供數據;


           ContentResolver負責:獲取ContentProvider提供的數據,CRUD數據。


8.    如何啓用Service,如何停用Service。(Edited by Sodino)


      答:啓動Service


         Intent intent = new Intent(this,MyService.class);


         startService(intent);//啓動服務的調用者跟服務沒有任何關係,調用者退出服務不會有任何影響


         bindService(intent)//啓動後的調用者跟服務綁定在一起,調用者一點退出,服務也會終止


           停用Service


       stopServcie(intent)


       unbindService(intent)


9.    註冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。


      答:兩種:一種是XML,一種是代碼註冊


           Xml註冊的優點是:方便,易讀


           缺點是當手機處於關機狀態時,仍然可以監聽到廣播,不靈活


          代碼註冊的優點:靈活,手機處於關機狀態時,不在監聽廣播


          缺點:不方便,不容易讀


10.    請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係。


          答:Message Queue(消息列隊):用來存放通過Handler發佈的消息,通常附屬於某一創建它的線程,可以通過Looper.myQueue()得到當前線程的消息隊列


       Handler:可以發佈或者處理一個消息或者操作一個Runnable,通過Handler發佈消息,消息將只會發磅到與它關聯的消息隊列,然也只能處理該消息隊列中的消息


        Looper:是Handler和消息隊列之間通訊的橋樑,程序組件首先通過Handler把消息傳遞給Looper,Looper把消息放入隊列,Looper也把消息隊列裏的消息廣播給所有的Handler,handler接受到消息後調用HandlerMessage進行處理


        Message:消息的類型 ,在Handler類中的HandlerMessage方法中得到單個的消息進行處理


11.    AIDL的全稱是什麼?如何工作?能處理哪些類型的數據?




12.    請解釋下Android程序運行時權限與文件系統權限的區別。(Edited by Sodino)


13.    系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由。


14.    有一個一維整型數組int[]data保存的是一張寬爲width,高爲height的圖片像素值信息。請寫一個算法,將該圖片所有的白色不透明(0xffffffff)像素點的透明度調整爲50%。


15.    你如何評價Android系統?優缺點。


答:優點:1、學習的開源性

   2、軟件兼容性比較好

   3、軟件發展迅速

   4、界面佈局好

   缺點:1、版本過多

   2、先有軟件少

   3、商務性能差


20、簡述Andrid應用程序的結構是哪些?

答:Linux Kernel(Linux 內核)、Libraries(系統運行類庫或者C/C++核心庫)、Application Framawork(開源框架)、Applications(核心應用程序)

21、什麼是ANR,如何避免它?

答:ANR(Application Not Responding):應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱作應用程序無響應的對話框

避免ANR:Android應用程序通常運行在一個單獨的線程裏面,稱謂主線程,所以在主線程裏面少做一些耗時長的程序,而是利用子線程來操作一些繁瑣的事情,用Handler來把子線程處理的消息返回給主線程

22、簡要解釋一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver

答:activity呈現了一個用戶可以操作的可視化用戶界面

service不包含可見的用戶界面,而是在後臺無限地運行可以連接到一個正在運行的服務中,連接後,可以通過服務中暴露出來的藉口與其進行通信

broadcast receiver是一個接收廣播消息並作出迴應的component,broadcast receiver沒有界面

intent:content provider在接收到ContentResolver的請求時被激活。

activity, service和broadcast receiver是被稱爲intents的異步消息激活的。

一個intent是一個Intent對象,它保存了消息的內容。對於activity和service來說,它指定了請求的操作名稱和待操作數據的URIIntent對象可以顯式的指定一個目標component。如果這樣的話,android會找到這個component(基於manifest文件中的聲明)並激活它。但如果一個目標不是顯式指定的,android必須找到響應intent的最佳component。它是通過將Intent對象和目標的intent filter相比較來完成這一工作的。一個component的intent filter告訴android該component能處理的intent。intent filter也是在manifest文件中聲明的


1、什麼是ANR 如何避免它? 

  答:ANR:Application Not Responding,五秒 

在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應。當出現下列情況時,Android就會顯示ANR對話框了: 

  對輸入事件(如按鍵、觸摸屏事件)的響應超過5秒 

  意向接受器(intentReceiver)超過10秒鐘仍未執行完畢 

  Android應用程序完全運行在一個獨立的線程中(例如main)。這就意味着,任何在主線程中運行的,需要消耗大量時間的操作都會引發ANR。因爲此時,你的應用程序已經沒有機會去響應輸入事件和意向廣播(Intent broadcast)。 

  因此,任何運行在主線程中的方法,都要儘可能的只做少量的工作。特別是活動生命週期中的重要方法如onCreate()和 onResume()等更應如此。潛在的比較耗時的操作,如訪問網絡和數據庫;或者是開銷很大的計算,比如改變位圖的大小,需要在一個單獨的子線程中完成(或者是使用異步請求,如數據庫操作)。但這並不意味着你的主線程需要進入阻塞狀態已等待子線程結束 -- 也不需要調用Therad.wait()或者Thread.sleep()方法。取而代之的是,主線程爲子線程提供一個句柄(Handler),讓子線程在即將結束的時候調用它(xing:可以參看Snake的例子,這種方法與以前我們所接觸的有所不同)。使用這種方法涉及你的應用程序,能夠保證你的程序對輸入保持良好的響應,從而避免因爲輸入事件超過5秒鐘不被處理而產生的ANR。這種實踐需要應用到所有顯示用戶界面的線程,因爲他們都面臨着同樣的超時問題。 

  2、什麼情況會導致Force Close ?如何避免?能否捕獲導致其的異常? 

  答:一般像空指針啊,可以看起logcat,然後對應到程序中 來解決錯誤 

  3、Android本身的api並未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會導致什麼問題?如何解決? 

  4、簡要解釋一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver 

  答:一個activity呈現了一個用戶可以操作的可視化用戶界面 

  一個service不包含可見的用戶界面,而是在後臺無限地運行 

  可以連接到一個正在運行的服務中,連接後,可以通過服務中暴露出來的藉口與其進行通信 

  一個broadcast receiver是一個接收廣播消息並作出迴應的component,broadcast receiver沒有界面 

  intent:content provider在接收到ContentResolver的請求時被激活。 

  activity, service和broadcast receiver是被稱爲intents的異步消息激活的。 

一個intent是一個Intent對象,它保存了消息的內容。對於activity和service來說,它指定了請求的操作名稱和待操作數據的URI 

  Intent對象可以顯式的指定一個目標component。如果這樣的話,android會找到這個component(基於manifest文件中的聲明)並激活它。但如果一個目標不是顯式指定的,android必須找到響應intent的最佳component。 

  它是通過將Intent對象和目標的intent filter相比較來完成這一工作的。一個component的intent filter告訴android該component能處理的intent。intent filter也是在manifest文件中聲明的。 

  5、IntentService有何優點? 

  答:IntentService 的好處 

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

  * Android的進程處理器現在會儘可能的不kill掉你 

  * 非常容易使用 

  6、橫豎屏切換時候activity的生命週期? 

  1、不設置Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次 

  2、設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次 

  3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法 

  1. 如何將SQLite數據庫(dictionary.db文件)與apk文件一起發佈? 

  解答:可以將dictionary.db文件複製到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。可以將dictionary.db文件複製到res aw目錄中 

  2. 如何將打開res aw目錄中的數據庫文件? 

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

  3. Android引入廣播機制的用意? 

  答:a:從MVC的角度考慮(應用程序內) 

  其實回答這個問題的時候還可以這樣問,android爲什麼要有那4大組件,現在的移動開發模型基本上也是照搬的web那一套MVC架構,只不過是改了點嫁妝而已。android的四大組件本質上就是爲了實現移動或者說嵌入式設備上的MVC架構,它們之間有時候是一種相互依存的關係,有時候又是一種補充關係,引入廣播機制可以方便幾大組件的信息和數據交互。 

  b:程序間互通消息(例如在自己的應用程序內監聽系統來電) 

  c:效率上(參考UDP的廣播協議在局域網的方便性) 

  d:設計模式上(反轉控制的一種應用,類似監聽者模式)



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章