Android 基礎知識複習

Android

 

40基礎知識點

一、        Android的四大組件是哪些,它們的做用?javascript

Android 開發的四大組件分別是:活動(activity),用於表現功能;服務(service),後臺運行服務,不提供界面呈現;廣播接受者(Broadcast Receive),敢於接收廣播;內容提供者(Content Provider),支持多個應用中存儲和讀取數據,至關於數據庫。html

1.活動java

Android中,activity是全部程序的根本,全部程序的流程都運行在activity之中,activity能夠算是開發者遇到的最頻繁,也是android當中最基本的模塊之一。在android的程序中,activity通常表明手機屏幕的一屏。若是把手機比做一個瀏覽器,那麼activity就至關於一個網頁。在activity當中能夠添加一些Button、Checkbox等控件,能夠看到activity概念和網頁的概念至關相似。linux

通常一個android應用是由多個activity組成的,這多個activity之間能夠進行相互跳轉。例如,按下一個Button按鈕後,可能會跳轉到其餘的activity,與網頁跳轉稍微有點不同的是,activity之間的跳轉有可能返回值。例如,從activity A跳轉到activity B,那麼當activity B運行結束時,有可能會給activity A一個返回值。這樣作在不少時候是至關方便的。android

當打開一個新的屏幕時,以前一個屏幕會被置爲暫停狀態,而且壓入歷史堆棧中。用戶能夠經過回退操做返回到之前打開過的屏幕。能夠選擇性的一處一些沒有必要保留的屏幕,由於Android會把每一個應用的開始到當前的每一個屏幕保存在堆棧中。c++

2.服務web

Service是android系統中的一種組件,跟activity的級別差很少,可是他不能本身運行,只能後臺運行,而且能夠和其餘組件進行交互。Service是沒有界面長生命週期的代碼。Service是一種程序,能夠運行很長時間的,可是卻沒有用戶界面。這麼說有點枯燥,來看個例子。打開一個音樂播放器的程序,這時若是想上網,那麼打開Android瀏覽器,這時雖然已經進入瀏覽器這個程序,可是歌曲播放並無中止,而是在後臺繼續一首接一首的播放,其實這個播放就是由播放音樂的Service進行控制。固然這個播放音樂的Service也能夠中止。例如,當播放列表裏的歌曲都結束,或用戶按下了中止音樂播放的快捷鍵等。Service能夠在不少場合的應用中使用,如播放多媒體時用戶啓動了其餘Activity,這時程序要在後臺繼續播放,好比檢測SD卡上文件的變化,或在後臺記錄地理信息位置的改變等,而服務卻藏在後臺。算法

開啓Service有兩種方式:sql

(1)Context.starService():Service會經歷onCreat  ——>onStar(若是Service尚未運行,則Android先調用onCreat(),而後調用onStar(),因此一個Service的onStar方能會重複調用屢次);若是是調用者本身直接退出而沒有調用StopService,服務會一直在後臺運行。該服務的調用者再啓動起來後能夠經過stopService關閉服務。注意,屢次調用Context.starService()不會被嵌套(即便會有相應的onStar()方法被調用),因此不管同一個服務被啓動多少次,一旦調用Context.stopService()或者StopSelf(),都會被中止。數據庫

說明:傳遞給starService()的Intent對象會傳遞給onStar()方法。調用順序爲onCreat——onStar(可調用屢次)——onDestroy.

(2)Context.bindService():服務會經歷onCreate()——onBind(),onBind將返回給客戶端一個IBind接口實例,IBind容許客戶端回調服務的方法,好比獲得服務運行的狀態或其餘操做。這個時候把調用者(Context,如Activity)會和服務綁定在一塊兒,Context退出了,服務就會調用onUnbind——onDestroy相應退出,所謂綁定在一塊兒就是「共存亡」了。

3.廣播接收器

在Android中,廣播是一種普遍運用的在應用程序之間傳輸信息的機制。而廣播接收器是對發送出來的廣播進行過濾接受並響應的一類組件。能夠使用廣播接收器來讓應用對一個外部時間作出響應。例如,當電話呼入這個外部事件到來時,能夠利用廣播接收器進行處理。當下載一個程序成功完成時,仍然能夠利用廣播接收器進行處理。廣播接收器不NotificationManager來通知用戶這些事情發生了。廣播接收器既能夠在AndroidManifest.xml中註冊,也能夠在運行時的代碼中使用Context.registerReceive()進行註冊。只要是註冊了,當事件來臨時,即便程序沒有啓動,系統也在須要的時候啓動程序。各類應用還能夠經過使用Context.sendBroadcast()將它們本身的Intent廣播給其餘應用程序。

4.內容提供者

內容提供者(Content Provider)是Android提供的第三方應用數據的訪問方案。

在Android中,對數據的保護是很嚴密的,除了放在SD卡中的數據,一個應用所持有的數據庫、文件等內容,都是不容許其餘直接訪問的。Android固然不會真的把每個應用都作成一座「孤島」,它爲全部應用都準備可一扇窗,這就是Content Provider。應用想對外提供的數據,能夠經過派生Content Provider類,封裝成一枚Content Provider。每一個Content Provider都用一個uri做爲獨立的標識,形如:content://com.xxxxx。全部應用看着像REST的樣子,但實際上它比REST更爲靈活。和REST相似,uri也能夠有兩種類型,一種是帶id的;另外一種是列表的,但實現者不須要按照這個模式來作,給id的uri也能夠返回列表類型的數據。

四大組件:

Activity  活動

開啓Activity有兩種方式:

(1)

      Intent intent = new Intent(MainActivity.this, SecondActivity.class);     startActivity (Intent intent, int requestCode);

(2)

      Intent intent = new Intent(MainActivity.this, SecondActivity.class);     startActivityForResult(Intent intent, int requestCode); 

service   服務

