Android 經(jīng)典模式題

1. Android的四大組件是哪些链瓦,它們的作用姆怪?

答:Activity:Activity是Android程序與用戶交互的窗口,是Android構(gòu)造塊中最基本的一種,它需要為保持各界面的狀態(tài)稽揭,做很多持久化的事情,妥善管理生命周期以及一些跳轉(zhuǎn)邏輯
service:后臺服務(wù)于Activity肥卡,封裝有一個完整的功能邏輯實現(xiàn)溪掀,接受上層指令,完成相關(guān)的食物步鉴,定義好需要接受的Intent提供同步和異步的接口
Content Provider:是Android提供的第三方應(yīng)用數(shù)據(jù)的訪問方案揪胃,可以派生Content Provider類,對外提供數(shù)據(jù)氛琢,可以像數(shù)據(jù)庫一樣進(jìn)行選擇排序喊递,屏蔽內(nèi)部數(shù)據(jù)的存儲細(xì)節(jié),向外提供統(tǒng)一的借口模型阳似,大大簡化上層應(yīng)用骚勘,對數(shù)據(jù)的整合提供了更方便的途徑
BroadCast Receiver:接受一種或者多種Intent作觸發(fā)事件,接受相關(guān)消息撮奏,做一些簡單處理俏讹,轉(zhuǎn)換成一條Notification,統(tǒng)一了Android的事件廣播模型

2. 請介紹下Android中常用的五種布局畜吊。

常用五種布局方式泽疆,分別是:FrameLayout(框架布局),LinearLayout (線性布局)玲献,AbsoluteLayout(絕對布局)殉疼,RelativeLayout(相對布局),TableLayout(表格布局)捌年。
一瓢娜、FrameLayout:所有東西依次都放在左上角,會重疊延窜,這個布局比較簡單恋腕,也只能放一點比較簡單的東西。二逆瑞、LinearLayout:線性布局荠藤,每一個LinearLayout里面又可分為垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal" )。當(dāng)垂直布局時获高,每一行就只有一個元素哈肖,多個元素依次垂直往下;水平布局時念秧,只有一行淤井,每一個元素依次向右排列。三、AbsoluteLayout:絕對布局用X,Y坐標(biāo)來指定元素的位置币狠,這種布局方式也比較簡單游两,但是在屏幕旋轉(zhuǎn)時,往往會出問題漩绵,而且多個元素的時候贱案,計算比較麻煩。四止吐、RelativeLayout:相對布局可以理解為某一個元素為參照物宝踪,來定位的布局方式。主要屬性有:相對于某一個元素android:layout_below碍扔、 android:layout_toLeftOf相對于父元素的地方android:layout_alignParentLeft瘩燥、android:layout_alignParentRigh;五不同、TableLayout:表格布局厉膀,每一個TableLayout里面有表格行TableRow,TableRow里面可以具體定義每一個元素套鹅。每一個布局都有自己適合的方式站蝠,這五個布局元素可以相互嵌套應(yīng)用,做出美觀的界面卓鹿。

3. android中的動畫有哪幾類菱魔,它們的特點和區(qū)別是什么

答:兩種,一種是Tween動畫吟孙、還有一種是Frame動畫澜倦。Tween動畫,這種實現(xiàn)方式可以使視圖組件移動杰妓、放大藻治、縮小以及產(chǎn)生透明度的變化;另一種Frame動畫,傳統(tǒng)的動畫方法巷挥,通過順序的播放排列好的圖片來實現(xiàn)桩卵,類似電影。

4. android 中有哪幾種解析xml的類倍宾?官方推薦哪種雏节?以及它們的原理和區(qū)別。

答:XML解析主要有三種方式高职,SAX钩乍、DOM、PULL怔锌。常規(guī)在PC上開發(fā)我們使用Dom相對輕松些寥粹,但一些性能敏感的數(shù)據(jù)庫或手機(jī)上還是主要采用SAX方式变过,SAX讀取是單向的,優(yōu)點:不占內(nèi)存空間涝涤、解析屬性方便媚狰,但缺點就是對于套嵌多個分支來說處理不是很方便。而DOM方式會把整個XML文件加載到內(nèi)存中去阔拳,這里Android開發(fā)網(wǎng)提醒大家該方法在查找方面可以和XPath很好的結(jié)合如果數(shù)據(jù)量不是很大推薦使用哈雏,而PULL常常用在J2ME對于節(jié)點處理比較好,類似SAX方式衫生,同樣很節(jié)省內(nèi)存,在J2ME中我們經(jīng)常使用的KXML庫來解析土浸。

5. ListView的優(yōu)化方案

答:1罪针、如果自定義適配器,那么在getView方法中要考慮方法傳進(jìn)來的參數(shù)contentView是否為null黄伊,如果為null就創(chuàng)建contentView并返回泪酱,如果不為null則直接使用。在這個方法中盡可能少創(chuàng)建view还最。
2墓阀、給contentView設(shè)置tag(setTag()),傳入一個viewHolder對象拓轻,用于緩存要顯示的數(shù)據(jù)斯撮,可以達(dá)到圖像數(shù)據(jù)異步加載的效果。
3扶叉、如果listview需要顯示的item很多勿锅,就要考慮分頁加載。比如一共要顯示100條或者更多的時候枣氧,我們可以考慮先加載20條溢十,等用戶拉到列表底部的時候再去加載接下來的20條。

1. 請介紹下Android的數(shù)據(jù)存儲方式达吞。

答:使用SharedPreferences存儲數(shù)據(jù)张弛;文件存儲數(shù)據(jù);SQLite數(shù)據(jù)庫存儲數(shù)據(jù)酪劫;使用ContentProvider存儲數(shù)據(jù)吞鸭;網(wǎng)絡(luò)存儲數(shù)據(jù);
Preference契耿,F(xiàn)ile瞒大, DataBase這三種方式分別對應(yīng)的目錄是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。
一:使用SharedPreferences存儲數(shù)據(jù)
首先說明SharedPreferences存儲方式搪桂,它是 Android提供的用來存儲一些簡單配置信息的一種機(jī)制透敌,例如:登錄用戶的用戶名與密碼盯滚。其采用了Map數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù),以鍵值的方式存儲酗电,可以簡單的讀取與寫入魄藕,具體實例如下:
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();
}
數(shù)據(jù)讀取與寫入的方法都非常簡單,只是在寫入的時候有些區(qū)別:先調(diào)用edit()使其處于編輯狀態(tài)撵术,然后才能修改數(shù)據(jù)背率,最后使用commit()提交修改的數(shù)據(jù)。實際上SharedPreferences是采用了XML格式將數(shù)據(jù)存儲到設(shè)備中嫩与,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下寝姿。使用SharedPreferences是有些限制的:只能在同一個包內(nèi)使用,不能在不同的包之間使用划滋。
二:文件存儲數(shù)據(jù)
文件存儲方式是一種較常用的方法饵筑,在Android中讀取/寫入文件的方法,與 Java中實現(xiàn)I/O的程序是完全一樣的处坪,提供了openFileInput()和openFileOutput()方法來讀取設(shè)備上的文件捧韵。具體實例如下:
String fn = “moandroid.log”;
FileInputStream fis = openFileInput(fn);
FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);
三:網(wǎng)絡(luò)存儲數(shù)據(jù)
網(wǎng)絡(luò)存儲方式伐脖,需要與Android 網(wǎng)絡(luò)數(shù)據(jù)包打交道惕艳,關(guān)于Android 網(wǎng)絡(luò)數(shù)據(jù)包的詳細(xì)說明附井,請閱讀Android SDK引用了Java SDK的哪些package?想邦。
四:ContentProvider
1裤纹、ContentProvider簡介
當(dāng)應(yīng)用繼承ContentProvider類,并重寫該類用于提供數(shù)據(jù)和存儲數(shù)據(jù)的方法案狠,就可以向其他應(yīng)用共享其數(shù)據(jù)服傍。雖然使用其他方法也可以對外共享數(shù)據(jù),但數(shù)據(jù)訪問方式會因數(shù)據(jù)存儲的方式而不同骂铁,如:采用文件方式對外共享數(shù)據(jù)吹零,需要進(jìn)行文件操作讀寫數(shù)據(jù);采用sharedpreferences共享數(shù)據(jù)拉庵,需要使用sharedpreferences API讀寫數(shù)據(jù)灿椅。而使用ContentProvider共享數(shù)據(jù)的好處是統(tǒng)一了數(shù)據(jù)訪問方式。
2钞支、Uri類簡介
Uri代表了要操作的數(shù)據(jù)茫蛹,Uri主要包含了兩部分信息:1.需要操作的ContentProvider ,2.對ContentProvider中的什么數(shù)據(jù)進(jìn)行操作烁挟,一個Uri由以下幾部分組成:
1.scheme:ContentProvider(內(nèi)容提供者)的scheme已經(jīng)由Android所規(guī)定為:content://…
2.主機(jī)名(或Authority):用于唯一標(biāo)識這個ContentProvider婴洼,外部調(diào)用者可以根據(jù)這個標(biāo)識來找到它。
3.路徑(path):可以用來表示我們要操作的數(shù)據(jù)撼嗓,路徑的構(gòu)建應(yīng)根據(jù)業(yè)務(wù)而定柬采,如下:
要操作contact表中id為10的記錄欢唾,可以構(gòu)建這樣的路徑:/contact/10
要操作contact表中id為10的記錄的name字段, contact/10/name
要操作contact表中的所有記錄粉捻,可以構(gòu)建這樣的路徑:/contact?
要操作的數(shù)據(jù)不一定來自數(shù)據(jù)庫礁遣,也可以是文件等他存儲方式,如下:
要操作xml文件中contact節(jié)點下的name節(jié)點肩刃,可以構(gòu)建這樣的路徑:/contact/name
如果要把一個字符串轉(zhuǎn)換成Uri祟霍,可以使用Uri類中的parse()方法,如下:
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")
3盈包、UriMatcher沸呐、ContentUrist和ContentResolver簡介
因為Uri代表了要操作的數(shù)據(jù),所以我們很經(jīng)常需要解析Uri呢燥,并從 Uri中獲取數(shù)據(jù)垂谢。Android系統(tǒng)提供了兩個用于操作Uri的工具類,分別為UriMatcher 和ContentUris 疮茄。掌握它們的使用,會便于我們的開發(fā)工作根暑。
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進(jìn)行匹配,如果匹配就返回匹配碼颇象,匹配碼是調(diào)用 addURI()方法傳入的第三個參數(shù)伍伤,假設(shè)匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回的匹配碼為1遣钳。
ContentUris:用于獲取Uri路徑后面的ID部分扰魂,它有兩個比較實用的方法:
withAppendedId(uri, id)用于為路徑加上ID部分
parseId(uri)方法用于從路徑中獲取ID部分
ContentResolver:當(dāng)外部應(yīng)用需要對ContentProvider中的數(shù)據(jù)進(jìn)行添加、刪除蕴茴、修改和查詢操作時劝评,可以使用 ContentResolver 類來完成,要獲取ContentResolver 對象倦淀,可以使用Activity提供的getContentResolver()方法蒋畜。 ContentResolver使用insert、delete撞叽、update姻成、query方法插龄,來操作數(shù)據(jù)。

