2018年Android 面試題
IT開發(fā)仔?2018-03-21 15:26:46
在這“金三銀四”的季節(jié),我準(zhǔn)備了一些面試題怕膛,可能會(huì)用得上的熟嫩。最近我也在找工作,準(zhǔn)備面試呢褐捻。
1掸茅、 Android的四大組件是哪些,它們的作用柠逞?
答:
(1)?Activity:Activity是Android程序與用戶交互的窗口昧狮,是Android構(gòu)造塊中最基本的一種,它需要為保持各界面的狀態(tài)板壮,做很多持久化的事情逗鸣,妥善管理生命周期以及一些跳轉(zhuǎn)邏輯。
(2)service:后臺(tái)服務(wù)于Activity绰精,封裝有一個(gè)完整的功能邏輯實(shí)現(xiàn)撒璧,接受上層指令,完成相關(guān)的事物笨使,定義好需要接受的Intent提供同步和異步的接口卿樱。
(3)Content Provider:是Android提供的第三方應(yīng)用數(shù)據(jù)的訪問(wèn)方案,可以派生Content Provider類硫椰,對(duì)外提供數(shù)據(jù)繁调,可以像數(shù)據(jù)庫(kù)一樣進(jìn)行選擇排序萨蚕,屏蔽內(nèi)部數(shù)據(jù)的存儲(chǔ)細(xì)節(jié),向外提供統(tǒng)一的借口模型涉馁,大大簡(jiǎn)化上層應(yīng)用门岔,對(duì)數(shù)據(jù)的整合提供了更方便的途徑。
(4)BroadCast Receiver:接受一種或者多種Intent作觸發(fā)事件烤送,接受相關(guān)消息蟆豫,做一些簡(jiǎn)單處理康震,轉(zhuǎn)換成一條Notification,統(tǒng)一了Android的事件廣播模型。
2拗窃、 請(qǐng)介紹下Android中常用的布局牺勾。
答:常用五種布局方式挟阻,分別是:FrameLayout(框架布局)衅枫,LinearLayout (線性布局),AbsoluteLayout(絕對(duì)布局)阅悍,RelativeLayout(相對(duì)布局)好渠,TableLayout(表格布局)。
(1)FrameLayout:所有東西依次都放在左上角节视,會(huì)重疊拳锚,這個(gè)布局比較簡(jiǎn)單,也只能放一點(diǎn)比較簡(jiǎn)單的東西寻行。
(2)LinearLayout:線性布局霍掺,每一個(gè)LinearLayout里面又可分為垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal" )。當(dāng)垂直布局時(shí)拌蜘,每一行就只有一個(gè)元素杆烁,多個(gè)元素依次垂直往下;水平布局時(shí)简卧,只有一行兔魂,每一個(gè)元素依次向右排列。
(3)AbsoluteLayout:絕對(duì)布局用X,Y坐標(biāo)來(lái)指定元素的位置举娩,這種布局方式也比較簡(jiǎn)單入热,但是在屏幕旋轉(zhuǎn)時(shí),往往會(huì)出問(wèn)題晓铆,而且多個(gè)元素的時(shí)候,計(jì)算比較麻煩绰播。
(4)RelativeLayout:相對(duì)布局可以理解為某一個(gè)元素為參照物骄噪,來(lái)定位的布局方式。主要屬性有:相對(duì)于某一個(gè)元素android:layout_below蠢箩、 android:layout_toLeftOf相對(duì)于父元素的地方android:layout_alignParentLeft链蕊、android:layout_alignParentRigh事甜;
(5)TableLayout:表格布局,每一個(gè)TableLayout里面有表格行TableRow滔韵,TableRow里面可以具體定義每一個(gè)元素逻谦。每一個(gè)布局都有自己適合的方式,這五個(gè)布局元素可以相互嵌套應(yīng)用陪蜻,做出美觀的界面邦马。
3、 android中的動(dòng)畫有哪幾類宴卖,它們的特點(diǎn)和區(qū)別是什么
答:android 3.0以前有兩種滋将,一種是Tween動(dòng)畫、還有一種是Frame動(dòng)畫症昏。Tween動(dòng)畫随闽,這種實(shí)現(xiàn)方式可以使視圖組件移動(dòng)、放大肝谭、縮小以及產(chǎn)生透明度的變化;另一種Frame動(dòng)畫掘宪,傳統(tǒng)的動(dòng)畫方法,通過(guò)順序的播放排列好的圖片來(lái)實(shí)現(xiàn)攘烛,類似電影魏滚。android 3.0 之后新增了PropertyAnimation動(dòng)畫,即屬性動(dòng)畫医寿。更改的是對(duì)象的實(shí)際屬性栏赴,實(shí)現(xiàn)比較復(fù)雜的效果,如手機(jī)桌面上的火箭加速器靖秩。
4须眷、 android 中有哪幾種解析xml的類?官方推薦哪種沟突?以及它們的原理和區(qū)別花颗。
答:XML解析主要有三種方式,SAX惠拭、DOM扩劝、PULL。常規(guī)在PC上開發(fā)我們使用Dom相對(duì)輕松些职辅,但一些性能敏感的數(shù)據(jù)庫(kù)或手機(jī)上還是主要采用SAX方式棒呛,SAX讀取是單向的,優(yōu)點(diǎn):不占內(nèi)存空間域携、解析屬性方便簇秒,但缺點(diǎn)就是對(duì)于套嵌多個(gè)分支來(lái)說(shuō)處理不是很方便。而DOM方式會(huì)把整個(gè)XML文件加載到內(nèi)存中去秀鞭,這里提醒大家該方法在查找方面可以和XPath很好的結(jié)合如果數(shù)據(jù)量不是很大推薦使用趋观,而PULL常常用在J2ME對(duì)于節(jié)點(diǎn)處理比較好扛禽,類似SAX方式,同樣很節(jié)省內(nèi)存皱坛,在J2ME中我們經(jīng)常使用的KXML庫(kù)來(lái)解析编曼。
5、 ListView的優(yōu)化方案
答:(1)如果自定義適配器剩辟,那么在getView方法中要考慮方法傳進(jìn)來(lái)的參數(shù)contentView是否為null掐场,如果為null就創(chuàng)建contentView并返回,如果不為null則直接使用抹沪。在這個(gè)方法中盡可能少創(chuàng)建view刻肄。
(2)給contentView設(shè)置tag(setTag()),傳入一個(gè)viewHolder對(duì)象融欧,用于緩存要顯示的數(shù)據(jù)敏弃,可以達(dá)到圖像數(shù)據(jù)異步加載的效果。
(3)如果listview需要顯示的item很多噪馏,就要考慮分頁(yè)加載麦到。比如一共要顯示100條或者更多的時(shí)候,我們可以考慮先加載20條欠肾,等用戶拉到列表底部的時(shí)候再去加載接下來(lái)的20條瓶颠。
6、 請(qǐng)介紹下Android的數(shù)據(jù)存儲(chǔ)方式刺桃。
答:使用SharedPreferences存儲(chǔ)數(shù)據(jù)粹淋;文件存儲(chǔ)數(shù)據(jù);SQLite數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)瑟慈;使用ContentProvider存儲(chǔ)數(shù)據(jù)桃移;網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù);Preference葛碧,F(xiàn)ile借杰, DataBase這三種方式分別對(duì)應(yīng)的目錄是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。
(一):使用SharedPreferences存儲(chǔ)數(shù)據(jù)
首先說(shuō)明SharedPreferences存儲(chǔ)方式进泼,它是 Android提供的用來(lái)存儲(chǔ)一些簡(jiǎn)單配置信息的一種機(jī)制蔗衡,例如:登錄用戶的用戶名與密碼。其采用了Map數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)數(shù)據(jù)乳绕,以鍵值的方式存儲(chǔ)绞惦,可以簡(jiǎn)單的讀取與寫入,具體實(shí)例如下:
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ù)讀取與寫入的方法都非常簡(jiǎn)單洋措,只是在寫入的時(shí)候有些區(qū)別:先調(diào)用edit()使其處于編輯狀態(tài)翩隧,然后才能修改數(shù)據(jù),最后使用commit()提交修改的數(shù)據(jù)。實(shí)際上SharedPreferences是采用了XML格式將數(shù)據(jù)存儲(chǔ)到設(shè)備中堆生,在DDMS中的File Explorer中的/data/data//shares_prefs下。使用SharedPreferences是有些限制的:只能在同一個(gè)包內(nèi)使用雷酪,不能在不同的包之間使用淑仆。
(二):文件存儲(chǔ)數(shù)據(jù)
文件存儲(chǔ)方式是一種較常用的方法,在Android中讀取/寫入文件的方法哥力,與 Java中實(shí)現(xiàn)I/O的程序是完全一樣的蔗怠,提供了openFileInput()和openFileOutput()方法來(lái)讀取設(shè)備上的文件。具體實(shí)例如下:
String fn = “moandroid.log”;
FileInputStream fis = openFileInput(fn);
FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);
(三):網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù)
網(wǎng)絡(luò)存儲(chǔ)方式吩跋,需要與Android 網(wǎng)絡(luò)數(shù)據(jù)包打交道寞射,關(guān)于Android 網(wǎng)絡(luò)數(shù)據(jù)包的詳細(xì)說(shuō)明,我以后寫上锌钮。
(四):ContentProvider
1桥温、ContentProvider簡(jiǎn)介
當(dāng)應(yīng)用繼承ContentProvider類,并重寫該類用于提供數(shù)據(jù)和存儲(chǔ)數(shù)據(jù)的方法梁丘,就可以向其他應(yīng)用共享其數(shù)據(jù)侵浸。雖然使用其他方法也可以對(duì)外共享數(shù)據(jù),但數(shù)據(jù)訪問(wèn)方式會(huì)因數(shù)據(jù)存儲(chǔ)的方式而不同氛谜,如:采用文件方式對(duì)外共享數(shù)據(jù)掏觉,需要進(jìn)行文件操作讀寫數(shù)據(jù);采用sharedpreferences共享數(shù)據(jù)值漫,需要使用sharedpreferences API讀寫數(shù)據(jù)澳腹。而使用ContentProvider共享數(shù)據(jù)的好處是統(tǒng)一了數(shù)據(jù)訪問(wèn)方式。
2杨何、Uri類簡(jiǎn)介
Uri代表了要操作的數(shù)據(jù)酱塔,Uri主要包含了兩部分信息:1.需要操作的ContentProvider ,2.對(duì)ContentProvider中的什么數(shù)據(jù)進(jìn)行操作晚吞,一個(gè)Uri由以下幾部分組成:
1).scheme:ContentProvider(內(nèi)容提供者)的scheme已經(jīng)由Android所規(guī)定為:content://…
2).主機(jī)名(或Authority):用于唯一標(biāo)識(shí)這個(gè)ContentProvider延旧,外部調(diào)用者可以根據(jù)這個(gè)標(biāo)識(shí)來(lái)找到它。
3).路徑(path):可以用來(lái)表示我們要操作的數(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ù)不一定來(lái)自數(shù)據(jù)庫(kù),也可以是文件等他存儲(chǔ)方式缅糟,如下:
要操作xml文件中contact節(jié)點(diǎn)下的name節(jié)點(diǎn)挺智,可以構(gòu)建這樣的路徑:/contact/name
如果要把一個(gè)字符串轉(zhuǎn)換成Uri,可以使用Uri類中的parse()方法窗宦,如下:
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")
3赦颇、UriMatcher二鳄、ContentUrist和ContentResolver簡(jiǎn)介
因?yàn)閁ri代表了要操作的數(shù)據(jù),所以我們很經(jīng)常需要解析Uri媒怯,并從 Uri中獲取數(shù)據(jù)订讼。Android系統(tǒng)提供了兩個(gè)用于操作Uri的工具類,分別為UriMatcher 和ContentUris 扇苞。掌握它們的使用欺殿,會(huì)便于我們的開發(fā)工作。
UriMatcher:用于匹配Uri鳖敷,它的用法如下:
(1).首先把你需要匹配Uri路徑全部給注冊(cè)上脖苏,如下:
//常量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棍潘,如果匹配就會(huì)返回匹配碼
//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路徑,返回匹配碼為2
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#號(hào)為通配符
(2).注冊(cè)完需要匹配的Uri后屋吨,就可以使用uriMatcher.match(uri)方法對(duì)輸入的Uri進(jìn)行匹配蜒谤,如果匹配就返回匹配碼,匹配碼是調(diào)用 addURI()方法傳入的第三個(gè)參數(shù)至扰,假設(shè)匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路徑鳍徽,返回的匹配碼為1。
ContentUris:用于獲取Uri路徑后面的ID部分敢课,它有兩個(gè)比較實(shí)用的方法:
withAppendedId(uri, id)用于為路徑加上ID部分
parseId(uri)方法用于從路徑中獲取ID部分
ContentResolver:當(dāng)外部應(yīng)用需要對(duì)ContentProvider中的數(shù)據(jù)進(jìn)行添加阶祭、刪除、修改和查詢操作時(shí)直秆,可以使用 ContentResolver 類來(lái)完成濒募,要獲取ContentResolver 對(duì)象,可以使用Activity提供的getContentResolver()方法圾结。 ContentResolver使用insert瑰剃、delete、update筝野、query方法晌姚,來(lái)操作數(shù)據(jù)。
7歇竟、activity的啟動(dòng)模式有哪些挥唠?是什么含義?
答:在android里焕议,有4種activity的啟動(dòng)模式宝磨,分別為:
“standard” (默認(rèn))
“singleTop”
“singleTask”
“singleInstance”
它們主要有如下不同:
1. 如何決定所屬task
“standard”和”singleTop”的activity的目標(biāo)task,和收到的Intent的發(fā)送者在同一個(gè)task內(nèi),除非intent包括參數(shù)FLAG_ACTIVITY_NEW_TASK唤锉。
如果提供了FLAG_ACTIVITY_NEW_TASK參數(shù)世囊,會(huì)啟動(dòng)到別的task里。
“singleTask”和”singleInstance”總是把a(bǔ)ctivity作為一個(gè)task的根元素窿祥,他們不會(huì)被啟動(dòng)到一個(gè)其他task里茸习。
2. 是否允許多個(gè)實(shí)例
“standard”和”singleTop”可以被實(shí)例化多次,并且存在于不同的task中壁肋,且一個(gè)task可以包括一個(gè)activity的多個(gè)實(shí)例;
“singleTask”和”singleInstance”則限制只生成一個(gè)實(shí)例籽慢,并且是task的根元素浸遗。 singleTop要求如果創(chuàng)建intent的時(shí)候棧頂已經(jīng)有要?jiǎng)?chuàng)建的Activity的實(shí)例,則將intent發(fā)送給該實(shí)例箱亿,而不發(fā)送給新的實(shí)例跛锌。
3. 是否允許其它activity存在于本task內(nèi)
“singleInstance”獨(dú)占一個(gè)task,其它activity不能存在那個(gè)task里届惋;如果它啟動(dòng)了一個(gè)新的activity髓帽,不管新的activity的launch mode 如何,新的activity都將會(huì)到別的task里運(yùn)行(如同加了FLAG_ACTIVITY_NEW_TASK參數(shù))脑豹。
而另外三種模式郑藏,則可以和其它activity共存。
4. 是否每次都生成新實(shí)例
“standard”對(duì)于沒(méi)一個(gè)啟動(dòng)Intent都會(huì)生成一個(gè)activity的新實(shí)例瘩欺;
“singleTop”的activity如果在task的棧頂?shù)脑挶馗牵瑒t不生成新的該activity的實(shí)例,直接使用棧頂?shù)膶?shí)例俱饿,否則歌粥,生成該activity的實(shí)例。
比如現(xiàn)在task棧元素為A-B-C-D(D在棧頂)拍埠,這時(shí)候給D發(fā)一個(gè)啟動(dòng)intent失驶,如果D是 “standard”的,則生成D的一個(gè)新實(shí)例枣购,棧變?yōu)锳-B-C-D-D嬉探。
如果D是singleTop的話,則不會(huì)生產(chǎn)D的新實(shí)例坷虑,棧狀態(tài)仍為A-B-C-D
如果這時(shí)候給B發(fā)Intent的話甲馋,不管B的launchmode是”standard” 還是 “singleTop” ,都會(huì)生成B的新實(shí)例迄损,棧狀態(tài)變?yōu)锳-B-C-D-B定躏。
“singleInstance”是其所在棧的唯一activity,它會(huì)每次都被重用。
“singleTask”如果在棧頂痊远,則接受intent垮抗,否則,該intent會(huì)被丟棄碧聪,但是該task仍會(huì)回到前臺(tái)冒版。
當(dāng)已經(jīng)存在的activity實(shí)例處理新的intent時(shí)候,會(huì)調(diào)用onNewIntent()方法 如果收到intent生成一個(gè)activity實(shí)例逞姿,那么用戶可以通過(guò)back鍵回到上一個(gè)狀態(tài)辞嗡;如果是已經(jīng)存在的一個(gè)activity來(lái)處理這個(gè)intent的話,用戶不能通過(guò)按back鍵返回到這之前的狀態(tài)滞造。
8续室、跟activity和Task 有關(guān)的 Intent啟動(dòng)方式有哪些?其含義谒养?
核心的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è)置挺狰,這個(gè)Activity會(huì)成為歷史stack中一個(gè)新Task的開始。一個(gè)Task(從啟動(dòng)它的Activity到下一個(gè)Task中的 Activity)定義了用戶可以遷移的Activity原子組买窟。Task可以移動(dòng)到前臺(tái)和后臺(tái)丰泊;在某個(gè)特定Task中的所有Activity總是保持相同的次序。
這個(gè)標(biāo)志一般用于呈現(xiàn)“啟動(dòng)”類型的行為:它們提供用戶一系列可以單獨(dú)完成的事情始绍,與啟動(dòng)它們的Activity完全無(wú)關(guān)瞳购。
使用這個(gè)標(biāo)志,如果正在啟動(dòng)的Activity的Task已經(jīng)在運(yùn)行的話疆虚,那么苛败,新的Activity將不會(huì)啟動(dòng);代替的径簿,當(dāng)前Task會(huì)簡(jiǎn)單的移入前臺(tái)罢屈。參考FLAG_ACTIVITY_MULTIPLE_TASK標(biāo)志庸诱,可以禁用這一行為挫鸽。
這個(gè)標(biāo)志不能用于調(diào)用方對(duì)已經(jīng)啟動(dòng)的Activity請(qǐng)求結(jié)果。
FLAG_ACTIVITY_CLEAR_TOP
如果設(shè)置苍姜,并且這個(gè)Activity已經(jīng)在當(dāng)前的Task中運(yùn)行曼月,因此,不再是重新啟動(dòng)一個(gè)這個(gè)Activity的實(shí)例柔昼,而是在這個(gè)Activity上方的所有Activity都將關(guān)閉哑芹,然后這個(gè)Intent會(huì)作為一個(gè)新的Intent投遞到老的Activity(現(xiàn)在位于頂端)中。
例如捕透,假設(shè)一個(gè)Task中包含這些Activity:A聪姿,B碴萧,C,D末购。如果D調(diào)用了startActivity()破喻,并且包含一個(gè)指向Activity B的Intent,那么盟榴,C和D都將結(jié)束曹质,然后B接收到這個(gè)Intent,因此擎场,目前stack的狀況是:A羽德,B。
上例中正在運(yùn)行的Activity B既可以在onNewIntent()中接收到這個(gè)新的Intent迅办,也可以把自己關(guān)閉然后重新啟動(dòng)來(lái)接收這個(gè)Intent玩般。如果它的啟動(dòng)模式聲明為 “multiple”(默認(rèn)值),并且你沒(méi)有在這個(gè)Intent中設(shè)置FLAG_ACTIVITY_SINGLE_TOP標(biāo)志礼饱,那么它將關(guān)閉然后重新創(chuàng)建;對(duì)于其它的啟動(dòng)模式究驴,或者在這個(gè)Intent中設(shè)置FLAG_ACTIVITY_SINGLE_TOP標(biāo)志镊绪,都將把這個(gè)Intent投遞到當(dāng)前這個(gè)實(shí)例的onNewIntent()中。
這個(gè)啟動(dòng)模式還可以與FLAG_ACTIVITY_NEW_TASK結(jié)合起來(lái)使用:用于啟動(dòng)一個(gè)Task中的根Activity洒忧,它會(huì)把那個(gè)Task中任何運(yùn)行的實(shí)例帶入前臺(tái)蝴韭,然后清除它直到根Activity。這非常有用熙侍,例如榄鉴,當(dāng)從Notification Manager處啟動(dòng)一個(gè)Activity。
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
如果設(shè)置這個(gè)標(biāo)志蛉抓,這個(gè)activity不管是從一個(gè)新的棧啟動(dòng)還是從已有棧推到棧頂庆尘,它都將以the front door of the task的方式啟動(dòng)。這就講導(dǎo)致任何與應(yīng)用相關(guān)的棧都講重置到正常狀態(tài)(不管是正在講activity移入還是移除)巷送,如果需要驶忌,或者直接重置該棧為初始狀態(tài)。
FLAG_ACTIVITY_SINGLE_TOP
如果設(shè)置笑跛,當(dāng)這個(gè)Activity位于歷史stack的頂端運(yùn)行時(shí)付魔,不再啟動(dòng)一個(gè)新的
FLAG_ACTIVITY_BROUGHT_TO_FRONT
這個(gè)標(biāo)志一般不是由程序代碼設(shè)置的,如在launchMode中設(shè)置singleTask模式時(shí)系統(tǒng)幫你設(shè)定飞蹂。
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
如果設(shè)置几苍,這將在Task的Activity stack中設(shè)置一個(gè)還原點(diǎn),當(dāng)Task恢復(fù)時(shí)陈哑,需要清理Activity妻坝。也就是說(shuō)伸眶,下一次Task帶著 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標(biāo)記進(jìn)入前臺(tái)時(shí)(典型的操作是用戶在主畫面重啟它),這個(gè)Activity和它之上的都將關(guān)閉惠勒,以至于用戶不能再返回到它們赚抡,但是可以回到之前的Activity。
這在你的程序有分割點(diǎn)的時(shí)候很有用纠屋。例如涂臣,一個(gè)e-mail應(yīng)用程序可能有一個(gè)操作是查看一個(gè)附件,需要啟動(dòng)圖片瀏覽Activity來(lái)顯示售担。這個(gè) Activity應(yīng)該作為e-mail應(yīng)用程序Task的一部分赁遗,因?yàn)檫@是用戶在這個(gè)Task中觸發(fā)的操作。然而族铆,當(dāng)用戶離開這個(gè)Task岩四,然后從主畫面選擇e-mail app,我們可能希望回到查看的會(huì)話中哥攘,但不是查看圖片附件剖煌,因?yàn)檫@讓人困惑。通過(guò)在啟動(dòng)圖片瀏覽時(shí)設(shè)定這個(gè)標(biāo)志逝淹,瀏覽及其它啟動(dòng)的Activity在下次用戶返回到mail程序時(shí)都將全部清除耕姊。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
如果設(shè)置,新的Activity不會(huì)在最近啟動(dòng)的Activity的列表中保存栅葡。
FLAG_ACTIVITY_FORWARD_RESULT
如果設(shè)置茉兰,并且這個(gè)Intent用于從一個(gè)存在的Activity啟動(dòng)一個(gè)新的Activity,那么欣簇,這個(gè)作為答復(fù)目標(biāo)的Activity將會(huì)傳到這個(gè)新的Activity中规脸。這種方式下,新的Activity可以調(diào)用setResult(int)熊咽,并且這個(gè)結(jié)果值將發(fā)送給那個(gè)作為答復(fù)目標(biāo)的 Activity莫鸭。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
這個(gè)標(biāo)志一般不由應(yīng)用程序代碼設(shè)置,如果這個(gè)Activity是從歷史記錄里啟動(dòng)的(常按HOME鍵)横殴,那么黔龟,系統(tǒng)會(huì)幫你設(shè)定。
FLAG_ACTIVITY_MULTIPLE_TASK
不要使用這個(gè)標(biāo)志滥玷,除非你自己實(shí)現(xiàn)了應(yīng)用程序啟動(dòng)器氏身。與FLAG_ACTIVITY_NEW_TASK結(jié)合起來(lái)使用,可以禁用把已存的Task送入前臺(tái)的行為惑畴。當(dāng)設(shè)置時(shí)蛋欣,新的Task總是會(huì)啟動(dòng)來(lái)處理Intent,而不管這是是否已經(jīng)有一個(gè)Task可以處理相同的事情如贷。
由于默認(rèn)的系統(tǒng)不包含圖形Task管理功能陷虎,因此到踏,你不應(yīng)該使用這個(gè)標(biāo)志,除非你提供給用戶一種方式可以返回到已經(jīng)啟動(dòng)的Task尚猿。
如果FLAG_ACTIVITY_NEW_TASK標(biāo)志沒(méi)有設(shè)置窝稿,這個(gè)標(biāo)志被忽略。
FLAG_ACTIVITY_NO_ANIMATION
如果在Intent中設(shè)置凿掂,并傳遞給Context.startActivity()的話伴榔,這個(gè)標(biāo)志將阻止系統(tǒng)進(jìn)入下一個(gè)Activity時(shí)應(yīng)用 Acitivity遷移動(dòng)畫。這并不意味著動(dòng)畫將永不運(yùn)行——如果另一個(gè)Activity在啟動(dòng)顯示之前庄萎,沒(méi)有指定這個(gè)標(biāo)志踪少,那么,動(dòng)畫將被應(yīng)用糠涛。這個(gè)標(biāo)志可以很好的用于執(zhí)行一連串的操作援奢,而動(dòng)畫被看作是更高一級(jí)的事件的驅(qū)動(dòng)。
FLAG_ACTIVITY_NO_HISTORY
如果設(shè)置忍捡,新的Activity將不再歷史stack中保留集漾。用戶一離開它,這個(gè)Activity就關(guān)閉了砸脊。這也可以通過(guò)設(shè)置noHistory特性帆竹。
FLAG_ACTIVITY_NO_USER_ACTION
如果設(shè)置,作為新啟動(dòng)的Activity進(jìn)入前臺(tái)時(shí)脓规,這個(gè)標(biāo)志將在Activity暫停之前阻止從最前方的Activity回調(diào)的onUserLeaveHint()。
典型的险领,一個(gè)Activity可以依賴這個(gè)回調(diào)指明顯式的用戶動(dòng)作引起的Activity移出后臺(tái)侨舆。這個(gè)回調(diào)在Activity的生命周期中標(biāo)記一個(gè)合適的點(diǎn),并關(guān)閉一些Notification绢陌。
如果一個(gè)Activity通過(guò)非用戶驅(qū)動(dòng)的事件挨下,如來(lái)電或鬧鐘,啟動(dòng)的脐湾,這個(gè)標(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()愁铺,這個(gè)標(biāo)志將引發(fā)已經(jīng)運(yùn)行的Activity移動(dòng)到歷史stack的頂端。
例如闻鉴,假設(shè)一個(gè)Task由四個(gè)Activity組成:A,B,C,D茵乱。如果D調(diào)用startActivity()來(lái)啟動(dòng)Activity B,那么孟岛,B會(huì)移動(dòng)到歷史stack的頂端瓶竭,現(xiàn)在的次序變成A,C,D,B督勺。如果FLAG_ACTIVITY_CLEAR_TOP標(biāo)志也設(shè)置的話,那么這個(gè)標(biāo)志將被忽略斤贰。
9智哀、 請(qǐng)描述下Activity的生命周期。
答:activity的生命周期方法有:onCreate()荧恍、onStart()瓷叫、onReStart()、onResume()块饺、onPause()赞辩、onStop()、onDestory()授艰;
可見生命周期:從onStart()直到系統(tǒng)調(diào)用onStop()
前臺(tái)生命周期:從onResume()直到系統(tǒng)調(diào)用onPause()
10辨嗽、 activity在屏幕旋轉(zhuǎn)時(shí)的生命周期
答:不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期淮腾,切橫屏?xí)r會(huì)執(zhí)行一次糟需,切豎屏?xí)r會(huì)執(zhí)行兩次;設(shè)置Activity的android:configChanges="orientation"時(shí)谷朝,切屏還是會(huì)重新調(diào)用各個(gè)生命周期洲押,切橫、豎屏?xí)r只會(huì)執(zhí)行一次圆凰;設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí)杈帐,切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法
11专钉、 如何啟用Service挑童,如何停用Service。
服務(wù)的開發(fā)比較簡(jiǎn)單跃须,如下:
第一步:繼承Service類
public class SMSService extends Service {}
第二步:在AndroidManifest.xml文件中的節(jié)點(diǎn)里對(duì)服務(wù)進(jìn)行配置:
服務(wù)不能自己運(yùn)行站叼,需要通過(guò)調(diào)用Context.startService()或Context.bindService()方法啟動(dòng)服務(wù)。這兩個(gè)方法都可以啟動(dòng)Service菇民,但是它們的使用場(chǎng)合有所不同尽楔。使用startService()方法啟用服務(wù),調(diào)用者與服務(wù)之間沒(méi)有關(guān)連第练,即使調(diào)用者退出了阔馋,服務(wù)仍然運(yùn)行。使用bindService()方法啟用服務(wù)娇掏,調(diào)用者與服務(wù)綁定在了一起垦缅,調(diào)用者一旦退出,服務(wù)也就終止驹碍,大有“不求同時(shí)生壁涎,必須同時(shí)死”的特點(diǎn)凡恍。
如果打算采用Context.startService()方法啟動(dòng)服務(wù),在服務(wù)未被創(chuàng)建時(shí)怔球,系統(tǒng)會(huì)先調(diào)用服務(wù)的onCreate()方法嚼酝,接著調(diào)用onStart()方法。如果調(diào)用startService()方法前服務(wù)已經(jīng)被創(chuàng)建竟坛,多次調(diào)用startService()方法并不會(huì)導(dǎo)致多次創(chuàng)建服務(wù)闽巩,但會(huì)導(dǎo)致多次調(diào)用onStart()方法。采用startService()方法啟動(dòng)的服務(wù)担汤,只能調(diào)用Context.stopService()方法結(jié)束服務(wù)涎跨,服務(wù)結(jié)束時(shí)會(huì)調(diào)用onDestroy()方法。
如果打算采用Context.bindService()方法啟動(dòng)服務(wù)崭歧,在服務(wù)未被創(chuàng)建時(shí)隅很,系統(tǒng)會(huì)先調(diào)用服務(wù)的onCreate()方法,接著調(diào)用onBind()方法率碾。這個(gè)時(shí)候調(diào)用者和服務(wù)綁定在一起叔营,調(diào)用者退出了,系統(tǒng)就會(huì)先調(diào)用服務(wù)的onUnbind()方法所宰,接著調(diào)用onDestroy()方法绒尊。如果調(diào)用bindService()方法前服務(wù)已經(jīng)被綁定,多次調(diào)用bindService()方法并不會(huì)導(dǎo)致多次創(chuàng)建服務(wù)及綁定(也就是說(shuō)onCreate()和onBind()方法并不會(huì)被多次調(diào)用)仔粥。如果調(diào)用者希望與正在綁定的服務(wù)解除綁定婴谱,可以調(diào)用unbindService()方法,調(diào)用該方法也會(huì)導(dǎo)致系統(tǒng)調(diào)用服務(wù)的onUnbind()-->onDestroy()方法躯泰。
服務(wù)常用生命周期回調(diào)方法如下:
onCreate() 該方法在服務(wù)被創(chuàng)建時(shí)調(diào)用谭羔,該方法只會(huì)被調(diào)用一次,無(wú)論調(diào)用多少次startService()或bindService()方法斟冕,服務(wù)也只被創(chuàng)建一次。
onDestroy()該方法在服務(wù)被終止時(shí)調(diào)用缅阳。
與采用Context.startService()方法啟動(dòng)服務(wù)有關(guān)的生命周期方法
onStart() 只有采用Context.startService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法磕蛇。該方法在服務(wù)開始運(yùn)行時(shí)被調(diào)用。多次調(diào)用startService()方法盡管不會(huì)多次創(chuàng)建服務(wù)十办,但onStart() 方法會(huì)被多次調(diào)用秀撇。
與采用Context.bindService()方法啟動(dòng)服務(wù)有關(guān)的生命周期方法
onBind()只有采用Context.bindService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在調(diào)用者與服務(wù)綁定時(shí)被調(diào)用向族,當(dāng)調(diào)用者與服務(wù)已經(jīng)綁定呵燕,多次調(diào)用Context.bindService()方法并不會(huì)導(dǎo)致該方法被多次調(diào)用。
onUnbind()只有采用Context.bindService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法件相。該方法在調(diào)用者與服務(wù)解除綁定時(shí)被調(diào)用
12再扭、 注冊(cè)廣播有幾種方式氧苍,這些方式有何優(yōu)缺點(diǎn)?請(qǐng)談?wù)凙ndroid引入廣播機(jī)制的用意泛范。
答:首先寫一個(gè)類要繼承BroadcastReceiver
第一種:在清單文件中聲明,添加
第二種使用代碼進(jìn)行注冊(cè)如:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomgSMSReceiver();
registerReceiver(receiver.filter);
兩種注冊(cè)類型的區(qū)別是:
1)第一種不是常駐型廣播让虐,也就是說(shuō)廣播跟隨程序的生命周期。
2)第二種是常駐型罢荡,也就是說(shuō)當(dāng)應(yīng)用程序關(guān)閉后赡突,如果有信息廣播來(lái),程序也會(huì)被系統(tǒng)調(diào)用自動(dòng)運(yùn)行区赵。
13惭缰、 請(qǐng)解釋下在單線程模型中Message、Handler笼才、Message Queue漱受、Looper之間的關(guān)系。
答:簡(jiǎn)單的說(shuō)患整,Handler獲取當(dāng)前線程中的looper對(duì)象拜效,looper用來(lái)從存放Message的MessageQueue中取出Message,再有Handler進(jìn)行Message的分發(fā)和處理.
Message Queue(消息隊(duì)列):用來(lái)存放通過(guò)Handler發(fā)布的消息各谚,通常附屬于某一個(gè)創(chuàng)建它的線程紧憾,可以通過(guò)Looper.myQueue()得到當(dāng)前線程的消息隊(duì)列
Handler:可以發(fā)布或者處理一個(gè)消息或者操作一個(gè)Runnable,通過(guò)Handler發(fā)布消息昌渤,消息將只會(huì)發(fā)送到與它關(guān)聯(lián)的消息隊(duì)列赴穗,然也只能處理該消息隊(duì)列中的消息
Looper:是Handler和消息隊(duì)列之間通訊橋梁,程序組件首先通過(guò)Handler把消息傳遞給Looper膀息,Looper把消息放入隊(duì)列般眉。Looper也把消息隊(duì)列里的消息廣播給所有的
Handler:Handler接受到消息后調(diào)用handleMessage進(jìn)行處理
Message:消息的類型,在Handler類中的handleMessage方法中得到單個(gè)的消息進(jìn)行處理
在單線程模型下潜支,為了線程通信問(wèn)題甸赃,Android設(shè)計(jì)了一個(gè)Message Queue(消息隊(duì)列), 線程間可以通過(guò)該Message Queue并結(jié)合Handler和Looper組件進(jìn)行信息交換冗酿。下面將對(duì)它們進(jìn)行分別介紹:
1. Message
Message消息埠对,理解為線程間交流的信息,處理數(shù)據(jù)后臺(tái)線程需要更新UI裁替,則發(fā)送Message內(nèi)含一些數(shù)據(jù)給UI線程项玛。
2. Handler
Handler處理者,是Message的主要處理者弱判,負(fù)責(zé)Message的發(fā)送襟沮,Message內(nèi)容的執(zhí)行處理。后臺(tái)線程就是通過(guò)傳進(jìn)來(lái)的 Handler對(duì)象引用來(lái)sendMessage(Message)。而使用Handler开伏,需要implement 該類的 handleMessage(Message)方法膀跌,它是處理這些Message的操作內(nèi)容,例如Update UI硅则。通常需要子類化Handler來(lái)實(shí)現(xiàn)handleMessage方法淹父。
3. Message Queue
Message Queue消息隊(duì)列,用來(lái)存放通過(guò)Handler發(fā)布的消息怎虫,按照先進(jìn)先出執(zhí)行暑认。
每個(gè)message queue都會(huì)有一個(gè)對(duì)應(yīng)的Handler。Handler會(huì)向message queue通過(guò)兩種方法發(fā)送消息:sendMessage或post大审。這兩種消息都會(huì)插在message queue隊(duì)尾并按先進(jìn)先出執(zhí)行蘸际。但通過(guò)這兩種方法發(fā)送的消息執(zhí)行的方式略有不同:通過(guò)sendMessage發(fā)送的是一個(gè)message對(duì)象,會(huì)被 Handler的handleMessage()函數(shù)處理;而通過(guò)post方法發(fā)送的是一個(gè)runnable對(duì)象徒扶,則會(huì)自己執(zhí)行粮彤。
4. Looper
Looper是每條線程里的Message Queue的管家。Android沒(méi)有Global的Message Queue姜骡,而Android會(huì)自動(dòng)替主線程(UI線程)建立Message Queue导坟,但在子線程里并沒(méi)有建立Message Queue。所以調(diào)用Looper.getMainLooper()得到的主線程的Looper不為NULL圈澈,但調(diào)用Looper.myLooper() 得到當(dāng)前線程的Looper就有可能為NULL惫周。對(duì)于子線程使用Looper,API Doc提供了正確的使用方法:這個(gè)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è)置了那個(gè)Message對(duì)象的target屬性是當(dāng)前的Handler對(duì)象登舞。隨后Looper取出了那個(gè)Message,則調(diào)用 該Message的target指向的Hander的dispatchMessage函數(shù)對(duì)Message進(jìn)行處理悬荣。在dispatchMessage方法里菠秒,如何處理Message則由用戶指定,三個(gè)判斷氯迂,優(yōu)先級(jí)從高到低:
1) Message里面的Callback践叠,一個(gè)實(shí)現(xiàn)了Runnable接口的對(duì)象,其中run函數(shù)做處理工作囚戚;
2) Handler里面的mCallback指向的一個(gè)實(shí)現(xiàn)了Callback接口的對(duì)象酵熙,由其handleMessage進(jìn)行處理轧简;
3) 處理消息Handler對(duì)象對(duì)應(yīng)的類繼承并實(shí)現(xiàn)了其中handleMessage函數(shù)驰坊,通過(guò)這個(gè)實(shí)現(xiàn)的handleMessage函數(shù)處理消息。
由此可見哮独,我們實(shí)現(xiàn)的handleMessage方法是優(yōu)先級(jí)最低的拳芙!
3. Handler處理完該Message (update UI) 后察藐,Looper則設(shè)置該Message為NULL,以便回收舟扎!
在網(wǎng)上有很多文章講述主線程和其他子線程如何交互分飞,傳送信息,最終誰(shuí)來(lái)執(zhí)行處理信息之類的睹限,個(gè)人理解是最簡(jiǎn)單的方法——判斷Handler對(duì)象里面的Looper對(duì)象是屬于哪條線程的譬猫,則由該線程來(lái)執(zhí)行!
1. 當(dāng)Handler對(duì)象的構(gòu)造函數(shù)的參數(shù)為空羡疗,則為當(dāng)前所在線程的Looper染服;
2. Looper.getMainLooper()得到的是主線程的Looper對(duì)象,Looper.myLooper()得到的是當(dāng)前線程的Looper對(duì)象叨恨。
14柳刮、 簡(jiǎn)要解釋一下activity、 intent 痒钝、intent filter秉颗、service、Broadcase送矩、BroadcaseReceiver
答:一個(gè)activity呈現(xiàn)了一個(gè)用戶可以操作的可視化用戶界面蚕甥;一個(gè)service不包含可見的用戶界面,而是在后臺(tái)運(yùn)行益愈,可以與一個(gè)activity綁定梢灭,通過(guò)綁定暴露出來(lái)接口并與其進(jìn)行通信;一個(gè)broadcast receiver是一個(gè)接收廣播消息并做出回應(yīng)的component蒸其,broadcast receiver沒(méi)有界面敏释;一個(gè)intent是一個(gè)Intent對(duì)象,它保存了消息的內(nèi)容摸袁。對(duì)于activity和service來(lái)說(shuō)钥顽,它指定了請(qǐng)求的操作名稱和待操作數(shù)據(jù)的URI,Intent對(duì)象可以顯式的指定一個(gè)目標(biāo)component靠汁。如果這樣的話蜂大,android會(huì)找到這個(gè)component(基于manifest文件中的聲明)并激活它技竟。但如果一個(gè)目標(biāo)不是顯式指定的魄梯,android必須找到響應(yīng)intent的最佳component。它是通過(guò)將Intent對(duì)象和目標(biāo)的intent filter相比較來(lái)完成這一工作的捎迫;一個(gè)component的intent filter告訴android該component能處理的intent踢星。intent filter也是在manifest文件中聲明的澳叉。
15、 說(shuō)說(shuō)mvc模式的原理,它在android中的運(yùn)用,android的官方建議應(yīng)用程序的開發(fā)采用mvc模式成洗。何謂mvc五督?
mvc是model,view,controller的縮寫,mvc包含三個(gè)部分:
模型(model)對(duì)象:是應(yīng)用程序的主體部分瓶殃,所有的業(yè)務(wù)邏輯都應(yīng)該寫在該層充包。
視圖(view)對(duì)象:是應(yīng)用程序中負(fù)責(zé)生成用戶界面的部分。也是在整個(gè)mvc架構(gòu)中用戶唯一可以看到的一層遥椿,接收用戶的輸入基矮,顯示處理結(jié)果。
控制器(control)對(duì)象:是根據(jù)用戶的輸入冠场,控制用戶界面數(shù)據(jù)顯示及更新model對(duì)象狀態(tài)的部分愈捅,控制器更重要的一種導(dǎo)航功能,響應(yīng)用戶出發(fā)的相關(guān)事件慈鸠,交給m層處理蓝谨。
android鼓勵(lì)弱耦合和組件的重用,在android中mvc的具體體現(xiàn)如下:
1)視圖層(view):一般采用xml文件進(jìn)行界面的描述青团,使用的時(shí)候可以非常方便的引入譬巫,當(dāng)然,如果你對(duì)android了解的比較的多了話督笆,就一定可以想到在android中也可以使用JavaScript+html等的方式作為view層芦昔,當(dāng)然這里需要進(jìn)行java和javascript之間的通信,幸運(yùn)的是娃肿,android提供了它們之間非常方便的通信實(shí)現(xiàn)咕缎。
2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼料扰,要通過(guò)activity交割model業(yè)務(wù)邏輯層處理凭豪,這樣做的另外一個(gè)原因是android中的acitivity的響應(yīng)時(shí)間是5s,如果耗時(shí)的操作放在這里晒杈,程序就很容易被回收掉嫂伞。
3)模型層(model):對(duì)數(shù)據(jù)庫(kù)的操作、對(duì)網(wǎng)絡(luò)等的操作都應(yīng)該在model里面處理拯钻,當(dāng)然對(duì)業(yè)務(wù)計(jì)算等操作也是必須放在的該層的帖努。
16、 什么是ANR 如何避免它粪般?
答:ANR:Application Not Responding拼余。在Android中,活動(dòng)管理器和窗口管理器這兩個(gè)系統(tǒng)服務(wù)負(fù)責(zé)監(jiān)視應(yīng)用程序的響應(yīng)亩歹,當(dāng)用戶操作的在5s內(nèi)應(yīng)用程序沒(méi)能做出反應(yīng)匙监,BroadcastReceiver在10秒內(nèi)沒(méi)有執(zhí)行完畢寡润,就會(huì)出現(xiàn)應(yīng)用程序無(wú)響應(yīng)對(duì)話框,這既是ANR舅柜。
避免方法:Activity應(yīng)該在它的關(guān)鍵生命周期方法(如onCreate()和onResume())里盡可能少的去做創(chuàng)建操作。潛在的耗時(shí)操作躲惰,例如網(wǎng)絡(luò)或數(shù)據(jù)庫(kù)操作致份,或者高耗時(shí)的計(jì)算如改變位圖尺寸,應(yīng)該在子線程里(或者異步方式)來(lái)完成础拨。主線程應(yīng)該為子線程提供一個(gè)Handler氮块,以便完成時(shí)能夠提交給主線程。
17诡宗、 什么情況會(huì)導(dǎo)致Force Close 滔蝉?如何避免?能否捕獲導(dǎo)致其的異常塔沃?
答:程序出現(xiàn)異常蝠引,比如nullpointer。
避免:編寫程序時(shí)邏輯連貫蛀柴,思維縝密螃概。能捕獲異常,在logcat中能看到異常信息
18鸽疾、 描述一下android的系統(tǒng)架構(gòu)
android系統(tǒng)架構(gòu)分從下往上為linux 內(nèi)核層吊洼、運(yùn)行庫(kù)、應(yīng)用程序框架層制肮、和應(yīng)用程序?qū)印?/p>
linuxkernel:負(fù)責(zé)硬件的驅(qū)動(dòng)程序冒窍、網(wǎng)絡(luò)、電源豺鼻、系統(tǒng)安全以及內(nèi)存管理等功能综液。
libraries和 android runtime:libraries:即c/c++函數(shù)庫(kù)部分,大多數(shù)都是開放源代碼的函數(shù)庫(kù)儒飒,例如webkit(引擎)意乓,該函數(shù)庫(kù)負(fù)責(zé) android網(wǎng)頁(yè)瀏覽器的運(yùn)行,例如標(biāo)準(zhǔn)的c函數(shù)庫(kù)libc约素、openssl届良、sqlite等,當(dāng)然也包括支持游戲開發(fā)2dsgl和 3dopengles圣猎,在多媒體方面有mediaframework框架來(lái)支持各種影音和圖形文件的播放與顯示士葫,例如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疾呻、即時(shí)通信工具除嘹、瀏覽器、mp3播放器等處于該層岸蜗,java開發(fā)人員開發(fā)的程序也處于該層尉咕,而且和內(nèi)置的應(yīng)用程序具有平等的位置,可以調(diào)用內(nèi)置的應(yīng)用程序璃岳,也可以替換內(nèi)置的應(yīng)用程序年缎。
上面的四個(gè)層次,下層為上層服務(wù)铃慷,上層需要下層的支持晦款,調(diào)用下層的服務(wù),這種嚴(yán)格分層的方式帶來(lái)的極大的穩(wěn)定性枚冗、靈活性和可擴(kuò)展性缓溅,使得不同層的開發(fā)人員可以按照規(guī)范專心特定層的開發(fā)。
android應(yīng)用程序使用框架的api并在框架下運(yùn)行赁温,這就帶來(lái)了程序開發(fā)的高度一致性坛怪,另一方面也告訴我們,要想寫出優(yōu)質(zhì)高效的程序就必須對(duì)整個(gè) applicationframework進(jìn)行非常深入的理解股囊。精通applicationframework袜匿,你就可以真正的理解android的設(shè)計(jì)和運(yùn)行機(jī)制,也就更能夠駕馭整個(gè)應(yīng)用層的開發(fā)稚疹。
19居灯、 請(qǐng)介紹下ContentProvider是如何實(shí)現(xiàn)數(shù)據(jù)共享的。
一個(gè)程序可以通過(guò)實(shí)現(xiàn)一個(gè)Content provider的抽象接口將自己的數(shù)據(jù)完全暴露出去内狗,而且Content providers是以類似數(shù)據(jù)庫(kù)中表的方式將數(shù)據(jù)暴露怪嫌。Content providers存儲(chǔ)和檢索數(shù)據(jù),通過(guò)它可以讓所有的應(yīng)用程序訪問(wèn)到柳沙,這也是應(yīng)用程序之間唯一共享數(shù)據(jù)的方法岩灭。
要想使應(yīng)用程序的數(shù)據(jù)公開化,可通過(guò)2種方法:創(chuàng)建一個(gè)屬于你自己的Content provider或者將你的數(shù)據(jù)添加到一個(gè)已經(jīng)存在的Content provider中赂鲤,前提是有相同數(shù)據(jù)類型并且有寫入Content provider的權(quán)限噪径。
如何通過(guò)一套標(biāo)準(zhǔn)及統(tǒng)一的接口獲取其他應(yīng)用程序暴露的數(shù)據(jù)柱恤?
Android提供了ContentResolver,外界的程序可以通過(guò)ContentResolver接口訪問(wèn)ContentProvider提供的數(shù)據(jù)找爱。
20梗顺、 Service和Thread的區(qū)別?
答:servie是系統(tǒng)的組件车摄,它由系統(tǒng)進(jìn)程托管(servicemanager)寺谤;它們之間的通信類似于client和server,是一種輕量級(jí)的ipc通信练般,這種通信的載體是binder,它是在linux層交換信息的一種ipc锈候。而thread是由本應(yīng)用程序托管薄料。1). Thread:Thread 是程序執(zhí)行的最小單元,它是分配CPU的基本單位泵琳∩阒埃可以用 Thread 來(lái)執(zhí)行一些異步的操作。
2). Service:Service 是android的一種機(jī)制获列,當(dāng)它運(yùn)行的時(shí)候如果是Local Service谷市,那么對(duì)應(yīng)的 Service 是運(yùn)行在主進(jìn)程的 main 線程上的。如:onCreate击孩,onStart 這些函數(shù)在被系統(tǒng)調(diào)用的時(shí)候都是在主進(jìn)程的 main 線程上運(yùn)行的迫悠。如果是Remote Service,那么對(duì)應(yīng)的 Service 則是運(yùn)行在獨(dú)立進(jìn)程的 main 線程上巩梢。
既然這樣创泄,那么我們?yōu)槭裁匆?Service 呢?其實(shí)這跟 android 的系統(tǒng)機(jī)制有關(guān)括蝠,我們先拿 Thread 來(lái)說(shuō)鞠抑。Thread 的運(yùn)行是獨(dú)立于 Activity 的,也就是說(shuō)當(dāng)一個(gè) Activity 被 finish 之后忌警,如果你沒(méi)有主動(dòng)停止 Thread 或者 Thread 里的 run 方法沒(méi)有執(zhí)行完畢的話搁拙,Thread 也會(huì)一直執(zhí)行。因此這里會(huì)出現(xiàn)一個(gè)問(wèn)題:當(dāng) Activity 被 finish 之后法绵,你不再持有該 Thread 的引用箕速。另一方面,你沒(méi)有辦法在不同的 Activity 中對(duì)同一 Thread 進(jìn)行控制朋譬。
舉個(gè)例子:如果你的 Thread 需要不停地隔一段時(shí)間就要連接服務(wù)器做某種同步的話弧满,該 Thread 需要在 Activity 沒(méi)有start的時(shí)候也在運(yùn)行。這個(gè)時(shí)候當(dāng)你 start 一個(gè) Activity 就沒(méi)有辦法在該 Activity 里面控制之前創(chuàng)建的 Thread此熬。因此你便需要?jiǎng)?chuàng)建并啟動(dòng)一個(gè) Service 庭呜,在 Service 里面創(chuàng)建滑进、運(yùn)行并控制該 Thread,這樣便解決了該問(wèn)題(因?yàn)槿魏?Activity 都可以控制同一 Service募谎,而系統(tǒng)也只會(huì)創(chuàng)建一個(gè)對(duì)應(yīng) Service 的實(shí)例)扶关。
因此你可以把 Service 想象成一種消息服務(wù),而你可以在任何有 Context 的地方調(diào)用 Context.startService数冬、Context.stopService节槐、Context.bindService,Context.unbindService拐纱,來(lái)控制它铜异,你也可以在 Service 里注冊(cè) BroadcastReceiver,在其他地方通過(guò)發(fā)送 broadcast 來(lái)控制它秸架,當(dāng)然這些都是 Thread 做不到的揍庄。
21、 Android本身的api并未聲明會(huì)拋出異常东抹,則其在運(yùn)行時(shí)有無(wú)可能拋出runtime異常蚂子,你遇到過(guò)嗎?諾有的話會(huì)導(dǎo)致什么問(wèn)題缭黔?如何解決食茎?
答:會(huì),比如nullpointerException馏谨。我遇到過(guò)别渔,比如textview.setText()時(shí),textview沒(méi)有初始化惧互。會(huì)導(dǎo)致程序無(wú)法正常運(yùn)行出現(xiàn)forceclose钠糊。打開控制臺(tái)查看logcat信息找出異常信息并修改程序。
22壹哺、 IntentService有何優(yōu)點(diǎn)?
答:Acitivity的進(jìn)程抄伍,當(dāng)處理Intent的時(shí)候,會(huì)產(chǎn)生一個(gè)對(duì)應(yīng)的Service管宵; Android的進(jìn)程處理器現(xiàn)在會(huì)盡可能的不kill掉你截珍;非常容易使用
23、 如果后臺(tái)的Activity由于某原因被系統(tǒng)回收了箩朴,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)岗喉?
答:重寫onSaveInstanceState()方法,在此方法中保存需要保存的數(shù)據(jù)炸庞,該方法將會(huì)在activity被回收之前調(diào)用钱床。通過(guò)重寫onRestoreInstanceState()方法可以從中提取保存好的數(shù)據(jù)
24、 如何將一個(gè)Activity設(shè)置成窗口的樣式埠居。
答:中配置:android :theme="@android:style/Theme.Dialog"
另外android:theme="@android:style/Theme.Translucent" 是設(shè)置透明
25查牌、 如何退出Activity事期?如何安全退出已調(diào)用多個(gè)Activity的Application?
答:對(duì)于單一Activity的應(yīng)用來(lái)說(shuō)纸颜,退出很簡(jiǎn)單兽泣,直接finish()即可。當(dāng)然胁孙,也可以用killProcess()和System.exit()這樣的方法唠倦。
對(duì)于多個(gè)activity,1涮较、記錄打開的Activity:每打開一個(gè)Activity稠鼻,就記錄下來(lái)。在需要退出時(shí)狂票,關(guān)閉每一個(gè)Activity即可候齿。2、發(fā)送特定廣播:在需要結(jié)束應(yīng)用時(shí)苫亦,發(fā)送一個(gè)特定的廣播毛肋,每個(gè)Activity收到廣播后怨咪,關(guān)閉即可屋剑。3、遞歸退出:在打開新的Activity時(shí)使用startActivityForResult诗眨,然后自己加標(biāo)志唉匾,在onActivityResult中處理,遞歸關(guān)閉匠楚。為了編程方便巍膘,最好定義一個(gè)Activity基類,處理這些共通問(wèn)題芋簿。
在2.1之前峡懈,可以使用ActivityManager的restartPackage方法。
它可以直接結(jié)束整個(gè)應(yīng)用与斤。在使用時(shí)需要權(quán)限android.permission.RESTART_PACKAGES肪康。
注意不要被它的名字迷惑。
可是撩穿,在2.2磷支,這個(gè)方法失效了。在2.2添加了一個(gè)新的方法食寡,killBackground Processes()雾狈,需要權(quán)限 android.permission.KILL_BACKGROUND_PROCESSES〉种澹可惜的是善榛,它和2.2的restartPackage一樣辩蛋,根本起不到應(yīng)有的效果。
另外還有一個(gè)方法锭弊,就是系統(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)程,第三方程序無(wú)法調(diào)用蚁署。
因?yàn)樾枰贏ndroid.mk中添加LOCAL_CERTIFICATE := platform便脊。
而Android.mk是用于在Android源碼下編譯程序用的。
從以上可以看出光戈,在2.2哪痰,沒(méi)有辦法直接結(jié)束一個(gè)應(yīng)用,而只能用自己的辦法間接辦到久妆。
現(xiàn)提供幾個(gè)方法晌杰,供參考:
1、拋異常強(qiáng)制退出:
該方法通過(guò)拋異常筷弦,使程序Force Close肋演。
驗(yàn)證可以,但是烂琴,需要解決的問(wèn)題是爹殊,如何使程序結(jié)束掉,而不彈出Force Close的窗口奸绷。
2梗夸、記錄打開的Activity:
每打開一個(gè)Activity,就記錄下來(lái)号醉。在需要退出時(shí)反症,關(guān)閉每一個(gè)Activity即可。
3扣癣、發(fā)送特定廣播:
在需要結(jié)束應(yīng)用時(shí)惰帽,發(fā)送一個(gè)特定的廣播,每個(gè)Activity收到廣播后父虑,關(guān)閉即可该酗。
4、遞歸退出
在打開新的Activity時(shí)使用startActivityForResult,然后自己加標(biāo)志呜魄,在onActivityResult中處理悔叽,遞歸關(guān)閉。
除了第一個(gè)爵嗅,都是想辦法把每一個(gè)Activity都結(jié)束掉娇澎,間接達(dá)到目的。但是這樣做同樣不完美睹晒。你會(huì)發(fā)現(xiàn)趟庄,如果自己的應(yīng)用程序?qū)γ恳粋€(gè)Activity都設(shè)置了nosensor,在兩個(gè)Activity結(jié)束的間隙伪很,sensor可能有效了戚啥。但至少,我們的目的達(dá)到了锉试,而且沒(méi)有影響用戶使用猫十。為了編程方便,最好定義一個(gè)Activity基類呆盖,處理這些共通問(wèn)題拖云。
26、 AIDL的全稱是什么应又?如何工作宙项?能處理哪些類型的數(shù)據(jù)?
答:全稱是:Android Interface Define Language
在Android中, 每個(gè)應(yīng)用程序都可以有自己的進(jìn)程. 在寫UI應(yīng)用的時(shí)候, 經(jīng)常要用到Service. 在不同的進(jìn)程中, 怎樣傳遞對(duì)象呢?顯然, Java中不允許跨進(jìn)程內(nèi)存共享. 因此傳遞對(duì)象, 只能把對(duì)象拆分成操作系統(tǒng)能理解的簡(jiǎn)單形式, 以達(dá)到跨界對(duì)象訪問(wèn)的目的. 在J2EE中,采用RMI的方式, 可以通過(guò)序列化傳遞對(duì)象. 在Android中, 則采用AIDL的方式. 理論上AIDL可以傳遞Bundle,實(shí)際上做起來(lái)卻比較麻煩丁频。
AIDL(AndRoid接口描述語(yǔ)言)是一種借口描述語(yǔ)言; 編譯器可以通過(guò)aidl文件生成一段代碼杉允,通過(guò)預(yù)先定義的接口達(dá)到兩個(gè)進(jìn)程內(nèi)部通信進(jìn)程的目的. 如果需要在一個(gè)Activity中, 訪問(wèn)另一個(gè)Service中的某個(gè)對(duì)象, 需要先將對(duì)象轉(zhuǎn)化成AIDL可識(shí)別的參數(shù)(可能是多個(gè)參數(shù)), 然后使用AIDL來(lái)傳遞這些參數(shù), 在消息的接收端, 使用這些參數(shù)組裝成自己需要的對(duì)象.
AIDL的IPC的機(jī)制和COM或CORBA類似, 是基于接口的邑贴,但它是輕量級(jí)的席里。它使用代理類在客戶端和實(shí)現(xiàn)層間傳遞值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相關(guān)類.; 2. 調(diào)用aidl產(chǎn)生的class.
AIDL的創(chuàng)建方法:
AIDL語(yǔ)法很簡(jiǎn)單,可以用來(lái)聲明一個(gè)帶一個(gè)或多個(gè)方法的接口,也可以傳遞參數(shù)和返回值拢驾。 由于遠(yuǎn)程調(diào)用的需要, 這些參數(shù)和返回值并不是任何類型.下面是些AIDL支持的數(shù)據(jù)類型:
1. 不需要import聲明的簡(jiǎn)單Java編程語(yǔ)言類型(int,boolean等)
2. String, CharSequence不需要特殊聲明
3. List, Map和Parcelables類型, 這些類型內(nèi)所包含的數(shù)據(jù)成員也只能是簡(jiǎn)單數(shù)據(jù)類型, String等其他比支持的類型.
(另外: 我沒(méi)嘗試Parcelables, 在Eclipse+ADT下編譯不過(guò), 或許以后會(huì)有所支持)
27奖磁、 請(qǐng)解釋下Android程序運(yùn)行時(shí)權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別。
答:運(yùn)行時(shí)權(quán)限D(zhuǎn)alvik( android授權(quán))
文件系統(tǒng) linux 內(nèi)核授權(quán)
28繁疤、 系統(tǒng)上安裝了多種瀏覽器咖为,能否指定某瀏覽器訪問(wèn)指定頁(yè)面?請(qǐng)說(shuō)明原由稠腊。
通過(guò)直接發(fā)送Uri把參數(shù)帶過(guò)去躁染,或者通過(guò)manifest里的intentfilter里的data屬性
29、 android系統(tǒng)的優(yōu)勢(shì)和不足
答:Android平臺(tái)手機(jī) 5大優(yōu)勢(shì):
一架忌、開放性
在優(yōu)勢(shì)方面吞彤,Android平臺(tái)首先就是其開發(fā)性,開發(fā)的平臺(tái)允許任何移動(dòng)終端廠商加入到Android聯(lián)盟中來(lái)。顯著的開放性可以使其擁有更多的開發(fā)者饰恕,隨著用戶和應(yīng)用的日益豐富挠羔,一個(gè)嶄新的平臺(tái)也將很快走向成熟。開放性對(duì)于Android的發(fā)展而言埋嵌,有利于積累人氣破加,這里的人氣包括消費(fèi)者和廠商,而對(duì)于消費(fèi)者來(lái)講雹嗦,隨大的受益正是豐富的軟件資源范舀。開放的平臺(tái)也會(huì)帶來(lái)更大競(jìng)爭(zhēng),如此一來(lái)了罪,消費(fèi)者將可以用更低的價(jià)位購(gòu)得心儀的手機(jī)尿背。
二、掙脫運(yùn)營(yíng)商的束縛
在過(guò)去很長(zhǎng)的一段時(shí)間捶惜,特別是在歐美地區(qū)田藐,手機(jī)應(yīng)用往往受到運(yùn)營(yíng)商制約,使用什么功能接入什么網(wǎng)絡(luò)吱七,幾乎都受到運(yùn)營(yíng)商的控制汽久。從去年iPhone 上市 ,用戶可以更加方便地連接網(wǎng)絡(luò)踊餐,運(yùn)營(yíng)商的制約減少景醇。隨著EDGE、HSDPA這些2G至3G移動(dòng)網(wǎng)絡(luò)的逐步過(guò)渡和提升吝岭,手機(jī)隨意接入網(wǎng)絡(luò)已不是運(yùn)營(yíng)商口中的笑談三痰,當(dāng)你可以通過(guò)手機(jī)IM軟件方便地進(jìn)行即時(shí)聊天時(shí),再回想不久前天價(jià)的彩信和圖鈴下載業(yè)務(wù)窜管,是不是像噩夢(mèng)一樣散劫?互聯(lián)網(wǎng)巨頭Google推動(dòng)的Android終端天生就有網(wǎng)絡(luò)特色,將讓用戶離互聯(lián)網(wǎng)更近幕帆。
三获搏、豐富的硬件選擇
這一點(diǎn)還是與Android平臺(tái)的開放性相關(guān),由于Android的開放性失乾,眾多的廠商會(huì)推出千奇百怪常熙,功能特色各具的多種產(chǎn)品。功能上的差異和特色碱茁,卻不會(huì)影響到數(shù)據(jù)同步裸卫、甚至軟件的兼容,好比你從諾基亞 Symbian風(fēng)格手機(jī) 一下改用蘋果 iPhone 纽竣,同時(shí)還可將Symbian中優(yōu)秀的軟件帶到iPhone上使用畦韭、聯(lián)系人等資料更是可以方便地轉(zhuǎn)移,是不是非常方便呢桑涎?
四萌踱、不受任何限制的開發(fā)商
Android平臺(tái)提供給第三方開發(fā)商一個(gè)十分寬泛、自由的環(huán)境,不會(huì)受到各種條條框框的阻擾,可想而知,會(huì)有多少新穎別致的軟件會(huì)誕生缰泡。但也有其兩面性,血腥代嗤、暴力棘钞、情色方面的程序和游戲如可控制正是留給Android難題之一。
五干毅、無(wú)縫結(jié)合的Google應(yīng)用
如今叱詫互聯(lián)網(wǎng)的Google已經(jīng)走過(guò)10年度歷史宜猜,從搜索巨人到全面的互聯(lián)網(wǎng)滲透,Google服務(wù)如地圖硝逢、郵件姨拥、搜索等已經(jīng)成為連接用戶和互聯(lián)網(wǎng)的重要紐帶,而Android平臺(tái)手機(jī)將無(wú)縫結(jié)合這些優(yōu)秀的Google服務(wù)渠鸽。
再說(shuō)Android的5大不足:
一叫乌、安全和隱私
由于手機(jī) 與互聯(lián)網(wǎng)的緊密聯(lián)系,個(gè)人隱私很難得到保守徽缚。除了上網(wǎng)過(guò)程中經(jīng)意或不經(jīng)意留下的個(gè)人足跡憨奸,Google這個(gè)巨人也時(shí)時(shí)站在你的身后,洞穿一切凿试,因此排宰,互聯(lián)網(wǎng)的深入將會(huì)帶來(lái)新一輪的隱私危機(jī)。
二那婉、首先開賣Android手機(jī)的不是最大運(yùn)營(yíng)商
眾所周知板甘,T-Mobile在23日,于美國(guó)紐約發(fā)布 了Android首款手機(jī)G1吧恃。但是在北美市場(chǎng)虾啦,最大的兩家運(yùn)營(yíng)商乃AT&T和Verizon麻诀,而目前所知取得Android手機(jī)銷售權(quán)的僅有 T-Mobile和Sprint痕寓,其中T-Mobile的3G網(wǎng)絡(luò)相對(duì)于其他三家也要遜色不少,因此蝇闭,用戶可以買賬購(gòu)買G1呻率,能否體驗(yàn)到最佳的3G網(wǎng)絡(luò)服務(wù)則要另當(dāng)別論了!
三呻引、運(yùn)營(yíng)商仍然能夠影響到Android手機(jī)
在國(guó)內(nèi)市場(chǎng)礼仗,不少用戶對(duì)購(gòu)得移動(dòng)定制機(jī)不滿,感覺(jué)所購(gòu)的手機(jī)被人涂畫了廣告一般。這樣的情況在國(guó)外市場(chǎng)同樣出現(xiàn)元践。Android手機(jī)的另一發(fā)售運(yùn)營(yíng)商Sprint就將在其機(jī)型中內(nèi)置其手機(jī)商店程序韭脊。
四、同類機(jī)型用戶減少
在不少手機(jī)論壇都會(huì)有針對(duì)某一型號(hào)的子論壇单旁,對(duì)一款手機(jī)的使用心得交流沪羔,并分享軟件資源。而對(duì)于Android平臺(tái)手機(jī)象浑,由于廠商豐富蔫饰,產(chǎn)品類型多樣,這樣使用同一款機(jī)型的用戶越來(lái)越少愉豺,缺少統(tǒng)一機(jī)型的程序強(qiáng)化篓吁。舉個(gè)稍顯不當(dāng)?shù)睦樱F(xiàn)在山寨機(jī)泛濫蚪拦,品種各異杖剪,就很少有專門針對(duì)某個(gè)型號(hào)山寨機(jī)的討論和群組,除了哪些功能異常搶眼驰贷、頗受追捧的機(jī)型以外摘盆。
五、過(guò)分依賴開發(fā)商缺少標(biāo)準(zhǔn)配置
在使用PC端的Windows Xp系統(tǒng)的時(shí)候饱苟,都會(huì)內(nèi)置微軟Windows Media Player這樣一個(gè)瀏覽器程序孩擂,用戶可以選擇更多樣的播放器,如Realplay或暴風(fēng)影音等箱熬。但入手開始使用默認(rèn)的程序同樣可以應(yīng)付多樣的需要类垦。在 Android平臺(tái)中,由于其開放性城须,軟件更多依賴第三方廠商蚤认,比如Android系統(tǒng)的SDK中就沒(méi)有內(nèi)置音樂(lè) 播放器,全部依賴第三方開發(fā)糕伐,缺少了產(chǎn)品的統(tǒng)一性砰琢。
30、 Android dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個(gè)概念
答:DVM指dalivk的虛擬機(jī)良瞧。每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行陪汽,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。而每一個(gè)DVM都是在Linux 中的一個(gè)進(jìn)程褥蚯,所以說(shuō)可以認(rèn)為是同一個(gè)概念挚冤。
31、 sim卡的EF文件是什么赞庶?有何作用
答:sim卡的文件系統(tǒng)有自己規(guī)范训挡,主要是為了和手機(jī)通訊澳骤,sim本 身可以有自己的操作系統(tǒng),EF就是作存儲(chǔ)并和手機(jī)通訊用的
32澜薄、 嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種为肮, 各有何特性
頁(yè)式,段式肤京,段頁(yè)弥锄,用到了MMU,虛擬空間等技術(shù)
33、 什么是嵌入式實(shí)時(shí)操作系統(tǒng), Android 操作系統(tǒng)屬于實(shí)時(shí)操作系統(tǒng)嗎?
嵌入式實(shí)時(shí)操作系統(tǒng)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時(shí)蟆沫,能夠接受并以足夠快的速度予以處理籽暇,其處理的結(jié)果又能在規(guī)定的時(shí)間之內(nèi)來(lái)控制生產(chǎn)過(guò)程或?qū)μ幚硐到y(tǒng)作出快速響應(yīng),并控制所有實(shí)時(shí)任務(wù)協(xié)調(diào)一致運(yùn)行的嵌入式操作系統(tǒng)饭庞。主要用于工業(yè)控制戒悠、 軍事設(shè)備、 航空航天等領(lǐng)域?qū)ο到y(tǒng)的響應(yīng)時(shí)間有苛刻的要求舟山,這就需要使用實(shí)時(shí)系統(tǒng)绸狐。又可分為軟實(shí)時(shí)和硬實(shí)時(shí)兩種,而android是基于linux內(nèi)核的累盗,因此屬于軟實(shí)時(shí)寒矿。
34、 一條最長(zhǎng)的短信息約占多少byte?
中文70(包括標(biāo)點(diǎn))若债,英文160符相,160個(gè)字節(jié)。
35蠢琳、 如何將SQLite數(shù)據(jù)庫(kù)(dictionary.db文件)與apk文件一起發(fā)布
解答:可以將dictionary.db文件復(fù)制到Eclipse Android工程中的res aw目錄中啊终。所有在res aw目錄中的文件不會(huì)被壓縮,這樣可以直接提取該目錄中的文件傲须±渡可以將dictionary.db文件復(fù)制到res aw目錄中
36、 如何將打開res aw目錄中的數(shù)據(jù)庫(kù)文件?
解答:在Android中不能直接打開res aw目錄中的數(shù)據(jù)庫(kù)文件泰讽,而需要在程序第一次啟動(dòng)時(shí)將該文件復(fù)制到手機(jī)內(nèi)存或SD卡的某個(gè)目錄中例衍,然后再打開該數(shù)據(jù)庫(kù)文件。
復(fù)制的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream對(duì)象已卸,然后將該InputStream對(duì)象中的數(shù)據(jù)寫入其他的目錄中相應(yīng)文件中佛玄。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來(lái)打開任意目錄中的SQLite數(shù)據(jù)庫(kù)文件。
37咬最、 DDMS和TraceView的區(qū)別?
DDMS是一個(gè)程序執(zhí)行查看器翎嫡,在里面可以看見線程和堆棧等信息,TraceView是程序性能分析器 永乌。
38惑申、 java中如何引用本地語(yǔ)言
可以用JNI(java native interface java 本地接口)接口 。
39翅雏、 談?wù)凙ndroid的IPC(進(jìn)程間通信)機(jī)制
IPC是內(nèi)部進(jìn)程通信的簡(jiǎn)稱圈驼, 是共享"命名管道"的資源。Android中的IPC機(jī)制是為了讓Activity和Service之間可以隨時(shí)的進(jìn)行交互望几,故在Android中該機(jī)制绩脆,只適用于Activity和Service之間的通信,類似于遠(yuǎn)程方法調(diào)用橄抹,類似于C/S模式的訪問(wèn)靴迫。通過(guò)定義AIDL接口文件來(lái)定義IPC接口。Servier端實(shí)現(xiàn)IPC接口楼誓,Client端調(diào)用IPC接口本地代理玉锌。
40、 NDK是什么
NDK是一些列工具的集合疟羹,NDK提供了一系列的工具主守,幫助開發(fā)者迅速的開發(fā)C/C++的動(dòng)態(tài)庫(kù),并能自動(dòng)將so和java 應(yīng)用打成apk包榄融。
NDK集成了交叉編譯器参淫,并提供了相應(yīng)的mk文件和隔離cpu、平臺(tái)等的差異愧杯,開發(fā)人員只需簡(jiǎn)單的修改mk文件就可以創(chuàng)建出so.