Service很是適用於去執行那些不須要和用戶交互並且還要長期運行在後臺的任務。Service默認線程爲UI線程,不要在Service中執行耗時的操做,除非你在Service中建立了子線程來完成耗時操做.

Service的運行不依賴於任何用戶界面,即便程序被切換到後臺或者用戶打開另外一個應用程序,Service仍然可以保持正常運行,這也正是Service的使用場景。當某個應用程序進程被殺掉時,全部依賴於該進程的Service也會中止運行.Service也是四大組件之一,因此必須在AndroidManifest中配置<service android:name=".BackGroupService" />

開啓Service有兩種方式:

(1)Context.starService()

(2)Context.bindService()

Content Provider    內容提供者

ContentProvider 主要用於在不一樣的應用程序之間實現數據共享的功能。

它提供了一套完整的機制,容許一個程序訪問另一個程序的數據,同時還能保證被訪問數據的安全性。目前使用 Content Provider 是 Android 實現跨進稱共享數據的標準方式。

Content Provider 不一樣於 文件存儲 和 ShardPreferences存儲 全局可讀寫操做模式,它能夠選擇只對哪一部分數據進行共享,從而保證咱們程序中的隱私數據不會有泄漏的風險。

Content Provider 的用法通常有兩種:

1> 使用現有的內容提供器來讀取和操做相應程序中的數據; 

2> 建立本身的內容提供器給咱們程序的數據提供外部訪問接口

若是一個應用程序經過內容提供器對其數據提供了外部訪問接口,那麼任何其餘的應用程序就均可以對這部分數據進行訪問。 例如:系統中自帶的電話簿、短信、媒體庫等

程序都提供了相似的訪問接口,這就使得第三方應用程序能夠充分的利用這部分數據來實現更好的功能。

BroadCast Receiver  廣播接收器

廣播接收器既能夠在AndroidManifest.xml中註冊,也能夠在運行時的代碼中使用Context.registerReceive()進行註冊。只要是註冊了,當事件來臨時,即便程序沒有啓動,系統也在須要的時候啓動程序。各類應用還能夠經過使用Context.sendBroadcast()將它們本身的Intent廣播給其餘應用程序

五種佈局:

1.Framelayout      框架佈局

2.LinearLayout     線性佈局  垂直 android:orientation:="vertical"  水平 andriod:orientation="horizontal"

3.AbsoluteLayout   絕對佈局

4.RelativeLayout   相對佈局

5.TableLayout      表格佈局

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

經常使用五種佈局方式,分別是:FrameLayout(框架佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)。

1、FrameLayout:全部東西依次都放在左上角,會重疊,這個佈局比較簡單,也只能放一點比較簡單的東西。

2、LinearLayout:線性佈局,每個LinearLayout裏面又可分爲垂直佈局(android:orientation="vertical")和水平佈局(android:orientation="horizontal" )。當垂直佈局時,每一行就只有一個元素,多個元素依次垂直往下;水平佈局時,只有一行,每個元素依次向右排列。

3、AbsoluteLayout:絕對佈局用X,Y座標來指定元素的位置,這種佈局方式也比較簡單,可是在屏幕旋轉時,每每會出問題,並且多個元素的時候,計算比較麻煩。

4、RelativeLayout:相對佈局能夠理解爲某一個元素爲參照物,來定位的佈局方式。主要屬性有:相對於某一個元素android:layout_below、      android:layout_toLeftOf相對於父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;

5、TableLayout:表格佈局,每個TableLayout裏面有表格行TableRow,TableRow裏面能夠具體定義每個元素。每個佈局都有本身適合的方式,這五個佈局元素能夠相互嵌套應用,作出美觀的界面。

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

一、Drawable Animation

幀動畫,Frame動畫,指經過指定的每一幀的圖片和播放時間,有序的進行播放而造成的動畫效果

二、View Animation

視圖動畫,也就是所謂的補間動畫。指經過指定View的初始狀態、變化時間、方式、經過一系列的算法去進行圖片變換,從而實現動畫效果。主要有scale、alpha、Translate、Rotate四種效果。 
注意:只是在視圖層實現了動畫效果,並無真正改變View的屬性。

三、Property Animation

屬性動畫,經過不斷地改變View的屬性,不斷重繪而造成動畫效果。相比較視圖動畫,View的屬性是真正改變了。 
注意:Android3.0(API 11)以上才支持

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

答:XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發咱們使用Dom相對輕鬆些,但一些性能敏感的數據庫或手機上仍是主要採用SAX方式,SAX讀取是單向的,優勢:不佔內存空間、解析屬性方便,但缺點就是對於套嵌多個分支來講處理不是很方便。而DOM方式會把整個XML文件加載到內存中去,這裏Android開發網提醒你們該方法在查找方面能夠和XPath很好的結合若是數據量不是很大推薦使用,而PULL經常用在J2ME對於節點處理比較好,相似SAX方式,一樣很節省內存,在J2ME中咱們常用的KXML庫來解析。

5 ListView的優化方案

答:一、若是自定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否爲null,若是爲null就建立contentView並返回,若是不爲null則直接使用。在這個方法中儘量少建立view。

  二、給contentView設置tag(setTag()),傳入一個viewHolder對象,用於緩存要顯示的數據,能夠達到圖像數據異步加載的效果。

  三、若是listview須要顯示的item不少,就要考慮分頁加載。好比一共要顯示100條或者更多的時候,咱們能夠考慮先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條。

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

答:使用SharedPreferences存儲數據;文件存儲數據;SQLite數據庫存儲數據;使用ContentProvider存儲數據;網絡存儲數據;

Preference,File, DataBase這三種方式分別對應的目錄是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。

一:使用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下。使用SharedPreferences是有些限制的:只能在同一個包內使用,不能在不一樣的包之間使用。

二:文件存儲數據

文件存儲方式是一種較經常使用的方法,在Android中讀取/寫入文件的方法,與 Java中實現I/O的程序是徹底同樣的,提供了openFileInput()和openFileOutput()方法來讀取設備上的文件。具體實例以下:

String fn = 「moandroid.log」;

FileInputStream fis = openFileInput(fn);

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

三:網絡存儲數據

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

四:ContentProvider

一、ContentProvider簡介

當應用繼承ContentProvider類,並重寫該類用於提供數據和存儲數據的方法,就能夠向其餘應用共享其數據。雖然使用其餘方法也能夠對外共享數據,但數據訪問方式會因數據存儲的方式而不一樣,如:採用文件方式對外共享數據,須要進行文件操做讀寫數據;採用sharedpreferences共享數據,須要使用sharedpreferences API讀寫數據。而使用ContentProvider共享數據的好處是統一了數據訪問方式。

二、Uri類簡介

Uri表明了要操做的數據,Uri主要包含了兩部分信息:1.須要操做的ContentProvider ,2.對ContentProvider中的什麼數據進行操做,一個Uri由如下幾部分組成:

1.scheme:ContentProvider(內容提供者)的scheme已經由Android所規定爲:content://…

2.主機名(或Authority):用於惟一標識這個ContentProvider,外部調用者能夠根據這個標識來找到它。

3.路徑(path):能夠用來表示咱們要操做的數據,路徑的構建應根據業務而定,以下:

要操做contact表中id爲10的記錄,能夠構建這樣的路徑:/contact/10

要操做contact表中id爲10的記錄的name字段, contact/10/name

要操做contact表中的全部記錄,能夠構建這樣的路徑:/contact?

要操做的數據不必定來自數據庫,也能夠是文件等他存儲方式,以下:

要操做xml文件中contact節點下的name節點,能夠構建這樣的路徑:/contact/name

若是要把一個字符串轉換成Uri,能夠使用Uri類中的parse()方法,以下:

Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")

三、UriMatcher、ContentUrist和ContentResolver簡介

由於Uri表明了要操做的數據,因此咱們很常常須要解析Uri,並從 Uri中獲取數據。Android系統提供了兩個用於操做Uri的工具類,分別爲UriMatcher 和ContentUris 。掌握它們的使用,會便於咱們的開發工做。

UriMatcher:用於匹配Uri,它的用法以下:

1.首先把你須要匹配Uri路徑所有給註冊上,以下:

//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼(-1)。

UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

//若是match()方法匹配content://com.changcheng.sqlite.provider.contactprovider /contact路徑,返回匹配碼爲1

uriMatcher.addURI(「com.changcheng.sqlite.provider.contactprovider」, 「contact」, 1);//添加須要匹配uri,若是匹配就會返回匹配碼

//若是match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路徑,返回匹配碼爲2