1. activity的啟動模式有哪些佣渴?是什么含義辫狼?

答:在android里,有4種activity的啟動模式辛润,分別為:
“standard” (默認(rèn))
“singleTop”
“singleTask”
“singleInstance”

它們主要有如下不同:

  1. 如何決定所屬task
    “standard”和”singleTop”的activity的目標(biāo)task膨处,和收到的Intent的發(fā)送者在同一個task內(nèi),除非intent包括參數(shù)FLAG_ACTIVITY_NEW_TASK砂竖。
    如果提供了FLAG_ACTIVITY_NEW_TASK參數(shù)真椿,會啟動到別的task里。
    “singleTask”和”singleInstance”總是把a(bǔ)ctivity作為一個task的根元素乎澄,他們不會被啟動到一個其他task里突硝。
  2. 是否允許多個實例
    “standard”和”singleTop”可以被實例化多次,并且存在于不同的task中置济,且一個task可以包括一個activity的多個實例解恰;
    “singleTask”和”singleInstance”則限制只生成一個實例,并且是task的根元素浙于。 singleTop要求如果創(chuàng)建intent的時候棧頂已經(jīng)有要創(chuàng)建 的Activity的實例护盈,則將intent發(fā)送給該實例,而不發(fā)送給新的實例羞酗。
  3. 是否允許其它activity存在于本task內(nèi)
    “singleInstance”獨占一個task腐宋,其它activity不能存在那個task里;如果它啟動了一個新的activity檀轨,不管新的activity的launch mode 如何胸竞,新的activity都將會到別的task里運(yùn)行(如同加了FLAG_ACTIVITY_NEW_TASK參數(shù))。
    而另外三種模式参萄,則可以和其它activity共存卫枝。
  4. 是否每次都生成新實例
    “standard”對于沒一個啟動Intent都會生成一個activity的新實例;
    “singleTop”的activity如果在task的棧頂?shù)脑挾锟妫瑒t不生成新的該activity的實例剃盾,直接使用棧頂?shù)膶嵗駝t淤袜,生成該activity的實例痒谴。
    比如現(xiàn)在task棧元素為A-B-C-D(D在棧頂),這時候給D發(fā)一個啟動intent铡羡,如果D是 “standard”的积蔚,則生成D的一個新實例,棧變?yōu)锳-B-C-D-D烦周。
    如果D是singleTop的話尽爆,則不會生產(chǎn)D的新實例怎顾,棧狀態(tài)仍為A-B-C-D
    如果這時候給B發(fā)Intent的話,不管B的launchmode是”standard” 還是 “singleTop” 漱贱,都會生成B的新實例槐雾,棧狀態(tài)變?yōu)锳-B-C-D-B。
    “singleInstance”是其所在棧的唯一activity幅狮,它會每次都被重用募强。
    “singleTask”如果在棧頂,則接受intent崇摄,否則擎值,該intent會被丟棄,但是該task仍會回到前臺逐抑。
    當(dāng)已經(jīng)存在的activity實例處理新的intent時候鸠儿,會調(diào)用onNewIntent()方法 如果收到intent生成一個activity實例,那么用戶可以通過back鍵回到上一個狀態(tài)厕氨;如果是已經(jīng)存在的一個activity來處理這個intent的話进每,用戶不能通過按back鍵返回到這之前的狀態(tài)。