uriMatcher.addURI(「com.changcheng.sqlite.provider.contactprovider」, 「contact/#」, 2);//#號爲通配符

2.註冊完須要匹配的Uri後,就能夠使用uriMatcher.match(uri)方法對輸入的Uri進行匹配,若是匹配就返回匹配碼,匹配碼是調用 addURI()方法傳入的第三個參數,假設匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回的匹配碼爲1。

ContentUris:用於獲取Uri路徑後面的ID部分,它有兩個比較實用的方法:

withAppendedId(uri, id)用於爲路徑加上ID部分

parseId(uri)方法用於從路徑中獲取ID部分

ContentResolver:當外部應用須要對ContentProvider中的數據進行添加、刪除、修改和查詢操做時,能夠使用 ContentResolver 類來完成,要獲取ContentResolver 對象,能夠使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,來操做數據。

7activity的啓動模式有哪些?是什麼含義?

答:在android裏,有4種activity的啓動模式,分別爲:

「standard」 (默認)

「singleTop」

「singleTask」

「singleInstance」

它們主要有以下不一樣:

1. 如何決定所屬task

「standard」和」singleTop」的activity的目標task,和收到的Intent的發送者在同一個task內,除非intent包括參數FLAG_ACTIVITY_NEW_TASK。

若是提供了FLAG_ACTIVITY_NEW_TASK參數,會啓動到別的task裏。

「singleTask」和」singleInstance」老是把activity做爲一個task的根元素,他們不會被啓動到一個其餘task裏。

2. 是否容許多個實例

「standard」和」singleTop」能夠被實例化屢次,而且存在於不一樣的task中,且一個task能夠包括一個activity的多個實例;

「singleTask」和」singleInstance」則限制只生成一個實例,而且是task的根元素。 singleTop要求若是建立intent的時候棧頂已經有要建立的Activity的實例,則將intent發送給該實例,而不發送給新的實例。

3. 是否容許其它activity存在於本task內

「singleInstance」獨佔一個task,其它activity不能存在那個task裏;若是它啓動了一個新的activity,無論新的activity的launch mode 如何,新的activity都將會到別的task裏運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。

而另外三種模式,則能夠和其它activity共存。

4. 是否每次都生成新實例

「standard」對於沒一個啓動Intent都會生成一個activity的新實例;

「singleTop」的activity若是在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,不然,生成該activity的實例。

好比如今task棧元素爲A-B-C-D(D在棧頂),這時候給D發一個啓動intent,若是D是 「standard」的,則生成D的一個新實例,棧變爲A-B-C-D-D。

若是D是singleTop的話,則不會生產D的新實例,棧狀態仍爲A-B-C-D

若是這時候給B發Intent的話,無論B的launchmode是」standard」 仍是 「singleTop」 ,都會生成B的新實例,棧狀態變爲A-B-C-D-B。

「singleInstance」是其所在棧的惟一activity,它會每次都被重用。

「singleTask」若是在棧頂,則接受intent,不然,該intent會被丟棄,可是該task仍會回到前臺。

當已經存在的activity實例處理新的intent時候,會調用onNewIntent()方法 若是收到intent生成一個activity實例,那麼用戶能夠經過back鍵回到上一個狀態;若是是已經存在的一個activity來處理這個intent的話,用戶不能經過按back鍵返回到這以前的狀態。

8、跟activityTask 有關的 Intent啓動方式有哪些?其含義?

核心的Intent Flag有:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_NEW_TASK

  若是設置,這個Activity會成爲歷史stack中一個新Task的開始。一個Task(從啓動它的Activity到下一個Task中的 Activity)定義了用戶能夠遷移的Activity原子組。Task能夠移動到前臺和後臺;在某個特定Task中的全部Activity老是保持相同的次序。

  這個標誌通常用於呈現「啓動」類型的行爲:它們提供用戶一系列能夠單獨完成的事情,與啓動它們的Activity徹底無關。

使用這個標誌,若是正在啓動的Activity的Task已經在運行的話,那麼,新的Activity將不會啓動;代替的,當前Task會簡單的移入前臺。參考FLAG_ACTIVITY_MULTIPLE_TASK標誌,能夠禁用這一行爲。

  這個標誌不能用於調用方對已經啓動的Activity請求結果。

FLAG_ACTIVITY_CLEAR_TOP

  若是設置,而且這個Activity已經在當前的Task中運行,所以,再也不是從新啓動一個這個Activity的實例,而是在這個Activity上方的全部Activity都將關閉,而後這個Intent會做爲一個新的Intent投遞到老的Activity(如今位於頂端)中。

  例如,假設一個Task中包含這些Activity:A,B,C,D。若是D調用了startActivity(),而且包含一個指向Activity B的Intent,那麼,C和D都將結束,而後B接收到這個Intent,所以,目前stack的情況是:A,B。

  上例中正在運行的Activity B既能夠在onNewIntent()中接收到這個新的Intent,也能夠把本身關閉而後從新啓動來接收這個Intent。若是它的啓動模式聲明爲 「multiple」(默認值),而且你沒有在這個Intent中設置FLAG_ACTIVITY_SINGLE_TOP標誌,那麼它將關閉而後從新建立;對於其它的啓動模式,或者在這個Intent中設置FLAG_ACTIVITY_SINGLE_TOP標誌,都將把這個Intent投遞到當前這個實例的onNewIntent()中。

  這個啓動模式還能夠與FLAG_ACTIVITY_NEW_TASK結合起來使用:用於啓動一個Task中的根Activity,它會把那個Task中任何運行的實例帶入前臺,而後清除它直到根Activity。這很是有用,例如,當從Notification Manager處啓動一個Activity。

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

    若是設置這個標誌,這個activity無論是從一個新的棧啓動仍是從已有棧推到棧頂,它都將以the front door of the task的方式啓動。這就講致使任何與應用相關的棧都講重置到正常狀態(無論是正在講activity移入仍是移除),若是須要,或者直接重置該棧爲初始狀態。

FLAG_ACTIVITY_SINGLE_TOP

  若是設置,當這個Activity位於歷史stack的頂端運行時,再也不啓動一個新的

FLAG_ACTIVITY_BROUGHT_TO_FRONT

  這個標誌通常不是由程序代碼設置的,如在launchMode中設置singleTask模式時系統幫你設定。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

  若是設置,這將在Task的Activity stack中設置一個還原點,當Task恢復時,須要清理Activity。也就是說,下一次Task帶着 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標記進入前臺時(典型的操做是用戶在主畫面重啓它),這個Activity和它之上的都將關閉,以致於用戶不能再返回到它們,可是能夠回到以前的Activity。

  這在你的程序有分割點的時候頗有用。例如,一個e-mail應用程序可能有一個操做是查看一個附件,須要啓動圖片瀏覽Activity來顯示。這個 Activity應該做爲e-mail應用程序Task的一部分,由於這是用戶在這個Task中觸發的操做。然而,當用戶離開這個Task,而後從主畫面選擇e-mail app,咱們可能但願回到查看的會話中,但不是查看圖片附件,由於這讓人困惑。經過在啓動圖片瀏覽時設定這個標誌,瀏覽及其它啓動的Activity在下次用戶返回到mail程序時都將所有清除。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

  若是設置,新的Activity不會在最近啓動的Activity的列表中保存。

FLAG_ACTIVITY_FORWARD_RESULT

  若是設置,而且這個Intent用於從一個存在的Activity啓動一個新的Activity,那麼,這個做爲答覆目標的Activity將會傳到這個新的Activity中。這種方式下,新的Activity能夠調用setResult(int),而且這個結果值將發送給那個做爲答覆目標的 Activity。

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

  這個標誌通常不禁應用程序代碼設置,若是這個Activity是從歷史記錄裏啓動的(常按HOME鍵),那麼,系統會幫你設定。

FLAG_ACTIVITY_MULTIPLE_TASK

  不要使用這個標誌,除非你本身實現了應用程序啓動器。與FLAG_ACTIVITY_NEW_TASK結合起來使用,能夠禁用把已存的Task送入前臺的行爲。當設置時,新的Task老是會啓動來處理Intent,而無論這是是否已經有一個Task能夠處理相同的事情。

  因爲默認的系統不包含圖形Task管理功能,所以,你不該該使用這個標誌,除非你提供給用戶一種方式能夠返回到已經啓動的Task。

  若是FLAG_ACTIVITY_NEW_TASK標誌沒有設置,這個標誌被忽略。

FLAG_ACTIVITY_NO_ANIMATION

  若是在Intent中設置,並傳遞給Context.startActivity()的話,這個標誌將阻止系統進入下一個Activity時應用 Acitivity遷移動畫。這並不意味着動畫將永不運行——若是另外一個Activity在啓動顯示以前,沒有指定這個標誌,那麼,動畫將被應用。這個標誌能夠很好的用於執行一連串的操做,而動畫被看做是更高一級的事件的驅動。

FLAG_ACTIVITY_NO_HISTORY

  若是設置,新的Activity將再也不歷史stack中保留。用戶一離開它,這個Activity就關閉了。這也能夠經過設置noHistory特性。

FLAG_ACTIVITY_NO_USER_ACTION

  若是設置,做爲新啓動的Activity進入前臺時,這個標誌將在Activity暫停以前阻止從最前方的Activity回調的onUserLeaveHint()。

  典型的,一個Activity能夠依賴這個回調指明顯式的用戶動做引發的Activity移出後臺。這個回調在Activity的生命週期中標記一個合適的點,並關閉一些Notification。

  若是一個Activity經過非用戶驅動的事件,如來電或鬧鐘,啓動的,這個標誌也應該傳遞給Context.startActivity,保證暫停的Activity不認爲用戶已經知曉其Notification。

FLAG_ACTIVITY_PREVIOUS_IS_TOP

  If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.

FLAG_ACTIVITY_REORDER_TO_FRONT

  若是在Intent中設置,並傳遞給Context.startActivity(),這個標誌將引起已經運行的Activity移動到歷史stack的頂端。

  例如,假設一個Task由四個Activity組成:A,B,C,D。若是D調用startActivity()來啓動Activity B,那麼,B會移動到歷史stack的頂端,如今的次序變成A,C,D,B。若是FLAG_ACTIVITY_CLEAR_TOP標誌也設置的話,那麼這個標誌將被忽略。

9請描述下Activity的生命週期。

答:activity的生命週期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();

可見生命週期:從onStart()直到系統調用onStop()

前臺生命週期:從onResume()直到系統調用onPause()

10 activity在屏幕旋轉時的生命週期

答:不設置Activity的android:configChanges時,切屏會從新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次;設置Activity的android:configChanges="orientation"時,切屏仍是會從新調用各個生命週期,切橫、豎屏時只會執行一次;設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法

11如何啓用Service,如何停用Service

服務的開發比較簡單,以下:

第一步:繼承Service類

1

public class SMSService extends Service {}

第二步:在AndroidManifest.xml文件中的<application>節點裏對服務進行配置:<service android:name=".SMSService" />

服務不能本身運行,須要經過調用Context.startService()或Context.bindService()方法啓動服務。這兩個方法均可以啓動Service,可是它們的使用場合有所不一樣。使用startService()方法啓用服務,調用者與服務之間沒有關連,即便調用者退出了,服務仍然運行。使用bindService()方法啓用服務,調用者與服務綁定在了一塊兒,調用者一旦退出,服務也就終止,大有「不求同時生,必須同時死」的特色。

若是打算採用Context.startService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法,接着調用onStart()方法。若是調用startService()方法前服務已經被建立,屢次調用startService()方法並不會致使屢次建立服務,但會致使屢次調用onStart()方法。採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。

若是打算採用Context.bindService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法,接着調用onBind()方法。這個時候調用者和服務綁定在一塊兒,調用者退出了,系統就會先調用服務的onUnbind()方法,接着調用onDestroy()方法。若是調用bindService()方法前服務已經被綁定,屢次調用bindService()方法並不會致使屢次建立服務及綁定(也就是說onCreate()和onBind()方法並不會被屢次調用)。若是調用者但願與正在綁定的服務解除綁定,能夠調用unbindService()方法,調用該方法也會致使系統調用服務的onUnbind()-->onDestroy()方法。

服務經常使用生命週期回調方法以下:

onCreate() 該方法在服務被建立時調用,該方法只會被調用一次,不管調用多少次startService()或bindService()方法,服務也只被建立一次。

onDestroy()該方法在服務被終止時調用。

與採用Context.startService()方法啓動服務有關的生命週期方法

onStart() 只有採用Context.startService()方法啓動服務時纔會回調該方法。該方法在服務開始運行時被調用。屢次調用startService()方法儘管不會屢次建立服務,但onStart() 方法會被屢次調用。

與採用Context.bindService()方法啓動服務有關的生命週期方法

onBind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,屢次調用Context.bindService()方法並不會致使該方法被屢次調用。

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

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

答:首先寫一個類要繼承BroadcastReceiver

第一種:在清單文件中聲明,添加

<receive android:name=".IncomingSMSReceiver " >

<intent-filter>

<action android:name="android.provider.Telephony.SMS_RECEIVED")