1. 跟activity和Task 有關(guān)的 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
如果設(shè)置,這個Activity會成為歷史stack中一個新Task的開始冯丙。一個Task(從啟動它的Activity到下一個Task中的 Activity)定義了用戶可以遷移的Activity原子組。Task可以移動到前臺和后臺遭京;在某個特定Task中的所有Activity總是保持相同的次序胃惜。
這個標(biāo)志一般用于呈現(xiàn)“啟動”類型的行為:它們提供用戶一系列可以單獨完成的事情,與啟動它們的Activity完全無關(guān)哪雕。
使用這個標(biāo)志船殉,如果正在啟動的Activity的Task已經(jīng)在運(yùn)行的話,那么斯嚎,新的Activity將不會啟動利虫;代替的,當(dāng)前Task會簡單的移入前臺堡僻。參考FLAG_ACTIVITY_MULTIPLE_TASK標(biāo)志糠惫,可以禁用這一行為。
這個標(biāo)志不能用于調(diào)用方對已經(jīng)啟動的Activity請求結(jié)果钉疫。
FLAG_ACTIVITY_CLEAR_TOP
如果設(shè)置硼讽,并且這個Activity已經(jīng)在當(dāng)前的Task中運(yùn)行,因此牲阁,不再是重新啟動一個這個Activity的實例固阁,而是在這個Activity上方的所有Activity都將關(guān)閉壤躲,然后這個Intent會作為一個新的Intent投遞到老的Activity(現(xiàn)在位于頂端)中。
例如备燃,假設(shè)一個Task中包含這些Activity:A碉克,B,C并齐,D漏麦。如果D調(diào)用了startActivity(),并且包含一個指向Activity B的Intent冀膝,那么唁奢,C和D都將結(jié)束,然后B接收到這個Intent窝剖,因此麻掸,目前stack的狀況是:A,B赐纱。
上例中正在運(yùn)行的Activity B既可以在onNewIntent()中接收到這個新的Intent脊奋,也可以把自己關(guān)閉然后重新啟動來接收這個Intent。如果它的啟動模式聲明為 “multiple”(默認(rèn)值)疙描,并且你沒有在這個Intent中設(shè)置FLAG_ACTIVITY_SINGLE_TOP標(biāo)志诚隙,那么它將關(guān)閉然后重新創(chuàng)建;對于其它的啟動模式起胰,或者在這個Intent中設(shè)置FLAG_ACTIVITY_SINGLE_TOP標(biāo)志久又,都將把這個Intent投遞到當(dāng)前這個實例的onNewIntent()中。
這個啟動模式還可以與FLAG_ACTIVITY_NEW_TASK結(jié)合起來使用:用于啟動一個Task中的根Activity效五,它會把那個Task中任何運(yùn)行的實例帶入前臺地消,然后清除它直到根Activity。這非常有用畏妖,例如脉执,當(dāng)從Notification Manager處啟動一個Activity。
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
如果設(shè)置這個標(biāo)志戒劫,這個activity不管是從一個新的棧啟動還是從已有棧推到棧頂半夷,它都將以the front door of the task的方式啟動。這就講導(dǎo)致任何與應(yīng)用相關(guān)的棧都講重置到正常狀態(tài)(不管是正在講activity移入還是移除)迅细,如果需要巫橄,或者直接重置該棧為初始狀態(tài)。
FLAG_ACTIVITY_SINGLE_TOP
如果設(shè)置茵典,當(dāng)這個Activity位于歷史stack的頂端運(yùn)行時嗦随,不再啟動一個新的
FLAG_ACTIVITY_BROUGHT_TO_FRONT
這個標(biāo)志一般不是由程序代碼設(shè)置的,如在launchMode中設(shè)置singleTask模式時系統(tǒng)幫你設(shè)定。
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
如果設(shè)置枚尼,這將在Task的Activity stack中設(shè)置一個還原點贴浙,當(dāng)Task恢復(fù)時,需要清理Activity署恍。也就是說崎溃,下一次Task帶著 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標(biāo)記進(jìn)入前臺時(典型的操作是用戶在主畫面重啟它),這個Activity和它之上的都將關(guān)閉盯质,以至于用戶不能再返回到它們袁串,但是可以回到之前的Activity。
這在你的程序有分割點的時候很有用呼巷。例如囱修,一個e-mail應(yīng)用程序可能有一個操作是查看一個附件,需要啟動圖片瀏覽Activity來顯示王悍。這個 Activity應(yīng)該作為e-mail應(yīng)用程序Task的一部分破镰,因為這是用戶在這個Task中觸發(fā)的操作。然而压储,當(dāng)用戶離開這個Task鲜漩,然后從主畫面選擇e-mail app,我們可能希望回到查看的會話中集惋,但不是查看圖片附件孕似,因為這讓人困惑。通過在啟動圖片瀏覽時設(shè)定這個標(biāo)志刮刑,瀏覽及其它啟動的Activity在下次用戶返回到mail程序時都將全部清除喉祭。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
如果設(shè)置,新的Activity不會在最近啟動的Activity的列表中保存雷绢。
FLAG_ACTIVITY_FORWARD_RESULT
如果設(shè)置泛烙,并且這個Intent用于從一個存在的Activity啟動一個新的Activity,那么习寸,這個作為答復(fù)目標(biāo)的Activity將會傳到這個新的Activity中。這種方式下傻工,新的Activity可以調(diào)用setResult(int)霞溪,并且這個結(jié)果值將發(fā)送給那個作為答復(fù)目標(biāo)的 Activity。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
這個標(biāo)志一般不由應(yīng)用程序代碼設(shè)置中捆,如果這個Activity是從歷史記錄里啟動的(常按HOME鍵)鸯匹,那么,系統(tǒng)會幫你設(shè)定泄伪。
FLAG_ACTIVITY_MULTIPLE_TASK
不要使用這個標(biāo)志殴蓬,除非你自己實現(xiàn)了應(yīng)用程序啟動器。與FLAG_ACTIVITY_NEW_TASK結(jié)合起來使用,可以禁用把已存的Task送入前臺的行為染厅。當(dāng)設(shè)置時痘绎,新的Task總是會啟動來處理Intent,而不管這是是否已經(jīng)有一個Task可以處理相同的事情肖粮。
由于默認(rèn)的系統(tǒng)不包含圖形Task管理功能孤页,因此,你不應(yīng)該使用這個標(biāo)志涩馆,除非你提供給用戶一種方式可以返回到已經(jīng)啟動的Task行施。
如果FLAG_ACTIVITY_NEW_TASK標(biāo)志沒有設(shè)置,這個標(biāo)志被忽略魂那。

FLAG_ACTIVITY_NO_ANIMATION
如果在Intent中設(shè)置蛾号,并傳遞給Context.startActivity()的話,這個標(biāo)志將阻止系統(tǒng)進(jìn)入下一個Activity時應(yīng)用 Acitivity遷移動畫涯雅。這并不意味著動畫將永不運(yùn)行——如果另一個Activity在啟動顯示之前鲜结,沒有指定這個標(biāo)志,那么斩芭,動畫將被應(yīng)用轻腺。這個標(biāo)志可以很好的用于執(zhí)行一連串的操作,而動畫被看作是更高一級的事件的驅(qū)動划乖。
FLAG_ACTIVITY_NO_HISTORY
如果設(shè)置贬养,新的Activity將不再歷史stack中保留。用戶一離開它琴庵,這個Activity就關(guān)閉了误算。這也可以通過設(shè)置noHistory特性。
FLAG_ACTIVITY_NO_USER_ACTION
如果設(shè)置迷殿,作為新啟動的Activity進(jìn)入前臺時儿礼,這個標(biāo)志將在Activity暫停之前阻止從最前方的Activity回調(diào)的onUserLeaveHint()。
典型的庆寺,一個Activity可以依賴這個回調(diào)指明顯式的用戶動作引起的Activity移出后臺蚊夫。這個回調(diào)在Activity的生命周期中標(biāo)記一個合適的點,并關(guān)閉一些Notification懦尝。
如果一個Activity通過非用戶驅(qū)動的事件知纷,如來電或鬧鐘,啟動的陵霉,這個標(biāo)志也應(yīng)該傳遞給Context.startActivity琅轧,保證暫停的Activity不認(rèn)為用戶已經(jīng)知曉其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中設(shè)置踊挠,并傳遞給Context.startActivity()乍桂,這個標(biāo)志將引發(fā)已經(jīng)運(yùn)行的Activity移動到歷史stack的頂端。
例如,假設(shè)一個Task由四個Activity組成:A,B,C,D睹酌。如果D調(diào)用startActivity()來啟動Activity B权谁,那么,B會移動到歷史stack的頂端忍疾,現(xiàn)在的次序變成A,C,D,B闯传。如果FLAG_ACTIVITY_CLEAR_TOP標(biāo)志也設(shè)置的話,那么這個標(biāo)志將被忽略卤妒。

1. 請描述下Activity的生命周期甥绿。

答:activity的生命周期方法有:onCreate()、onStart()则披、onReStart()共缕、onResume()、onPause()士复、onStop()图谷、onDestory();
可見生命周期:從onStart()直到系統(tǒng)調(diào)用onStop()
前臺生命周期:從onResume()直到系統(tǒng)調(diào)用onPause()

6. activity在屏幕旋轉(zhuǎn)時的生命周期

答:不設(shè)置Activity的android:configChanges時阱洪,切屏?xí)匦抡{(diào)用各個生命周期便贵,切橫屏?xí)r會執(zhí)行一次,切豎屏?xí)r會執(zhí)行兩次冗荸;設(shè)置Activity的android:configChanges="orientation"時承璃,切屏還是會重新調(diào)用各個生命周期,切橫蚌本、豎屏?xí)r只會執(zhí)行一次盔粹;設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調(diào)用各個生命周期程癌,只會執(zhí)行onConfigurationChanged方法
11舷嗡、如何啟用Service,如何停用Service嵌莉。
服務(wù)的開發(fā)比較簡單进萄,如下:
第一步:繼承Service類
public class SMSService extends Service {}
第二步:在AndroidManifest.xml文件中的<application>節(jié)點里對服務(wù)進(jìn)行配置:<service android:name=".SMSService" />
服務(wù)不能自己運(yùn)行,需要通過調(diào)用Context.startService()或Context.bindService()方法啟動服務(wù)锐峭。這兩個方法都可以啟動Service中鼠,但是它們的使用場合有所不同。使用startService()方法啟用服務(wù)只祠,調(diào)用者與服務(wù)之間沒有關(guān)連兜蠕,即使調(diào)用者退出了扰肌,服務(wù)仍然運(yùn)行抛寝。使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在了一起,調(diào)用者一旦退出盗舰,服務(wù)也就終止,大有“不求同時生川陆,必須同時死”的特點蛮位。
如果打算采用Context.startService()方法啟動服務(wù)较沪,在服務(wù)未被創(chuàng)建時失仁,系統(tǒng)會先調(diào)用服務(wù)的onCreate()方法,接著調(diào)用onStart()方法萄焦。如果調(diào)用startService()方法前服務(wù)已經(jīng)被創(chuàng)建控轿,多次調(diào)用startService()方法并不會導(dǎo)致多次創(chuàng)建服務(wù)茬射,但會導(dǎo)致多次調(diào)用onStart()方法在抛。采用startService()方法啟動的服務(wù)霜定,只能調(diào)用Context.stopService()方法結(jié)束服務(wù)望浩,服務(wù)結(jié)束時會調(diào)用onDestroy()方法磨德。
如果打算采用Context.bindService()方法啟動服務(wù)典挑,在服務(wù)未被創(chuàng)建時您觉,系統(tǒng)會先調(diào)用服務(wù)的onCreate()方法琳水,接著調(diào)用onBind()方法在孝。這個時候調(diào)用者和服務(wù)綁定在一起私沮,調(diào)用者退出了,系統(tǒng)就會先調(diào)用服務(wù)的onUnbind()方法,接著調(diào)用onDestroy()方法筋搏。如果調(diào)用bindService()方法前服務(wù)已經(jīng)被綁定厕隧,多次調(diào)用bindService()方法并不會導(dǎo)致多次創(chuàng)建服務(wù)及綁定(也就是說onCreate()和onBind()方法并不會被多次調(diào)用)吁讨。如果調(diào)用者希望與正在綁定的服務(wù)解除綁定建丧,可以調(diào)用unbindService()方法翎朱,調(diào)用該方法也會導(dǎo)致系統(tǒng)調(diào)用服務(wù)的onUnbind()-->onDestroy()方法拴曲。

服務(wù)常用生命周期回調(diào)方法如下:
onCreate() 該方法在服務(wù)被創(chuàng)建時調(diào)用澈灼,該方法只會被調(diào)用一次委乌,無論調(diào)用多少次startService()或bindService()方法遭贸,服務(wù)也只被創(chuàng)建一次壕吹。
onDestroy()該方法在服務(wù)被終止時調(diào)用算利。
與采用Context.startService()方法啟動服務(wù)有關(guān)的生命周期方法
onStart() 只有采用Context.startService()方法啟動服務(wù)時才會回調(diào)該方法效拭。該方法在服務(wù)開始運(yùn)行時被調(diào)用缎患。多次調(diào)用startService()方法盡管不會多次創(chuàng)建服務(wù)挤渔,但onStart() 方法會被多次調(diào)用判导。
與采用Context.bindService()方法啟動服務(wù)有關(guān)的生命周期方法
onBind()只有采用Context.bindService()方法啟動服務(wù)時才會回調(diào)該方法眼刃。該方法在調(diào)用者與服務(wù)綁定時被調(diào)用擂红,當(dāng)調(diào)用者與服務(wù)已經(jīng)綁定昵骤,多次調(diào)用Context.bindService()方法并不會導(dǎo)致該方法被多次調(diào)用变秦。
onUnbind()只有采用Context.bindService()方法啟動服務(wù)時才會回調(diào)該方法伴栓。該方法在調(diào)用者與服務(wù)解除綁定時被調(diào)用

12钳垮、注冊廣播有幾種方式,這些方式有何優(yōu)缺點肚医?請談?wù)凙ndroid引入廣播機(jī)制的用意肠套。
答:首先寫一個類要繼承BroadcastReceiver
第一種:在清單文件中聲明,添加
<receive android:name=".IncomingSMSReceiver " >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>
第二種使用代碼進(jìn)行注冊如:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomgSMSReceiver();
registerReceiver(receiver.filter);
兩種注冊類型的區(qū)別是:
1)第一種不是常駐型廣播你稚,也就是說廣播跟隨程序的生命周期刁赖。
2)第二種是常駐型宇弛,也就是說當(dāng)應(yīng)用程序關(guān)閉后枪芒,如果有信息廣播來疗垛,程序也會被系統(tǒng)調(diào)用自動運(yùn)行贷腕。