<intent-filter>

<receiver>

第二種使用代碼進行註冊如:

IntentFilter filter =  new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

IncomingSMSReceiver receiver = new IncomgSMSReceiver();

registerReceiver(receiver.filter);

兩種註冊類型的區別是:

1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命週期。

2)第二種是常駐型,也就是說當應用程序關閉後,若是有信息廣播來,程序也會被系統調用自動運行。

13請解釋下在單線程模型中MessageHandlerMessage QueueLooper之間的關係。

答:簡單的說,Handler獲取當前線程中的looper對象,looper用來從存放Message的MessageQueue中取出Message,再有Handler進行Message的分發和處理.

Message Queue(消息隊列):用來存放經過Handler發佈的消息,一般附屬於某一個建立它的線程,能夠經過Looper.myQueue()獲得當前線程的消息隊列

Handler:能夠發佈或者處理一個消息或者操做一個Runnable,經過Handler發佈消息,消息將只會發送到與它關聯的消息隊列,然也只能處理該消息隊列中的消息

Looper:是Handler和消息隊列之間通信橋樑,程序組件首先經過Handler把消息傳遞給Looper,Looper把消息放入隊列。Looper也把消息隊列裏的消息廣播給全部的

Handler:Handler接受到消息後調用handleMessage進行處理

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

在單線程模型下,爲了線程通訊問題,Android設計了一個Message Queue(消息隊列), 線程間能夠經過該Message Queue並結合Handler和Looper組件進行信息交換。下面將對它們進行分別介紹:

1. Message

    Message消息,理解爲線程間交流的信息,處理數據後臺線程須要更新UI,則發送Message內含一些數據給UI線程。