13泽裳、請解釋下在單線程模型中Message涮总、Handler瀑梗、Message Queue抛丽、Looper之間的關(guān)系亿鲜。
答:簡單的說蒿柳,Handler獲取當(dāng)前線程中的looper對象妓蛮,looper用來從存放Message的MessageQueue中取出Message蛤克,再有Handler進(jìn)行Message的分發(fā)和處理.
Message Queue(消息隊列):用來存放通過Handler發(fā)布的消息,通常附屬于某一個創(chuàng)建它的線程撬码,可以通過Looper.myQueue()得到當(dāng)前線程的消息隊列
Handler:可以發(fā)布或者處理一個消息或者操作一個Runnable呜笑,通過Handler發(fā)布消息,消息將只會發(fā)送到與它關(guān)聯(lián)的消息隊列驼鹅,然也只能處理該消息隊列中的消息
Looper:是Handler和消息隊列之間通訊橋梁输钩,程序組件首先通過Handler把消息傳遞給Looper买乃,Looper把消息放入隊列剪验。Looper也把消息隊列里的消息廣播給所有的
Handler:Handler接受到消息后調(diào)用handleMessage進(jìn)行處理
Message:消息的類型,在Handler類中的handleMessage方法中得到單個的消息進(jìn)行處理
在單線程模型下疫铜,為了線程通信問題壳咕,Android設(shè)計了一個Message Queue(消息隊列)谓厘, 線程間可以通過該Message Queue并結(jié)合Handler和Looper組件進(jìn)行信息交換属桦。下面將對它們進(jìn)行分別介紹:

  1. Message
    Message消息聂宾,理解為線程間交流的信息系谐,處理數(shù)據(jù)后臺線程需要更新UI纪他,則發(fā)送Message內(nèi)含一些數(shù)據(jù)給UI線程。
  2. Handler
    Handler處理者薪寓,是Message的主要處理者预愤,負(fù)責(zé)Message的發(fā)送植康,Message內(nèi)容的執(zhí)行處理。后臺線程就是通過傳進(jìn)來的 Handler對象引用來sendMessage(Message)冻记。而使用Handler冗栗,需要implement 該類的 handleMessage(Message)方法钠至,它是處理這些Message的操作內(nèi)容棉钧,例如Update UI宪卿。通常需要子類化Handler來實現(xiàn)handleMessage方法。
  3. Message Queue
    Message Queue消息隊列休溶,用來存放通過Handler發(fā)布的消息邮偎,按照先進(jìn)先出執(zhí)行。
    每個message queue都會有一個對應(yīng)的Handler廉涕。Handler會向message queue通過兩種方法發(fā)送消息:sendMessage或post狐蜕。這兩種消息都會插在message queue隊尾并按先進(jìn)先出執(zhí)行。但通過這兩種方法發(fā)送的消息執(zhí)行的方式略有不同:通過sendMessage發(fā)送的是一個message對象,會被 Handler的handleMessage()函數(shù)處理贡羔;而通過post方法發(fā)送的是一個runnable對象乖寒,則會自己執(zhí)行。
  4. Looper
    Looper是每條線程里的Message Queue的管家逐虚。Android沒有Global的Message Queue痊班,而Android會自動替主線程(UI線程)建立Message Queue馒胆,但在子線程里并沒有建立Message Queue祝迂。所以調(diào)用Looper.getMainLooper()得到的主線程的Looper不為NULL,但調(diào)用Looper.myLooper() 得到當(dāng)前線程的Looper就有可能為NULL纠俭。對于子線程使用Looper冤荆,API Doc提供了正確的使用方法:這個Message機(jī)制的大概流程:
    1. 在Looper.loop()方法運(yùn)行開始后,循環(huán)地按照接收順序取出Message Queue里面的非NULL的Message外邓。
    2. 一開始Message Queue里面的Message都是NULL的损话。當(dāng)Handler.sendMessage(Message)到Message Queue戏仓,該函數(shù)里面設(shè)置了那個Message對象的target屬性是當(dāng)前的Handler對象臊诊。隨后Looper取出了那個Message,則調(diào)用 該Message的target指向的Hander的dispatchMessage函數(shù)對Message進(jìn)行處理重虑。在dispatchMessage方法里,如何處理Message則由用戶指定提针,三個判斷辐脖,優(yōu)先級從高到低:
    1. Message里面的Callback,一個實現(xiàn)了Runnable接口的對象久锥,其中run函數(shù)做處理工作;
    2. Handler里面的mCallback指向的一個實現(xiàn)了Callback接口的對象错妖,由其handleMessage進(jìn)行處理潮模;
    3. 處理消息Handler對象對應(yīng)的類繼承并實現(xiàn)了其中handleMessage函數(shù)擎厢,通過這個實現(xiàn)的handleMessage函數(shù)處理消息芬探。
      由此可見,我們實現(xiàn)的handleMessage方法是優(yōu)先級最低的酝静!
    1. Handler處理完該Message (update UI) 后宗苍,Looper則設(shè)置該Message為NULL讳窟,以便回收!
      在網(wǎng)上有很多文章講述主線程和其他子線程如何交互碌上,傳送信息,最終誰來執(zhí)行處理信息之類的霞丧,個人理解是最簡單的方法——判斷Handler對象里面的Looper對象是屬于哪條線程的,則由該線程來執(zhí)行突那!
    2. 當(dāng)Handler對象的構(gòu)造函數(shù)的參數(shù)為空愕难,則為當(dāng)前所在線程的Looper;
  5. Looper.getMainLooper()得到的是主線程的Looper對象惫霸,Looper.myLooper()得到的是當(dāng)前線程的Looper對象猫缭。
    14、簡要解釋一下activity壹店、 intent 猜丹、intent filter硅卢、service射窒、Broadcase妖混、BroadcaseReceiver
    答:一個activity呈現(xiàn)了一個用戶可以操作的可視化用戶界面;一個service不包含可見的用戶界面轮洋,而是在后臺運(yùn)行制市,可以與一個activity綁定,通過綁定暴露出來接口并與其進(jìn)行通信弊予;一個broadcast receiver是一個接收廣播消息并做出回應(yīng)的component祥楣,broadcast receiver沒有界面;一個intent是一個Intent對象汉柒,它保存了消息的內(nèi)容误褪。對于activity和service來說,它指定了請求的操作名稱和待操作數(shù)據(jù)的URI碾褂,Intent對象可以顯式的指定一個目標(biāo)component兽间。如果這樣的話,android會找到這個component(基于manifest文件中的聲明)并激活它正塌。但如果一個目標(biāo)不是顯式指定的嘀略,android必須找到響應(yīng)intent的最佳component。它是通過將Intent對象和目標(biāo)的intent filter相比較來完成這一工作的乓诽;一個component的intent filter告訴android該component能處理的intent帜羊。intent filter也是在manifest文件中聲明的。
    15鸠天、說說mvc模式的原理讼育,它在android中的運(yùn)用,android的官方建議應(yīng)用程序的開發(fā)采用mvc模式。何謂mvc稠集?
    mvc是model,view,controller的縮寫奶段,mvc包含三個部分:
      模型(model)對象:是應(yīng)用程序的主體部分,所有的業(yè)務(wù)邏輯都應(yīng)該寫在該層剥纷。
      視圖(view)對象:是應(yīng)用程序中負(fù)責(zé)生成用戶界面的部分痹籍。也是在整個mvc架構(gòu)中用戶唯一可以看到的一層,接收用戶的輸入筷畦,顯示處理結(jié)果词裤。
      控制器(control)對象:是根據(jù)用戶的輸入刺洒,控制用戶界面數(shù)據(jù)顯示及更新model對象狀態(tài)的部分鳖宾,控制器更重要的一種導(dǎo)航功能,響應(yīng)用戶出發(fā)的相關(guān)事件逆航,交給m層處理鼎文。
      android鼓勵弱耦合和組件的重用,在android中mvc的具體體現(xiàn)如下:
      1)視圖層(view):一般采用xml文件進(jìn)行界面的描述因俐,使用的時候可以非常方便的引入拇惋,當(dāng)然周偎,如果你對android了解的比較的多了話,就一定可以想到在android中也可以使用javascript+html等的方式作為view層撑帖,當(dāng)然這里需要進(jìn)行java和javascript之間的通信蓉坎,幸運(yùn)的是,android提供了它們之間非常方便的通信實現(xiàn)胡嘿。
      2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上蛉艾,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業(yè)務(wù)邏輯層處理衷敌,這樣做的另外一個原因是android中的acitivity的響應(yīng)時間是5s勿侯,如果耗時的操作放在這里,程序就很容易被回收掉缴罗。
      3)模型層(model):對數(shù)據(jù)庫的操作助琐、對網(wǎng)絡(luò)等的操作都應(yīng)該在model里面處理,當(dāng)然對業(yè)務(wù)計算等操作也是必須放在的該層的面氓。
    16兵钮、什么是ANR 如何避免它?
    答:ANR:Application Not Responding舌界。在Android中矢空,活動管理器和窗口管理器這兩個系統(tǒng)服務(wù)負(fù)責(zé)監(jiān)視應(yīng)用程序的響應(yīng),當(dāng)用戶操作的在5s內(nèi)應(yīng)用程序沒能做出反應(yīng)禀横,BroadcastReceiver在10秒內(nèi)沒有執(zhí)行完畢屁药,就會出現(xiàn)應(yīng)用程序無響應(yīng)對話框,這既是ANR柏锄。
    避免方法:Activity應(yīng)該在它的關(guān)鍵生命周期方法(如onCreate()和onResume())里盡可能少的去做創(chuàng)建操作酿箭。潛在的耗時操作,例如網(wǎng)絡(luò)或數(shù)據(jù)庫操作趾娃,或者高耗時的計算如改變位圖尺寸缭嫡,應(yīng)該在子線程里(或者異步方式)來完成。主線程應(yīng)該為子線程提供一個Handler抬闷,以便完成時能夠提交給主線程妇蛀。
    17、什么情況會導(dǎo)致Force Close 笤成?如何避免评架?能否捕獲導(dǎo)致其的異常?
    答:程序出現(xiàn)異常炕泳,比如nullpointer纵诞。
    避免:編寫程序時邏輯連貫,思維縝密培遵。能捕獲異常浙芙,在logcat中能看到異常信息
    18登刺、描述一下android的系統(tǒng)架構(gòu)
    android系統(tǒng)架構(gòu)分從下往上為linux 內(nèi)核層、運(yùn)行庫嗡呼、應(yīng)用程序框架層纸俭、和應(yīng)用程序?qū)印?br> linuxkernel:負(fù)責(zé)硬件的驅(qū)動程序、網(wǎng)絡(luò)南窗、電源掉蔬、系統(tǒng)安全以及內(nèi)存管理等功能。
    libraries和 android runtime:libraries:即c/c++函數(shù)庫部分矾瘾,大多數(shù)都是開放源代碼的函數(shù)庫女轿,例如webkit(引擎),該函數(shù)庫負(fù)責(zé) android網(wǎng)頁瀏覽器的運(yùn)行壕翩,例如標(biāo)準(zhǔn)的c函數(shù)庫libc蛉迹、openssl、sqlite等放妈,當(dāng)然也包括支持游戲開發(fā)2dsgl和 3dopengles北救,在多媒體方面有mediaframework框架來支持各種影音和圖形文件的播放與顯示,例如mpeg4芜抒、h.264珍策、mp3、 aac宅倒、amr攘宙、jpg和png等眾多的多媒體文件格式。android的runtime負(fù)責(zé)解釋和執(zhí)行生成的dalvik格式的字節(jié)碼拐迁。
      applicationframework(應(yīng)用軟件架構(gòu))蹭劈,java應(yīng)用程序開發(fā)人員主要是使用該層封裝好的api進(jìn)行快速開發(fā)。
      applications:該層是java的應(yīng)用程序?qū)酉哒伲琣ndroid內(nèi)置的googlemaps铺韧、e-mail、即時通信工具缓淹、瀏覽器哈打、mp3播放器等處于該層,java開發(fā)人員開發(fā)的程序也處于該層讯壶,而且和內(nèi)置的應(yīng)用程序具有平等的位置料仗,可以調(diào)用內(nèi)置的應(yīng)用程序,也可以替換內(nèi)置的應(yīng)用程序鹏溯。
      上面的四個層次罢维,下層為上層服務(wù),上層需要下層的支持丙挽,調(diào)用下層的服務(wù)肺孵,這種嚴(yán)格分層的方式帶來的極大的穩(wěn)定性、靈活性和可擴(kuò)展性颜阐,使得不同層的開發(fā)人員可以按照規(guī)范專心特定層的開發(fā)平窘。
    android應(yīng)用程序使用框架的api并在框架下運(yùn)行,這就帶來了程序開發(fā)的高度一致性凳怨,另一方面也告訴我們瑰艘,要想寫出優(yōu)質(zhì)高效的程序就必須對整個 applicationframework進(jìn)行非常深入的理解。精通applicationframework肤舞,你就可以真正的理解android的設(shè)計和運(yùn)行機(jī)制紫新,也就更能夠駕馭整個應(yīng)用層的開發(fā)。
    19李剖、請介紹下ContentProvider是如何實現(xiàn)數(shù)據(jù)共享的芒率。
    一個程序可以通過實現(xiàn)一個Content provider的抽象接口將自己的數(shù)據(jù)完全暴露出去,而且Content providers是以類似數(shù)據(jù)庫中表的方式將數(shù)據(jù)暴露篙顺。Content providers存儲和檢索數(shù)據(jù)偶芍,通過它可以讓所有的應(yīng)用程序訪問到,這也是應(yīng)用程序之間唯一共享數(shù)據(jù)的方法德玫。
    要想使應(yīng)用程序的數(shù)據(jù)公開化匪蟀,可通過2種方法:創(chuàng)建一個屬于你自己的Content provider或者將你的數(shù)據(jù)添加到一個已經(jīng)存在的Content provider中,前提是有相同數(shù)據(jù)類型并且有寫入Content provider的權(quán)限宰僧。
    如何通過一套標(biāo)準(zhǔn)及統(tǒng)一的接口獲取其他應(yīng)用程序暴露的數(shù)據(jù)材彪?
    Android提供了ContentResolver,外界的程序可以通過ContentResolver接口訪問ContentProvider提供的數(shù)據(jù)琴儿。
    20查刻、Service和Thread的區(qū)別?
    答:servie是系統(tǒng)的組件凤类,它由系統(tǒng)進(jìn)程托管(servicemanager)穗泵;它們之間的通信類似于client和server,是一種輕量級的ipc通信谜疤,這種通信的載體是binder佃延,它是在linux層交換信息的一種ipc。而thread是由本應(yīng)用程序托管夷磕。
    1). Thread:Thread 是程序執(zhí)行的最小單元履肃,它是分配CPU的基本單位∽可以用 Thread 來執(zhí)行一些異步的操作尺棋。
    2). Service:Service 是android的一種機(jī)制,當(dāng)它運(yùn)行的時候如果是Local Service绵跷,那么對應(yīng)的 Service 是運(yùn)行在主進(jìn)程的 main 線程上的膘螟。如:onCreate成福,onStart 這些函數(shù)在被系統(tǒng)調(diào)用的時候都是在主進(jìn)程的 main 線程上運(yùn)行的。如果是Remote Service荆残,那么對應(yīng)的 Service 則是運(yùn)行在獨立進(jìn)程的 main 線程上奴艾。
    既然這樣,那么我們?yōu)槭裁匆?Service 呢内斯?其實這跟 android 的系統(tǒng)機(jī)制有關(guān)蕴潦,我們先拿 Thread 來說。Thread 的運(yùn)行是獨立于 Activity 的俘闯,也就是說當(dāng)一個 Activity 被 finish 之后潭苞,如果你沒有主動停止 Thread 或者 Thread 里的 run 方法沒有執(zhí)行完畢的話,Thread 也會一直執(zhí)行真朗。因此這里會出現(xiàn)一個問題:當(dāng) Activity 被 finish 之后此疹,你不再持有該 Thread 的引用。另一方面蜜猾,你沒有辦法在不同的 Activity 中對同一 Thread 進(jìn)行控制秀菱。
    舉個例子:如果你的 Thread 需要不停地隔一段時間就要連接服務(wù)器做某種同步的話,該 Thread 需要在 Activity 沒有start的時候也在運(yùn)行蹭睡。這個時候當(dāng)你 start 一個 Activity 就沒有辦法在該 Activity 里面控制之前創(chuàng)建的 Thread衍菱。因此你便需要創(chuàng)建并啟動一個 Service ,在 Service 里面創(chuàng)建肩豁、運(yùn)行并控制該 Thread脊串,這樣便解決了該問題(因為任何 Activity 都可以控制同一 Service,而系統(tǒng)也只會創(chuàng)建一個對應(yīng) Service 的實例)清钥。
    因此你可以把 Service 想象成一種消息服務(wù)琼锋,而你可以在任何有 Context 的地方調(diào)用 Context.startService、Context.stopService祟昭、Context.bindService缕坎,Context.unbindService,來控制它篡悟,你也可以在 Service 里注冊 BroadcastReceiver谜叹,在其他地方通過發(fā)送 broadcast 來控制它,當(dāng)然這些都是 Thread 做不到的搬葬。
    21荷腊、Android本身的api并未聲明會拋出異常,則其在運(yùn)行時有無可能拋出runtime異常急凰,你遇到過嗎女仰?諾有的話會導(dǎo)致什么問題?如何解決?
    答:會疾忍,比如nullpointerException乔外。我遇到過,比如textview.setText()時锭碳,textview沒有初始化袁稽。會導(dǎo)致程序無法正常運(yùn)行出現(xiàn)forceclose勿璃。打開控制臺查看logcat信息找出異常信息并修改程序擒抛。
    22、IntentService有何優(yōu)點?
    答:Acitivity的進(jìn)程补疑,當(dāng)處理Intent的時候歧沪,會產(chǎn)生一個對應(yīng)的Service; Android的進(jìn)程處理器現(xiàn)在會盡可能的不kill掉你莲组;非常容易使用
    23诊胞、如果后臺的Activity由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)锹杈?
    答:重寫onSaveInstanceState()方法撵孤,在此方法中保存需要保存的數(shù)據(jù),該方法將會在activity被回收之前調(diào)用竭望。通過重寫onRestoreInstanceState()方法可以從中提取保存好的數(shù)據(jù)
    24邪码、如何將一個Activity設(shè)置成窗口的樣式。
    答:<activity>中配置:android :theme="@android:style/Theme.Dialog"
    另外android:theme="@android:style/Theme.Translucent" 是設(shè)置透明
    25咬清、如何退出Activity闭专?如何安全退出已調(diào)用多個Activity的Application?
    答:對于單一Activity的應(yīng)用來說旧烧,退出很簡單影钉,直接finish()即可。當(dāng)然掘剪,也可以用killProcess()和System.exit()這樣的方法平委。
    對于多個activity,1夺谁、記錄打開的Activity:每打開一個Activity廉赔,就記錄下來。在需要退出時予权,關(guān)閉每一個Activity即可昂勉。2、發(fā)送特定廣播:在需要結(jié)束應(yīng)用時扫腺,發(fā)送一個特定的廣播岗照,每個Activity收到廣播后,關(guān)閉即可。3攒至、遞歸退出:在打開新的Activity時使用startActivityForResult厚者,然后自己加標(biāo)志,在onActivityResult中處理迫吐,遞歸關(guān)閉库菲。為了編程方便,最好定義一個Activity基類志膀,處理這些共通問題熙宇。

在2.1之前,可以使用ActivityManager的restartPackage方法溉浙。
它可以直接結(jié)束整個應(yīng)用烫止。在使用時需要權(quán)限android.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑戳稽。
可是馆蠕,在2.2,這個方法失效了惊奇。在2.2添加了一個新的方法互躬,killBackground Processes(),需要權(quán)限 android.permission.KILL_BACKGROUND_PROCESSES颂郎『鸲桑可惜的是,它和2.2的restartPackage一樣祖秒,根本起不到應(yīng)有的效果诞吱。
另外還有一個方法,就是系統(tǒng)自帶的應(yīng)用程序管理里竭缝,強(qiáng)制結(jié)束程序的方法房维,forceStopPackage()。它需要權(quán)限android.permission.FORCE_STOP_PACKAGES抬纸。并且需要添加android:sharedUserId="android.uid.system"屬性咙俩。同樣可惜的是,該方法是非公開的湿故,他只能運(yùn)行在系統(tǒng)進(jìn)程阿趁,第三方程序無法調(diào)用。
因為需要在Android.mk中添加LOCAL_CERTIFICATE := platform坛猪。
而Android.mk是用于在Android源碼下編譯程序用的脖阵。
從以上可以看出,在2.2墅茉,沒有辦法直接結(jié)束一個應(yīng)用命黔,而只能用自己的辦法間接辦到呜呐。
現(xiàn)提供幾個方法,供參考:
1悍募、拋異常強(qiáng)制退出:
該方法通過拋異常蘑辑,使程序Force Close。
驗證可以坠宴,但是洋魂,需要解決的問題是,如何使程序結(jié)束掉喜鼓,而不彈出Force Close的窗口副砍。
2、記錄打開的Activity:
每打開一個Activity颠通,就記錄下來址晕。在需要退出時膀懈,關(guān)閉每一個Activity即可顿锰。
3、發(fā)送特定廣播:
在需要結(jié)束應(yīng)用時启搂,發(fā)送一個特定的廣播硼控,每個Activity收到廣播后,關(guān)閉即可胳赌。
4牢撼、遞歸退出
在打開新的Activity時使用startActivityForResult,然后自己加標(biāo)志疑苫,在onActivityResult中處理熏版,遞歸關(guān)閉。
除了第一個捍掺,都是想辦法把每一個Activity都結(jié)束掉撼短,間接達(dá)到目的。但是這樣做同樣不完美挺勿。你會發(fā)現(xiàn)曲横,如果自己的應(yīng)用程序?qū)γ恳粋€Activity都設(shè)置了nosensor,在兩個Activity結(jié)束的間隙不瓶,sensor可能有效了禾嫉。但至少,我們的目的達(dá)到了蚊丐,而且沒有影響用戶使用熙参。為了編程方便,最好定義一個Activity基類麦备,處理這些共通問題孽椰。