2. Handler

    Handler處理者,是Message的主要處理者,負責Message的發送,Message內容的執行處理。後臺線程就是經過傳進來的 Handler對象引用來sendMessage(Message)。而使用Handler,須要implement 該類的 handleMessage(Message)方法,它是處理這些Message的操做內容,例如Update UI。一般須要子類化Handler來實現handleMessage方法。

3. Message Queue

    Message Queue消息隊列,用來存放經過Handler發佈的消息,按照先進先出執行。

    每一個message queue都會有一個對應的Handler。Handler會向message queue經過兩種方法發送消息:sendMessage或post。這兩種消息都會插在message queue隊尾並按先進先出執行。但經過這兩種方法發送的消息執行的方式略有不一樣:經過sendMessage發送的是一個message對象,會被 Handler的handleMessage()函數處理;而經過post方法發送的是一個runnable對象,則會本身執行。

4. Looper

    Looper是每條線程裏的Message Queue的管家。Android沒有Global的Message Queue,而Android會自動替主線程(UI線程)創建Message Queue,但在子線程裏並無創建Message Queue。因此調用Looper.getMainLooper()獲得的主線程的Looper不爲NULL,但調用Looper.myLooper() 獲得當前線程的Looper就有可能爲NULL。對於子線程使用Looper,API Doc提供了正確的使用方法:這個Message機制的大概流程:

    1. 在Looper.loop()方法運行開始後,循環地按照接收順序取出Message Queue裏面的非NULL的Message。

    2. 一開始Message Queue裏面的Message都是NULL的。當Handler.sendMessage(Message)到Message Queue,該函數裏面設置了那個Message對象的target屬性是當前的Handler對象。隨後Looper取出了那個Message,則調用 該Message的target指向的Hander的dispatchMessage函數對Message進行處理。在dispatchMessage方法裏,如何處理Message則由用戶指定,三個判斷,優先級從高到低:

    1) Message裏面的Callback,一個實現了Runnable接口的對象,其中run函數作處理工做;

    2) Handler裏面的mCallback指向的一個實現了Callback接口的對象,由其handleMessage進行處理;

    3) 處理消息Handler對象對應的類繼承並實現了其中handleMessage函數,經過這個實現的handleMessage函數處理消息。

    因而可知,咱們實現的handleMessage方法是優先級最低的!

    3. Handler處理完該Message (update UI) 後,Looper則設置該Message爲NULL,以便回收!

    在網上有不少文章講述主線程和其餘子線程如何交互,傳送信息,最終誰來執行處理信息之類的,我的理解是最簡單的方法——判斷Handler對象裏面的Looper對象是屬於哪條線程的,則由該線程來執行!

    1. 當Handler對象的構造函數的參數爲空,則爲當前所在線程的Looper;

2. Looper.getMainLooper()獲得的是主線程的Looper對象,Looper.myLooper()獲得的是當前線程的Looper對象。

14簡要解釋一下activity intent intent filterserviceBroadcaseBroadcaseReceiver

答:一個activity呈現了一個用戶能夠操做的可視化用戶界面;一個service不包含可見的用戶界面,而是在後臺運行,能夠與一個activity綁定,經過綁定暴露出來接口並與其進行通訊;一個broadcast receiver是一個接收廣播消息並作出迴應的component,broadcast receiver沒有界面;一個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文件中聲明的。

15說說mvc模式的原理,它在android中的運用,android的官方建議應用程序的開發採用mvc模式。何謂mvc

mvc是model,view,controller的縮寫,mvc包含三個部分:

模型(model)對象:是應用程序的主體部分,全部的業務邏輯都應該寫在該層。

視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶惟一能夠看到的一層,接收用戶的輸入,顯示處理結果。

控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,響應用戶出發的相關事件,交給m層處理。

android鼓勵弱耦合和組件的重用,在android中mvc的具體體現以下:

1)視圖層(view):通常採用xml文件進行界面的描述,使用的時候能夠很是方便的引入,固然,若是你對android瞭解的比較的多了話,就必定能夠想到在android中也能夠使用JavaScript+html等的方式做爲view層,固然這裏須要進行java和javascript之間的通訊,幸運的是,android提供了它們之間很是方便的通訊實現。

2)控制層(controller):android的控制層的重任一般落在了衆多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要經過activity交割model業務邏輯層處理,這樣作的另一個緣由是android中的acitivity的響應時間是5s,若是耗時的操做放在這裏,程序就很容易被回收掉。

3)模型層(model):對數據庫的操做、對網絡等的操做都應該在model裏面處理,固然對業務計算等操做也是必須放在的該層的。

16什麼是ANR 如何避免它?

答:ANR:Application Not Responding。在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應,當用戶操做的在5s內應用程序沒能作出反應,BroadcastReceiver在10秒內沒有執行完畢,就會出現應用程序無響應對話框,這既是ANR。

避免方法:Activity應該在它的關鍵生命週期方法(如onCreate()和onResume())裏儘量少的去作建立操做。潛在的耗時操做,例如網絡或數據庫操做,或者高耗時的計算如改變位圖尺寸,應該在子線程裏(或者異步方式)來完成。主線程應該爲子線程提供一個Handler,以便完成時可以提交給主線程。

17什麼狀況會致使Force Close ?如何避免?可否捕獲致使其的異常?

答:程序出現異常,好比nullpointer。

避免:編寫程序時邏輯連貫,思惟縝密。能捕獲異常,在logcat中能看到異常信息

18描述一下android的系統架構

android系統架構分從下往上爲linux 內核層、運行庫、應用程序框架層、和應用程序層。

linuxkernel:負責硬件的驅動程序、網絡、電源、系統安全以及內存管理等功能。

libraries和 android runtime:libraries:即c/c++函數庫部分,大多數都是開放源代碼的函數庫,例如webkit(引擎),該函數庫負責 android網頁瀏覽器的運行,例如標準的c函數庫libc、openssl、sqlite等,固然也包括支持遊戲開發2dsgl和 3dopengles,在多媒體方面有mediaframework框架來支持各類影音和圖形文件的播放與顯示,例如mpeg四、h.26四、mp三、 aac、amr、jpg和png等衆多的多媒體文件格式。android的runtime負責解釋和執行生成的dalvik格式的字節碼。