26讲竿、AIDL的全稱是什么?如何工作弄屡?能處理哪些類型的數(shù)據(jù)题禀?
答:全稱是:Android Interface Define Language
在Android中, 每個應(yīng)用程序都可以有自己的進(jìn)程. 在寫UI應(yīng)用的時候, 經(jīng)常要用到Service. 在不同的進(jìn)程中, 怎樣傳遞對象呢?顯然, Java中不允許跨進(jìn)程內(nèi)存共享. 因此傳遞對象, 只能把對象拆分成操作系統(tǒng)能理解的簡單形式, 以達(dá)到跨界對象訪問的目的. 在J2EE中,采用RMI的方式, 可以通過序列化傳遞對象. 在Android中, 則采用AIDL的方式. 理論上AIDL可以傳遞Bundle,實際上做起來卻比較麻煩。
AIDL(AndRoid接口描述語言)是一種借口描述語言; 編譯器可以通過aidl文件生成一段代碼膀捷,通過預(yù)先定義的接口達(dá)到兩個進(jìn)程內(nèi)部通信進(jìn)程的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個對象, 需要先將對象轉(zhuǎn)化成AIDL可識別的參數(shù)(可能是多個參數(shù)), 然后使用AIDL來傳遞這些參數(shù), 在消息的接收端, 使用這些參數(shù)組裝成自己需要的對象.
AIDL的IPC的機(jī)制和COM或CORBA類似, 是基于接口的迈嘹,但它是輕量級的。它使用代理類在客戶端和實現(xiàn)層間傳遞值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相關(guān)類.; 2. 調(diào)用aidl產(chǎn)生的class.
AIDL的創(chuàng)建方法:
AIDL語法很簡單,可以用來聲明一個帶一個或多個方法的接口全庸,也可以傳遞參數(shù)和返回值秀仲。 由于遠(yuǎn)程調(diào)用的需要, 這些參數(shù)和返回值并不是任何類型.下面是些AIDL支持的數(shù)據(jù)類型:

  1. 不需要import聲明的簡單Java編程語言類型(int,boolean等)
  2. String, CharSequence不需要特殊聲明
  3. List, Map和Parcelables類型, 這些類型內(nèi)所包含的數(shù)據(jù)成員也只能是簡單數(shù)據(jù)類型, String等其他比支持的類型.
    (另外: 我沒嘗試Parcelables, 在Eclipse+ADT下編譯不過, 或許以后會有所支持)
    27、請解釋下Android程序運(yùn)行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別壶笼。
    答:運(yùn)行時權(quán)限D(zhuǎn)alvik( android授權(quán))
    文件系統(tǒng) linux 內(nèi)核授權(quán)
    28神僵、系統(tǒng)上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面覆劈?請說明原由保礼。
    通過直接發(fā)送Uri把參數(shù)帶過去,或者通過manifest里的intentfilter里的data屬性

29责语、android系統(tǒng)的優(yōu)勢和不足
答:Android平臺手機(jī) 5大優(yōu)勢:
一炮障、開放性
在優(yōu)勢方面,Android平臺首先就是其開發(fā)性坤候,開發(fā)的平臺允許任何移動終端廠商加入到Android聯(lián)盟中來胁赢。顯著的開放性可以使其擁有更多的開發(fā)者,隨著用戶和應(yīng)用的日益豐富白筹,一個嶄新的平臺也將很快走向成熟智末。開放性對于Android的發(fā)展而言,有利于積累人氣徒河,這里的人氣包括消費(fèi)者和廠商系馆,而對于消費(fèi)者來講,隨大的受益正是豐富的軟件資源虚青。開放的平臺也會帶來更大競爭它呀,如此一來,消費(fèi)者將可以用更低的價位購得心儀的手機(jī)棒厘。
二纵穿、掙脫運(yùn)營商的束縛
在過去很長的一段時間,特別是在歐美地區(qū)奢人,手機(jī)應(yīng)用往往受到運(yùn)營商制約谓媒,使用什么功能接入什么網(wǎng)絡(luò),幾乎都受到運(yùn)營商的控制何乎。從去年iPhone 上市 句惯,用戶可以更加方便地連接網(wǎng)絡(luò)土辩,運(yùn)營商的制約減少。隨著EDGE抢野、HSDPA這些2G至3G移動網(wǎng)絡(luò)的逐步過渡和提升拷淘,手機(jī)隨意接入網(wǎng)絡(luò)已不是運(yùn)營商口中的笑談,當(dāng)你可以通過手機(jī)IM軟件方便地進(jìn)行即時聊天時指孤,再回想不久前天價的彩信和圖鈴下載業(yè)務(wù)启涯,是不是像噩夢一樣?互聯(lián)網(wǎng)巨頭Google推動的Android終端天生就有網(wǎng)絡(luò)特色恃轩,將讓用戶離互聯(lián)網(wǎng)更近结洼。
三、豐富的硬件選擇
這一點還是與Android平臺的開放性相關(guān)叉跛,由于Android的開放性松忍,眾多的廠商會推出千奇百怪,功能特色各具的多種產(chǎn)品筷厘。功能上的差異和特色鸣峭,卻不會影響到數(shù)據(jù)同步、甚至軟件的兼容敞掘,好比你從諾基亞 Symbian風(fēng)格手機(jī) 一下改用蘋果 iPhone 叽掘,同時還可將Symbian中優(yōu)秀的軟件帶到iPhone上使用、聯(lián)系人等資料更是可以方便地轉(zhuǎn)移玖雁,是不是非常方便呢?
四盖腕、不受任何限制的開發(fā)商
Android平臺提供給第三方開發(fā)商一個十分寬泛赫冬、自由的環(huán)境,不會受到各種條條框框的阻擾溃列,可想而知劲厌,會有多少新穎別致的軟件會誕生。但也有其兩面性听隐,血腥补鼻、暴力、情色方面的程序和游戲如可控制正是留給Android難題之一雅任。
五风范、無縫結(jié)合的Google應(yīng)用
如今叱詫互聯(lián)網(wǎng)的Google已經(jīng)走過10年度歷史,從搜索巨人到全面的互聯(lián)網(wǎng)滲透沪么,Google服務(wù)如地圖硼婿、郵件、搜索等已經(jīng)成為連接用戶和互聯(lián)網(wǎng)的重要紐帶禽车,而Android平臺手機(jī)將無縫結(jié)合這些優(yōu)秀的Google服務(wù)寇漫。
再說Android的5大不足:
一刊殉、安全和隱私
由于手機(jī) 與互聯(lián)網(wǎng)的緊密聯(lián)系,個人隱私很難得到保守州胳。除了上網(wǎng)過程中經(jīng)意或不經(jīng)意留下的個人足跡记焊,Google這個巨人也時時站在你的身后,洞穿一切栓撞,因此亚亲,互聯(lián)網(wǎng)的深入將會帶來新一輪的隱私危機(jī)。
二腐缤、首先開賣Android手機(jī)的不是最大運(yùn)營商
眾所周知捌归,T-Mobile在23日,于美國紐約發(fā)布 了Android首款手機(jī)G1岭粤。但是在北美市場惜索,最大的兩家運(yùn)營商乃AT&T和Verizon,而目前所知取得Android手機(jī)銷售權(quán)的僅有 T-Mobile和Sprint剃浇,其中T-Mobile的3G網(wǎng)絡(luò)相對于其他三家也要遜色不少巾兆,因此,用戶可以買賬購買G1虎囚,能否體驗到最佳的3G網(wǎng)絡(luò)服務(wù)則要另當(dāng)別論了角塑!
三、運(yùn)營商仍然能夠影響到Android手機(jī)
在國內(nèi)市場淘讥,不少用戶對購得移動定制機(jī)不滿圃伶,感覺所購的手機(jī)被人涂畫了廣告一般。這樣的情況在國外市場同樣出現(xiàn)蒲列。Android手機(jī)的另一發(fā)售運(yùn)營商Sprint就將在其機(jī)型中內(nèi)置其手機(jī)商店程序窒朋。
四、同類機(jī)型用戶減少
在不少手機(jī)論壇都會有針對某一型號的子論壇蝗岖,對一款手機(jī)的使用心得交流侥猩,并分享軟件資源。而對于Android平臺手機(jī)抵赢,由于廠商豐富欺劳,產(chǎn)品類型多樣,這樣使用同一款機(jī)型的用戶越來越少铅鲤,缺少統(tǒng)一機(jī)型的程序強(qiáng)化划提。舉個稍顯不當(dāng)?shù)睦樱F(xiàn)在山寨機(jī)泛濫彩匕,品種各異腔剂,就很少有專門針對某個型號山寨機(jī)的討論和群組,除了哪些功能異常搶眼驼仪、頗受追捧的機(jī)型以外掸犬。
五袜漩、過分依賴開發(fā)商缺少標(biāo)準(zhǔn)配置
在使用PC端的Windows Xp系統(tǒng)的時候,都會內(nèi)置微軟Windows Media Player這樣一個瀏覽器程序湾碎,用戶可以選擇更多樣的播放器宙攻,如Realplay或暴風(fēng)影音等。但入手開始使用默認(rèn)的程序同樣可以應(yīng)付多樣的需要介褥。在 Android平臺中座掘,由于其開放性,軟件更多依賴第三方廠商柔滔,比如Android系統(tǒng)的SDK中就沒有內(nèi)置音樂 播放器,全部依賴第三方開發(fā)睛廊,缺少了產(chǎn)品的統(tǒng)一性。
30超全、Android dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個概念
答:DVM指dalivk的虛擬機(jī)。每一個Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行嘶朱,都擁有一個獨立的Dalvik虛擬機(jī)實例。而每一個DVM都是在Linux 中的一個進(jìn)程疏遏,所以說可以認(rèn)為是同一個概念。
31改览、sim卡的EF文件是什么糯钙?有何作用
答:sim卡的文件系統(tǒng)有自己規(guī)范双揪,主要是為了和手機(jī)通訊,sim本 身可以有自己的操作系統(tǒng)庆揩,EF就是作存儲并和手機(jī)通訊用的
32、嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種跌穗, 各有何特性
  頁式订晌,段式,段頁蚌吸,用到了MMU,虛擬空間等技術(shù)
33锈拨、什么是嵌入式實時操作系統(tǒng), Android 操作系統(tǒng)屬于實時操作系統(tǒng)嗎?
嵌入式實時操作系統(tǒng)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時,能夠接受并以足夠快的速度予以處理羹唠,其處理的結(jié)果又能在規(guī)定的時間之內(nèi)來控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)作出快速響應(yīng)奕枢,并控制所有實時任務(wù)協(xié)調(diào)一致運(yùn)行的嵌入式操作系統(tǒng)娄昆。主要用于工業(yè)控制、 軍事設(shè)備缝彬、 航空航天等領(lǐng)域?qū)ο到y(tǒng)的響應(yīng)時間有苛刻的要求萌焰,這就需要使用實時系統(tǒng)。又可分為軟實時和硬實時兩種谷浅,而android是基于linux內(nèi)核的扒俯,因此屬于軟實時。
34一疯、一條最長的短信息約占多少byte?
  中文70(包括標(biāo)點)撼玄,英文160,160個字節(jié)墩邀≌泼停  
35、有一個一維整型數(shù)組int[]data保存的是一張寬為width磕蒲,高為height的圖片像素值信息留潦。請寫一個算法,將該圖片所有的白色不透明(0xffffffff)像素點的透明度調(diào)整為50%辣往。
36、如何將SQLite數(shù)據(jù)庫(dictionary.db文件)與apk文件一起發(fā)布
解答:可以將dictionary.db文件復(fù)制到Eclipse Android工程中的res aw目錄中站削。所有在res aw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件十偶≡跋福可以將dictionary.db文件復(fù)制到res aw目錄中
37猛频、如何將打開res aw目錄中的數(shù)據(jù)庫文件?
解答:在Android中不能直接打開res aw目錄中的數(shù)據(jù)庫文件,而需要在程序第一次啟動時將該文件復(fù)制到手機(jī)內(nèi)存或SD卡的某個目錄中睦柴,然后再打開該數(shù)據(jù)庫文件毡熏。
復(fù)制的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream對象,然后將該InputStream對象中的數(shù)據(jù)寫入其他的目錄中相應(yīng)文件中狱窘。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數(shù)據(jù)庫文件。
38哑舒、DDMS和TraceView的區(qū)別?
DDMS是一個程序執(zhí)行查看器洗鸵,在里面可以看見線程和堆棧等信息仗嗦,TraceView是程序性能分析器 。
39火邓、java中如何引用本地語言
可以用JNI(java native interface java 本地接口)接口 德撬。
40、談?wù)凙ndroid的IPC(進(jìn)程間通信)機(jī)制
IPC是內(nèi)部進(jìn)程通信的簡稱纤勒, 是共享"命名管道"的資源摇天。Android中的IPC機(jī)制是為了讓Activity和Service之間可以隨時的進(jìn)行交互恐仑,故在Android中該機(jī)制,只適用于Activity和Service之間的通信腕让,類似于遠(yuǎn)程方法調(diào)用歧斟,類似于C/S模式的訪問。通過定義AIDL接口文件來定義IPC接口构捡。Servier端實現(xiàn)IPC接口勾徽,Client端調(diào)用IPC接口本地代理喘帚。
41、NDK是什么
NDK是一些列工具的集合吹由,NDK提供了一系列的工具倾鲫,幫助開發(fā)者迅速的開發(fā)C/C++的動態(tài)庫,并能自動將so和java 應(yīng)用打成apk包隙疚。
NDK集成了交叉編譯器磕道,并提供了相應(yīng)的mk文件和隔離cpu溺蕉、平臺等的差異,開發(fā)人員只需簡單的修改mk文件就可以創(chuàng)建出so

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哗魂,一起剝皮案震驚了整個濱河市辙芍,隨后出現(xiàn)的幾起案子故硅,更是在濱河造成了極大的恐慌,老刑警劉巖往踢,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峻呕,死亡現(xiàn)場離奇詭異趣效,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)讯私,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門斤寇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牙寞,你說我怎么就攤上這事莫秆。” “怎么了雷蹂?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵匪煌,是天一觀的道長萎庭。 經(jīng)常有香客問我齿拂,道長,這世上最難降的妖魔是什么吗购? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任捻勉,我火速辦了婚禮刀森,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘埠偿。我一直安慰自己榜晦,他們只是感情好乾胶,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牙躺,像睡著了一般孽拷。 火紅的嫁衣襯著肌膚如雪半抱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天炼幔,我揣著相機(jī)與錄音乃秀,去河邊找鬼圆兵。 笑死,一個胖子當(dāng)著我的面吹牛刀脏,可吹牛的內(nèi)容都是我干的超凳。 我是一名探鬼主播轮傍,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼擎析!你這毒婦竟也來了揍魂?” 一聲冷哼從身側(cè)響起棚瘟,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤偎蘸,失蹤者是張志新(化名)和其女友劉穎瞬内,沒想到半個月后虫蝶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倦西,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡扰柠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年卤档,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汤踏。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡茎活,死狀恐怖琢唾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情懒熙,我是刑警寧澤普办,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布衔蹲,位于F島的核電站,受9級特大地震影響橱健,放射性物質(zhì)發(fā)生泄漏沙廉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一珊皿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粉臊,春花似錦溢吻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倡怎。三九已至,卻和暖如春颤专,著一層夾襖步出監(jiān)牢的瞬間钠乏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工簇捍, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留暑塑,地道東北人锅必。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓搞隐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親么鹤。 傳聞我的和親對象是個殘疾皇子味廊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容