applicationframework(應用軟件架構),java應用程序開發人員主要是使用該層封裝好的api進行快速開發。

applications:該層是java的應用程序層,android內置的googlemaps、e-mail、即時通訊工具、瀏覽器、mp3播放器等處於該層,java開發人員開發的程序也處於該層,並且和內置的應用程序具備平等的位置,能夠調用內置的應用程序,也能夠替換內置的應用程序。

上面的四個層次,下層爲上層服務,上層須要下層的支持,調用下層的服務,這種嚴格分層的方式帶來的極大的穩定性、靈活性和可擴展性,使得不一樣層的開發人員能夠按照規範專心特定層的開發。

android應用程序使用框架的api並在框架下運行,這就帶來了程序開發的高度一致性,另外一方面也告訴咱們,要想寫出優質高效的程序就必須對整個 applicationframework進行很是深刻的理解。精通applicationframework,你就能夠真正的理解android的設計和運行機制,也就更可以駕馭整個應用層的開發。

19請介紹下ContentProvider是如何實現數據共享的。

一個程序能夠經過實現一個Content provider的抽象接口將本身的數據徹底暴露出去,並且Content providers是以相似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,經過它可讓全部的應用程序訪問到,這也是應用程序之間惟一共享數據的方法。

要想使應用程序的數據公開化,可經過2種方法:建立一個屬於你本身的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型而且有寫入Content provider的權限。

如何經過一套標準及統一的接口獲取其餘應用程序暴露的數據?

Android提供了ContentResolver,外界的程序能夠經過ContentResolver接口訪問ContentProvider提供的數據。

20 ServiceThread的區別?

答:servie是系統的組件,它由系統進程託管(servicemanager);它們之間的通訊相似於client和server,是一種輕量級的ipc通訊,這種通訊的載體是binder,它是在linux層交換信息的一種ipc。而thread是由本應用程序託管。1). Thread:Thread 是程序執行的最小單元,它是分配CPU的基本單位。能夠用 Thread 來執行一些異步的操做。

2). Service:Service 是android的一種機制,當它運行的時候若是是Local Service,那麼對應的 Service 是運行在主進程的 main 線程上的。如:onCreate,onStart 這些函數在被系統調用的時候都是在主進程的 main 線程上運行的。若是是Remote Service,那麼對應的 Service 則是運行在獨立進程的 main 線程上。

既然這樣,那麼咱們爲何要用 Service 呢?其實這跟 android 的系統機制有關,咱們先拿 Thread 來講。Thread 的運行是獨立於 Activity 的,也就是說當一個 Activity 被 finish 以後,若是你沒有主動中止 Thread 或者 Thread 裏的 run 方法沒有執行完畢的話,Thread 也會一直執行。所以這裏會出現一個問題:當 Activity 被 finish 以後,你再也不持有該 Thread 的引用。另外一方面,你沒有辦法在不一樣的 Activity 中對同一 Thread 進行控制。 

舉個例子:若是你的 Thread 須要不停地隔一段時間就要鏈接服務器作某種同步的話,該 Thread 須要在 Activity 沒有start的時候也在運行。這個時候當你 start 一個 Activity 就沒有辦法在該 Activity 裏面控制以前建立的 Thread。所以你便須要建立並啓動一個 Service ,在 Service 裏面建立、運行並控制該 Thread,這樣便解決了該問題(由於任何 Activity 均可以控制同一 Service,而系統也只會建立一個對應 Service 的實例)。 

所以你能夠把 Service 想象成一種消息服務,而你能夠在任何有 Context 的地方調用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,來控制它,你也能夠在 Service 裏註冊 BroadcastReceiver,在其餘地方經過發送 broadcast 來控制它,固然這些都是 Thread 作不到的。

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

答:會,好比nullpointerException。我遇到過,好比textview.setText()時,textview沒有初始化。會致使程序沒法正常運行出現forceclose。打開控制檯查看logcat信息找出異常信息並修改程序。

22 IntentService有何優勢?

答:Acitivity的進程,當處理Intent的時候,會產生一個對應的Service; Android的進程處理器如今會盡量的不kill掉你;很是容易使用

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

答:重寫onSaveInstanceState()方法,在此方法中保存須要保存的數據,該方法將會在activity被回收以前調用。經過重寫onRestoreInstanceState()方法能夠從中提取保存好的數據

24如何將一個Activity設置成窗口的樣式。

答:<activity>中配置:android :theme="@android:style/Theme.Dialog"

另外android:theme="@android:style/Theme.Translucent" 是設置透明

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

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

對於多個activity,一、記錄打開的Activity:每打開一個Activity,就記錄下來。在須要退出時,關閉每個Activity便可。二、發送特定廣播:在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可。三、遞歸退出:在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉。爲了編程方便,最好定義一個Activity基類,處理這些共通問題。

在2.1以前,能夠使用ActivityManager的restartPackage方法。

它能夠直接結束整個應用。在使用時須要權限android.permission.RESTART_PACKAGES。

注意不要被它的名字迷惑。

但是,在2.2,這個方法失效了。在2.2添加了一個新的方法,killBackground Processes(),須要權限 android.permission.KILL_BACKGROUND_PROCESSES。惋惜的是,它和2.2的restartPackage同樣,根本起不到應有的效果。

另外還有一個方法,就是系統自帶的應用程序管理裏,強制結束程序的方法,forceStopPackage()。它須要權限android.permission.FORCE_STOP_PACKAGES。而且須要添加android:sharedUserId="android.uid.system"屬性。一樣惋惜的是,該方法是非公開的,他只能運行在系統進程,第三方程序沒法調用。

由於須要在Android.mk中添加LOCAL_CERTIFICATE := platform。

而Android.mk是用於在Android源碼下編譯程序用的。

從以上能夠看出,在2.2,沒有辦法直接結束一個應用,而只能用本身的辦法間接辦到。

現提供幾個方法,供參考:

一、拋異常強制退出:

該方法經過拋異常,使程序Force Close。

驗證能夠,可是,須要解決的問題是,如何使程序結束掉,而不彈出Force Close的窗口。

二、記錄打開的Activity:

每打開一個Activity,就記錄下來。在須要退出時,關閉每個Activity便可。

三、發送特定廣播:

在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可。

四、遞歸退出

在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉。

除了第一個,都是想辦法把每個Activity都結束掉,間接達到目的。可是這樣作一樣不完美。你會發現,若是本身的應用程序對每個Activity都設置了nosensor,在兩個Activity結束的間隙,sensor可能有效了。但至少,咱們的目的達到了,並且沒有影響用戶使用。爲了編程方便,最好定義一個Activity基類,處理這些共通問題。

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

答:全稱是:Android Interface Define Language

在Android中, 每一個應用程序均可以有本身的進程. 在寫UI應用的時候, 常常要用到Service. 在不一樣的進程中, 怎樣傳遞對象呢?顯然, Java中不容許跨進程內存共享. 所以傳遞對象, 只能把對象拆分紅操做系統能理解的簡單形式, 以達到跨界對象訪問的目的. 在J2EE中,採用RMI的方式, 能夠經過序列化傳遞對象. 在Android中, 則採用AIDL的方式. 理論上AIDL能夠傳遞Bundle,實際上作起來卻比較麻煩。

AIDL(AndRoid接口描述語言)是一種藉口描述語言; 編譯器能夠經過aidl文件生成一段代碼,經過預先定義的接口達到兩個進程內部通訊進程的目的. 若是須要在一個Activity中, 訪問另外一個Service中的某個對象, 須要先將對象轉化成AIDL可識別的參數(多是多個參數), 而後使用AIDL來傳遞這些參數, 在消息的接收端, 使用這些參數組裝成本身須要的對象.

AIDL的IPC的機制和COM或CORBA相似, 是基於接口的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值. 若是要使用AIDL, 須要完成2件事情: 1. 引入AIDL的相關類.; 2. 調用aidl產生的class.

AIDL的建立方法:

AIDL語法很簡單,能夠用來聲明一個帶一個或多個方法的接口,也能夠傳遞參數和返回值。 因爲遠程調用的須要, 這些參數和返回值並非任何類型.下面是些AIDL支持的數據類型:

1. 不須要import聲明的簡單Java編程語言類型(int,boolean等)

2. String, CharSequence不須要特殊聲明

3. List, Map和Parcelables類型, 這些類型內所包含的數據成員也只能是簡單數據類型, String等其餘比支持的類型.

(另外: 我沒嘗試Parcelables, 在Eclipse+ADT下編譯不過, 或許之後會有所支持)

27請解釋下Android程序運行時權限與文件系統權限的區別。

答:運行時權限Dalvik( android受權)

文件系統 linux 內核受權

28系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定頁面?請說明起因。

經過直接發送Uri把參數帶過去,或者經過manifest裏的intentfilter裏的data屬性

29 android系統的優點和不足

答:Android平臺手機 5大優點:

1、開放性

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

2、掙脫運營商的束縛

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

3、豐富的硬件選擇

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

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

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

5、無縫結合的Google應用

現在叱詫互聯網的Google已經走過10年度歷史,從搜索巨人到全面的互聯網滲透,Google服務如地圖、郵件、搜索等已經成爲鏈接用戶和互聯網的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。

再說Android的5大不足:

1、安全和隱私

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

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

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

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

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

4、同類機型用戶減小

在很多手機論壇都會有針對某一型號的子論壇,對一款手機的使用心得交流,並分享軟件資源。而對於Android平臺手機,因爲廠商豐富,產品類型多樣,這樣使用同一款機型的用戶愈來愈少,缺乏統一機型的程序強化。舉個稍顯不當的例子,如今山寨機氾濫,品種各異,就不多有專門針對某個型號山寨機的討論和羣組,除了哪些功能異常搶眼、頗受追捧的機型之外。

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

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

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

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

31 sim卡的EF文件是什麼?有何做用

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

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

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

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

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

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

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

35如何將SQLite數據庫(dictionary.db文件)apk文件一塊兒發佈

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

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

解答:在Android中不能直接打開res aw目錄中的數據庫文件,而須要在程序第一次啓動時將該文件複製到手機內存或SD卡的某個目錄中,而後再打開該數據庫文件。

複製的基本方法是使用getResources().openRawResource方法得到res aw目錄中資源的 InputStream對象,而後將該InputStream對象中的數據寫入其餘的目錄中相應文件中。在Android SDK中能夠使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數據庫文件。

37 DDMSTraceView的區別?

DDMS是一個程序執行查看器,在裏面能夠看見線程和堆棧等信息,TraceView是程序性能分析器 。

38 java中如何引用本地語言

能夠用JNI(java native interface  java 本地接口)接口 。

39談談AndroidIPC(進程間通訊)機制

IPC是內部進程通訊的簡稱, 是共享"命名管道"的資源。Android中的IPC機制是爲了讓Activity和Service之間能夠隨時的進行交互,故在Android中該機制,只適用於Activity和Service之間的通訊,相似於遠程方法調用,相似於C/S模式的訪問。經過定義AIDL接口文件來定義IPC接口。Servier端實現IPC接口,Client端調用IPC接口本地代理。

40 NDK是什麼

NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將so和java 應用打成apk包。

NDK集成了交叉編譯器,並提供了相應的mk文件和隔離cpu、平臺等的差別,開發人員只需簡單的修改mk文件就能夠建立出so

相關文章
相關標籤/搜索