日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > 綜合技術(shù) > Android面試題大全

Android面試題大全

來(lái)源:程序員人生   發(fā)布時(shí)間:2015-02-13 08:54:02 閱讀次數(shù):3982次

1、 Android的4大組件是哪些,它們的作用?

答:Activity:Activity是Android程序與用戶交互的窗口,是Android構(gòu)造塊中最基本的1種,它需要為保持各界面的狀態(tài),做很多持久化的事情,妥善管理生命周期和1些跳轉(zhuǎn)邏輯

service:后臺(tái)服務(wù)于Activity,封裝有1個(gè)完全的功能邏輯實(shí)現(xiàn),接受上層指令,完成相干的食品,定義好需要接受的Intent提供同步和異步的接口

Content Provider:是Android提供的第3方利用數(shù)據(jù)的訪問(wèn)方案,可以派生Content Provider類,對(duì)外提供數(shù)據(jù),可以像數(shù)據(jù)庫(kù)1樣進(jìn)行選擇排序,屏蔽內(nèi)部數(shù)據(jù)的存儲(chǔ)細(xì)節(jié),向外提供統(tǒng)1的借口模型,大大簡(jiǎn)化上層利用,對(duì)數(shù)據(jù)的整合提供了更方便的途徑

BroadCast Receiver:接受1種或多種Intent作觸發(fā)事件,接受相干消息,做1些簡(jiǎn)單處理,轉(zhuǎn)換成1條Notification,統(tǒng)1了Android的事件廣播模型

2、 請(qǐng)介紹下Android中經(jīng)常使用的5種布局

經(jīng)常使用5種布局方式,分別是:FrameLayout(框架布局),LinearLayout (線性布局),AbsoluteLayout(絕對(duì)布局),RelativeLayout(相對(duì)布局),TableLayout(表格布局)。

1、FrameLayout:所有東西順次都放在左上角,會(huì)堆疊,這個(gè)布局比較簡(jiǎn)單,也只能放1點(diǎn)比較簡(jiǎn)單的東西。2、LinearLayout:線性布局,每個(gè)LinearLayout里面又可分為垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal" )。當(dāng)垂直布局時(shí),每行就只有1個(gè)元素,多個(gè)元素順次垂直往下;水平布局時(shí),只有1行,每個(gè)元素順次向右排列。3、AbsoluteLayout:絕對(duì)布局用X,Y坐標(biāo)來(lái)指定元素的位置,這類布局方式也比較簡(jiǎn)單,但是在屏幕旋轉(zhuǎn)時(shí),常常會(huì)出問(wèn)題,而且多個(gè)元素的時(shí)候,計(jì)算比較麻煩。4、RelativeLayout:相對(duì)布局可以理解為某1個(gè)元素為參照物,來(lái)定位的布局方式。主要屬性有:相對(duì)某1個(gè)元素android:layout_below、      android:layout_toLeftOf相對(duì)父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;5、TableLayout:表格布局,每個(gè)TableLayout里面有表格行TableRow,TableRow里面可以具體定義每個(gè)元素。每個(gè)布局都有自己合適的方式,這5個(gè)布局元素可以相互嵌套利用,做出美觀的界面。

3、 android中的動(dòng)畫(huà)有哪幾類,它們的特點(diǎn)和區(qū)分是甚么 

答:兩種,1種是Tween動(dòng)畫(huà)、還有1種是Frame動(dòng)畫(huà)。Tween動(dòng)畫(huà),這類實(shí)現(xiàn)方式可使視圖組件移動(dòng)、放大、縮小和產(chǎn)生透明度的變化;另外一種Frame動(dòng)畫(huà),傳統(tǒng)的動(dòng)畫(huà)方法,通過(guò)順序的播放排列好的圖片來(lái)實(shí)現(xiàn),類似電影。

4、 android 中有哪幾種解析xml的類?官方推薦哪一種?和它們的原理和區(qū)分。

答:XML解析主要有3種方式,SAX、DOM、PULL。常規(guī)在PC上開(kāi)發(fā)我們使用Dom相對(duì)輕松些,但1些性能敏感的數(shù)據(jù)庫(kù)或手機(jī)上還是主要采取SAX方式,SAX讀取是單向的,優(yōu)點(diǎn):不占內(nèi)存空間、解析屬性方便,但缺點(diǎn)就是對(duì)套嵌多個(gè)分支來(lái)講處理不是很方便。而DOM方式會(huì)把全部XML文件加載到內(nèi)存中去,這里Android開(kāi)發(fā)網(wǎng)提示大家該方法在查找方面可以和XPath很好的結(jié)合如果數(shù)據(jù)量不是很大推薦使用,而PULL常經(jīng)常使用在J2ME對(duì)節(jié)點(diǎn)處理比較好,類似SAX方式,一樣很節(jié)省內(nèi)存,在J2ME中我們常常使用的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()),傳入1個(gè)viewHolder對(duì)象,用于緩存要顯示的數(shù)據(jù),可以到達(dá)圖象數(shù)據(jù)異步加載的效果。

3、如果listview需要顯示的item很多,就要斟酌分頁(yè)加載。比如1共要顯示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這3種方式分別對(duì)應(yīng)的目錄是/data/data/PackageName/Shared_Pref, /data/data/Package Name/files, /data/data/PackageName/database 。

1:使用SharedPreferences存儲(chǔ)數(shù)據(jù)

首先說(shuō)明SharedPreferences存儲(chǔ)方式,它是 Android提供的用來(lái)存儲(chǔ)1些簡(jiǎn)單配置信息的1種機(jī)制,例如:登錄用戶的用戶名與密碼。其采取了Map數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)數(shù)據(jù),以鍵值的方式存儲(chǔ),可以簡(jiǎn)單的讀取與寫(xiě)入,具體實(shí)例以下:

voidReadSharedPreferences(){

StringstrName,strPassword;

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

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

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

}

voidWriteSharedPreferences(String strName,String strPassword){

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

uer.edit();

user.putString(“NAME”,strName);

user.putString(“PASSWORD”,strPassword);

user.commit();

}

數(shù)據(jù)讀取與寫(xiě)入的方法都非常簡(jiǎn)單,只是在寫(xiě)入的時(shí)候有些區(qū)分:先調(diào)用edit()使其處于編輯狀態(tài),然后才能修改數(shù)據(jù),最后使用commit()提交修改的數(shù)據(jù)。實(shí)際上SharedPreferences是采取了XML格式將數(shù)據(jù)存儲(chǔ)到裝備中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。使用SharedPreferences是有些限制的:只能在同1個(gè)包內(nèi)使用,不能在不同的包之間使用。

2:文件存儲(chǔ)數(shù)據(jù)

文件存儲(chǔ)方式是1種較經(jīng)常使用的方法,在Android中讀取/寫(xiě)入文件的方法,與Java中實(shí)現(xiàn)I/O的程序是完全1樣的,提供了openFileInput()和openFileOutput()方法來(lái)讀取裝備上的文件。具體實(shí)例以下:

String fn =“moandroid.log”;

FileInputStreamfis = openFileInput(fn);

FileOutputStreamfos = openFileOutput(fn,Context.MODE_PRIVATE);

3:網(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ō)明,請(qǐng)瀏覽Android SDK援用了Java SDK的哪些package?。

4:ContentProvider

1、ContentProvider簡(jiǎn)介

當(dāng)利用繼承ContentProvider類,并重寫(xiě)該類用于提供數(shù)據(jù)和存儲(chǔ)數(shù)據(jù)的方法,就能夠向其他利用同享其數(shù)據(jù)。雖然使用其他方法也能夠?qū)ν馔頂?shù)據(jù),但數(shù)據(jù)訪問(wèn)方式會(huì)因數(shù)據(jù)存儲(chǔ)的方式而不同,如:采取文件方式對(duì)外同享數(shù)據(jù),需要進(jìn)行文件操作讀寫(xiě)數(shù)據(jù);采取sharedpreferences同享數(shù)據(jù),需要使用sharedpreferencesAPI讀寫(xiě)數(shù)據(jù)。而使用ContentProvider同享數(shù)據(jù)的好處是統(tǒng)1了數(shù)據(jù)訪問(wèn)方式。

2、Uri類簡(jiǎn)介

Uri代表了要操作的數(shù)據(jù),Uri主要包括了兩部份信息:1.需要操作的ContentProvider ,2.對(duì)ContentProvider中的甚么數(shù)據(jù)進(jìn)行操作,1個(gè)Uri由以下幾部份組成:

1.scheme:ContentProvider(內(nèi)容提供者)的scheme已由Android所規(guī)定為:content://…

2.主機(jī)名(或Authority):用于唯1標(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ù)不1定來(lái)自數(shù)據(jù)庫(kù),也能夠是文件等他存儲(chǔ)方式,以下:

要操作xml文件中contact節(jié)點(diǎn)下的name節(jié)點(diǎn),可以構(gòu)建這樣的路徑:/contact/name

如果要把1個(gè)字符串轉(zhuǎn)換成Uri,可使用Uri類中的parse()方法,以下:

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

3、UriMatcher、ContentUrist和ContentResolver簡(jiǎn)介

由于Uri代表了要操作的數(shù)據(jù),所以我們很常常需要解析Uri,并從 Uri中獲得數(shù)據(jù)。Android系統(tǒng)提供了兩個(gè)用于操作Uri的工具類,分別為UriMatcher 和ContentUris 。掌握它們的使用,會(huì)便于我們的開(kāi)發(fā)工作。

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

 

1.首先把你需要匹配Uri路徑全部給注冊(cè)上,以下:

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

UriMatcheruriMatcher = 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()方法傳入的第3個(gè)參數(shù),假定匹配content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回的匹配碼為1。

ContentUris:用于獲得Uri路徑后面的ID部份,它有兩個(gè)比較實(shí)用的方法:

withAppendedId(uri,id)用于為路徑加上ID部份

parseId(uri)方法用于從路徑中獲得ID部份

ContentResolver:當(dā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” (默許)

“singleTop”

“singleTask”

“singleInstance”

 

它們主要有以下不同:

1. 如何決定所屬task

“standard”和”singleTop”的activity的目標(biāo)task,和收到的Intent的發(fā)送者在同1個(gè)task內(nèi),除非intent包括參數(shù)FLAG_ACTIVITY_NEW_TASK。

如果提供了FLAG_ACTIVITY_NEW_TASK參數(shù),會(huì)啟動(dòng)到別的task里。

“singleTask”和”singleInstance”總是把a(bǔ)ctivity作為1個(gè)task的根元素,他們不會(huì)被啟動(dòng)到1個(gè)其他task里。

2. 是不是允許多個(gè)實(shí)例

“standard”和”singleTop”可以被實(shí)例化屢次,并且存在于不同的task中,且1個(gè)task可以包括1個(gè)activity的多個(gè)實(shí)例;

“singleTask”和”singleInstance”則限制只生成1個(gè)實(shí)例,并且是task的根元素。 singleTop要求如果創(chuàng)建intent的時(shí)候棧頂已有要?jiǎng)?chuàng)建 的Activity的實(shí)例,則將intent發(fā)送給該實(shí)例,而不發(fā)送給新的實(shí)例。

3. 是不是允許其它activity存在于本task內(nèi)

“singleInstance”獨(dú)占1個(gè)task,其它activity不能存在那個(gè)task里;如果它啟動(dòng)了1個(gè)新的activity,不管新的activity的launch mode 如何,新的activity都將會(huì)到別的task里運(yùn)行(猶如加了FLAG_ACTIVITY_NEW_TASK參數(shù))。

而另外3種模式,則可以和其它activity共存。

4. 是不是每次都生成新實(shí)例

“standard”對(duì)沒(méi)1個(gè)啟動(dòng)Intent都會(huì)生成1個(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ā)1個(gè)啟動(dòng)intent,如果D是 “standard”的,則生成D的1個(gè)新實(shí)例,棧變成A-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)變成A-B-C-D-B。

“singleInstance”是其所在棧的唯1activity,它會(huì)每次都被重用。

“singleTask”如果在棧頂,則接受intent,否則,該intent會(huì)被拋棄,但是該task仍會(huì)回到前臺(tái)。

當(dāng)已存在的activity實(shí)例處理新的intent時(shí)候,會(huì)調(diào)用onNewIntent()方法 如果收到intent生成1個(gè)activity實(shí)例,那末用戶可以通過(guò)back鍵回到上1個(gè)狀態(tài);如果是已存在的1個(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中1個(gè)新Task的開(kāi)始。1個(gè)Task(從啟動(dòng)它的Activity到下1個(gè)Task中的 Activity)定義了用戶可以遷移的Activity原子組。Task可以移動(dòng)到前臺(tái)和后臺(tái);在某個(gè)特定Task中的所有Activity總是保持相同的次序。

 這個(gè)標(biāo)志1般用于顯現(xiàn)“啟動(dòng)”類型的行動(dòng):它們提供用戶1系列可以單獨(dú)完成的事情,與啟動(dòng)它們的Activity完全無(wú)關(guān)。

 使用這個(gè)標(biāo)志,如果正在啟動(dòng)的Activity的Task已在運(yùn)行的話,那末,新的Activity將不會(huì)啟動(dòng);代替的,當(dāng)前Task會(huì)簡(jiǎn)單的移入前臺(tái)。參考FLAG_ACTIVITY_MULTIPLE_TASK標(biāo)志,可以禁用這1行動(dòng)。

 這個(gè)標(biāo)志不能用于調(diào)用方對(duì)已啟動(dòng)的Activity要求結(jié)果。

FLAG_ACTIVITY_CLEAR_TOP
  如果設(shè)置,并且這個(gè)Activity已在當(dāng)前的Task中運(yùn)行,因此,不再是重新啟動(dòng)1個(gè)這個(gè)Activity的實(shí)例,而是在這個(gè)Activity上方的所有Activity都將關(guān)閉,然后這個(gè)Intent會(huì)作為1個(gè)新的Intent投遞到老的Activity(現(xiàn)在位于頂端)中。
  例如,假定1個(gè)Task中包括這些Activity:A,B,C,D。如果D調(diào)用了startActivity(),并且包括1個(gè)指向Activity B的Intent,那末,C和D都將結(jié)束,然后B接收到這個(gè)Intent,因此,目前stack的狀態(tài)是:A,B。
  上例中正在運(yùn)行的Activity B既可以在onNewIntent()中接收到這個(gè)新的Intent,也能夠把自己關(guān)閉然后重新啟動(dòng)來(lái)接收這個(gè)Intent。如果它的啟動(dòng)模式聲明為 “multiple”(默許值),并且你沒(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)1個(gè)Task中的根Activity,它會(huì)把那個(gè)Task中任何運(yùn)行的實(shí)例帶入前臺(tái),然后清除它直到根Activity。這非常有用,例如,當(dāng)從Notification Manager處啟動(dòng)1個(gè)Activity。

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

    如果設(shè)置這個(gè)標(biāo)志,這個(gè)activity不論是從1個(gè)新的棧啟動(dòng)還是從已有棧推到棧頂,它都將以the front door of the task的方式啟動(dòng)。這就講致使任何與利用相干的棧都講重置到正常狀態(tài)(不論是正在講activity移入還是移除),如果需要,或直接重置該棧為初始狀態(tài)。

FLAG_ACTIVITY_SINGLE_TOP
  如果設(shè)置,當(dāng)這個(gè)Activity位于歷史stack的頂端運(yùn)行時(shí),不再啟動(dòng)1個(gè)新的

FLAG_ACTIVITY_BROUGHT_TO_FRONT
  這個(gè)標(biāo)志1般不是由程序代碼設(shè)置的,如在launchMode中設(shè)置singleTask模式時(shí)系統(tǒng)幫你設(shè)定。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
  如果設(shè)置,這將在Task的Activitystack中設(shè)置1個(gè)還原點(diǎn),當(dāng)Task恢復(fù)時(shí),需要清算Activity。也就是說(shuō),下1次Task帶著 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標(biāo)記進(jìn)入前臺(tái)時(shí)(典型的操作是用戶在主畫(huà)面重啟它),這個(gè)Activity和它之上的都將關(guān)閉,以致于用戶不能再返回到它們,但是可以回到之前的Activity。
  這在你的程序有分割點(diǎn)的時(shí)候很有用。例如,1個(gè)e-mail利用程序可能有1個(gè)操作是查看1個(gè)附件,需要啟動(dòng)圖片閱讀Activity來(lái)顯示。這個(gè) Activity應(yīng)當(dāng)作為e-mail利用程序Task的1部份,由于這是用戶在這個(gè)Task中觸發(fā)的操作。但是,當(dāng)用戶離開(kāi)這個(gè)Task,然后從主畫(huà)面選擇e-mail app,我們可能希望回到查看的會(huì)話中,但不是查看圖片附件,由于這讓人困惑。通過(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用于從1個(gè)存在的Activity啟動(dòng)1個(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)志1般不由利用程序代碼設(shè)置,如果這個(gè)Activity是從歷史記錄里啟動(dòng)的(常按HOME鍵),那末,系統(tǒng)會(huì)幫你設(shè)定。

FLAG_ACTIVITY_MULTIPLE_TASK
  不要使用這個(gè)標(biāo)志,除非你自己實(shí)現(xiàn)了利用程序啟動(dòng)器。與FLAG_ACTIVITY_NEW_TASK結(jié)合起來(lái)使用,可以禁用把已存的Task送入前臺(tái)的行動(dòng)。當(dāng)設(shè)置時(shí),新的Task總是會(huì)啟動(dòng)來(lái)處理Intent,而不管這是是不是已有1個(gè)Task可以處理相同的事情。
  由于默許的系統(tǒng)不包括圖形Task管理功能,因此,你不應(yīng)當(dāng)使用這個(gè)標(biāo)志,除非你提供給用戶1種方式可以返回到已啟動(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)入下1個(gè)Activity時(shí)利用 Acitivity遷移動(dòng)畫(huà)。這其實(shí)不意味著動(dòng)畫(huà)將永不運(yùn)行――如果另外一個(gè)Activity在啟動(dòng)顯示之前,沒(méi)有指定這個(gè)標(biāo)志,那末,動(dòng)畫(huà)將被利用。這個(gè)標(biāo)志可以很好的用于履行1連串的操作,而動(dòng)畫(huà)被看做是更高1級(jí)的事件的驅(qū)動(dòng)。

FLAG_ACTIVITY_NO_HISTORY
  如果設(shè)置,新的Activity將不再歷史stack中保存。用戶1離開(kāi)它,這個(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()。
  典型的,1個(gè)Activity可以依賴這個(gè)回調(diào)指明顯式的用戶動(dòng)作引發(fā)的Activity移出后臺(tái)。這個(gè)回調(diào)在Activity的生命周期中標(biāo)記1個(gè)適合的點(diǎn),并關(guān)閉1些Notification。
  如果1個(gè)Activity通過(guò)非用戶驅(qū)動(dòng)的事件,如來(lái)電或鬧鐘,啟動(dòng)的,這個(gè)標(biāo)志也應(yīng)當(dāng)傳遞給Context.startActivity,保證暫停的Activity不認(rèn)為用戶已知曉其Notification。

FLAG_ACTIVITY_PREVIOUS_IS_TOP
  If set and this intent is being used to launch a new activity froman existing one, the current activity will not be counted as the top activityfor deciding whether the new intent should be delivered to the top instead ofstarting a new one. The previous activity will be used as the top, with theassumption being that the current activity will finish itself immediately.

FLAG_ACTIVITY_REORDER_TO_FRONT
  如果在Intent中設(shè)置,并傳遞給Context.startActivity(),這個(gè)標(biāo)志將引發(fā)已運(yùn)行的Activity移動(dòng)到歷史stack的頂端。
  例如,假定1個(gè)Task由4個(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)描寫(xiě)下Activity的生命周期。

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

可見(jiàn)生命周期:從onStart()直到系統(tǒng)調(diào)用onStop()

前臺(tái)生命周期:從onResume()直到系統(tǒng)調(diào)用onPause()

10、    activity在屏幕旋轉(zhuǎn)時(shí)的生命周期

答:

1)  不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)履行1次,切豎屏?xí)r會(huì)履行兩次;

2)  設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)履行1次;

3)  設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)履行onConfigurationChanged方法

11、    如何啟用Service,如何停用Service。

服務(wù)的開(kāi)發(fā)比較簡(jiǎn)單,以下:

第1步:繼承Service類

public class SMSServiceextends Service {}

第2步:在AndroidManifest.xml文件中的<application>節(jié)點(diǎn)里對(duì)服務(wù)進(jìn)行配置:<serviceandroid:name=".SMSService" />

服務(wù)不能自己運(yùn)行,需要通過(guò)調(diào)用Context.startService()或Context.bindService()方法啟動(dòng)服務(wù)。這兩個(gè)方法都可以啟動(dòng)Service,但是它們的使用處合有所不同。使用startService()方法啟用服務(wù),調(diào)用者與服務(wù)之間沒(méi)有關(guān)連,即便調(diào)用者退出了,服務(wù)依然運(yùn)行。使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在了1起,調(diào)用者1旦退出,服務(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ù)已被創(chuàng)建,屢次調(diào)用startService()方法其實(shí)不會(huì)致使屢次創(chuàng)建服務(wù),但會(huì)致使屢次調(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ù)綁定在1起,調(diào)用者退出了,系統(tǒng)就會(huì)先調(diào)用服務(wù)的onUnbind()方法,接著調(diào)用onDestroy()方法。如果調(diào)用bindService()方法前服務(wù)已被綁定,屢次調(diào)用bindService()方法其實(shí)不會(huì)致使屢次創(chuàng)建服務(wù)及綁定(也就是說(shuō)onCreate()和onBind()方法其實(shí)不會(huì)被屢次調(diào)用)。如果調(diào)用者希望與正在綁定的服務(wù)消除綁定,可以調(diào)用unbindService()方法,調(diào)用該方法也會(huì)致使系統(tǒng)調(diào)用服務(wù)的onUnbind()-->onDestroy()方法。

 

服務(wù)經(jīng)常使用生命周期回調(diào)方法以下:

onCreate() 該方法在服務(wù)被創(chuàng)建時(shí)調(diào)用,該方法只會(huì)被調(diào)用1次,不管調(diào)用多少次startService()或bindService()方法,服務(wù)也只被創(chuàng)建1次。

onDestroy()該方法在服務(wù)被終止時(shí)調(diào)用。

與采取Context.startService()方法啟動(dòng)服務(wù)有關(guān)的生命周期方法

onStart() 只有采取Context.startService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在服務(wù)開(kāi)始運(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ù)已綁定,屢次調(diào)用Context.bindService()方法其實(shí)不會(huì)致使該方法被屢次調(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ī)制的意圖。

答:首先寫(xiě)1個(gè)類要繼承BroadcastReceiver

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

<receiveandroid:name=".IncomingSMSReceiver " >

<intent-filter>

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

<intent-filter>

<receiver>

第2種使用代碼進(jìn)行注冊(cè)如:

IntentFilterfilter =  newIntentFilter("android.provider.Telephony.SMS_RECEIVED");

IncomingSMSReceiverreceiver = new IncomgSMSReceiver();

registerReceiver(receiver.filter);

兩種注冊(cè)類型的區(qū)分是:

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

2)第2種是常駐型,也就是說(shuō)當(dā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ō),looper用來(lái)MessageQueue中取出Message,再有Handler進(jìn)行Message的分發(fā)和處理.

Message Queue(消息隊(duì)列):用來(lái)寄存通過(guò)Handler發(fā)布的消息,通常附屬于某1個(gè)創(chuàng)建它的線程,可以通過(guò)Looper.myQueue()得到當(dāng)前線程的消息隊(duì)列

Handler:可以發(fā)布或處理1個(gè)消息或操作1個(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ì)了1個(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)含1些數(shù)據(jù)給UI線程。

2. Handler

    Handler處理者,是Message的主要處理者,負(fù)責(zé)Message的發(fā)送,Message內(nèi)容的履行處理。后臺(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)先出履行。

    每一個(gè)message queue都會(huì)有1個(gè)對(duì)應(yīng)的Handler。Handler會(huì)向messagequeue通過(guò)兩種方法發(fā)送消息:sendMessage或post。這兩種消息都會(huì)插在message queue隊(duì)尾并按先進(jìn)先出履行。但通過(guò)這兩種方法發(fā)送的消息履行的方式略有不同:通過(guò)sendMessage發(fā)送的是1個(gè)message對(duì)象,會(huì)被 Handler的handleMessage()函數(shù)處理;而通過(guò)post方法發(fā)送的是1個(gè)runnable對(duì)象,則會(huì)自己履行。

4. Looper

    Looper是每條線程里的Message Queue的管家。Android沒(méi)有Global的MessageQueue,而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)行開(kāi)始后,循環(huán)地依照接收順序取出Message Queue里面的非NULL的Message。

    2. 1開(kāi)始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則由用戶指定,3個(gè)判斷,優(yōu)先級(jí)從高到低:

    1) Message里面的Callback,1個(gè)實(shí)現(xiàn)了Runnable接口的對(duì)象,其中run函數(shù)做處理工作;

    2) Handler里面的mCallback指向的1個(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 (updateUI) 后,Looper則設(shè)置該Message為NULL,以便回收!

    在網(wǎng)上有很多文章講述主線程和其他子線程如何交互,傳送信息,終究誰(shuí)來(lái)履行處理信息之類的,個(gè)人理解是最簡(jiǎn)單的方法――判斷Handler對(duì)象里面的Looper對(duì)象是屬于哪條線程的,則由該線程來(lái)履行!

    1. 當(dāng)Handler對(duì)象的構(gòu)造函數(shù)的參數(shù)為空,則為當(dāng)前所在線程的Looper;

2. Looper.getMainLooper()得到的是主線程的Looper對(duì)象,Looper.myLooper()得到的是當(dāng)前線程的Looper對(duì)象。

14、    扼要解釋1下activity、 intent 、intent filter、service、Broadcast、BroadcaseReceiver

答:1個(gè)activity顯現(xiàn)了1個(gè)用戶可以操作的可視化用戶界面;1個(gè)service不包括可見(jiàn)的用戶界面,而是在后臺(tái)運(yùn)行,可以與1個(gè)activity綁定,通過(guò)綁定暴露出來(lái)接口并與其進(jìn)行通訊;1個(gè)broadcast receiver是1個(gè)接收廣播消息并做出回應(yīng)的component,broadcast receiver沒(méi)有界面;1個(gè)intent是1個(gè)Intent對(duì)象,它保存了消息的內(nèi)容。對(duì)activity和service來(lái)講,它指定了要求的操作名稱和待操作數(shù)據(jù)的URI,Intent對(duì)象可以顯式的指定1個(gè)目標(biāo)component。如果這樣的話,android會(huì)找到這個(gè)component(基于manifest文件中的聲明)并激活它。但如果1個(gè)目標(biāo)不是顯式指定的,android必須找到響應(yīng)intent的最好component。它是通過(guò)將Intent對(duì)象和目標(biāo)的intent filter相比較來(lái)完成這1工作的;1個(gè)component的intent filter告知android該component能處理的intent。intentfilter也是在manifest文件中聲明的。

15、    說(shuō)說(shuō)mvc模式的原理,它在android中的應(yīng)用,android的官方建議利用程序的開(kāi)發(fā)采取mvc模式。何謂mvc?

mvc是model,view,controller的縮寫(xiě),mvc包括3個(gè)部份:

  模型(model)對(duì)象:是利用程序的主體部份,所有的業(yè)務(wù)邏輯都應(yīng)當(dāng)寫(xiě)在該層。

  視圖(view)對(duì)象:是利用程序中負(fù)責(zé)生成用戶界面的部份。也是在全部mvc架構(gòu)中用戶唯1可以看到的1層,接收用戶的輸入,顯示處理結(jié)果。

  控制器(control)對(duì)象:是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示及更新model對(duì)象狀態(tài)的部份,控制器更重要的1種導(dǎo)航功能,響利用戶動(dòng)身的相干事件,交給m層處理。

  android鼓勵(lì)弱耦合和組件的重用,在android中mvc的具體體現(xiàn)以下:

  1)視圖層(view):1般采取xml文件進(jìn)行界面的描寫(xiě),使用的時(shí)候可以非常方便的引入,固然,如果你對(duì)android了解的比較的多了話,就1定可以想到在android中也能夠使用javascript+html等的方式作為view層,固然這里需要進(jìn)行java和javascript之間的通訊,榮幸的是,android提供了它們之間非常方便的通訊實(shí)現(xiàn)。

  2)控制層(controller):android的控制層的重?fù)?dān)通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫(xiě)代碼,要通過(guò)activity交割model業(yè)務(wù)邏輯層處理,這樣做的另外1個(gè)緣由是android中的acitivity的響應(yīng)時(shí)間是5s,如果耗時(shí)的操作放在這里,程序就很容易被回收掉。

  3)模型層(model):對(duì)數(shù)據(jù)庫(kù)的操作、對(duì)網(wǎng)絡(luò)等的操作都應(yīng)當(dāng)在model里面處理,固然對(duì)業(yè)務(wù)計(jì)算等操作也是必須放在的該層的。

16、    甚么是ANR 如何避免它?

答:ANR:Application Not Responding。在Android中,活動(dòng)管理器和窗口管理器這兩個(gè)系統(tǒng)服務(wù)負(fù)責(zé)監(jiān)視利用程序的響應(yīng),當(dāng)用戶操作的在5s內(nèi)利用程序沒(méi)能做出反應(yīng),BroadcastReceiver在10秒內(nèi)沒(méi)有履行終了,就會(huì)出現(xiàn)利用程序無(wú)響應(yīng)對(duì)話框,這既是ANR。

避免方法:Activity應(yīng)當(dāng)在它的關(guān)鍵生命周期方法(如onCreate()和onResume())里盡量少的去做創(chuàng)建操作。潛伏的耗時(shí)操作,例如網(wǎng)絡(luò)或數(shù)據(jù)庫(kù)操作,或高耗時(shí)的計(jì)算如改變位圖尺寸,應(yīng)當(dāng)在子線程里(或異步方式)來(lái)完成。主線程應(yīng)當(dāng)為子線程提供1個(gè)Handler,以便完成時(shí)能夠提交給主線程。

17、    甚么情況會(huì)致使Force Close ?如何避免?能否捕獲致使其的異常?

答:程序出現(xiàn)異常,比如nullpointer。

避免:編寫(xiě)程序時(shí)邏輯聯(lián)貫,思惟周密。能捕獲異常,在logcat中能看到異常信息

18、    描寫(xiě)1下android的系統(tǒng)架構(gòu)

android系統(tǒng)架構(gòu)分從下往上為linux 內(nèi)核層、運(yùn)行庫(kù)、利用程序框架層、和利用程序?qū)印?/p>

linuxkernel:負(fù)責(zé)硬件的驅(qū)動(dòng)程序、網(wǎng)絡(luò)、電源、系統(tǒng)安全和內(nèi)存管理等功能。

libraries和 android runtime:libraries:即c/c++函數(shù)庫(kù)部份,大多數(shù)都是開(kāi)放源代碼的函數(shù)庫(kù),例如webkit(引擎),該函數(shù)庫(kù)負(fù)責(zé) android網(wǎng)頁(yè)閱讀器的運(yùn)行,例如標(biāo)準(zhǔn)的c函數(shù)庫(kù)libc、openssl、sqlite等,固然也包括支持游戲開(kāi)發(fā)2dsgl和 3dopengles,在多媒體方面有mediaframework框架來(lái)支持各種影音和圖形文件的播放與顯示,例如mpeg4、h.264、mp3、 aac、amr、jpg和png等眾多的多媒體文件格式。android的runtime負(fù)責(zé)解釋和履行生成的dalvik格式的字節(jié)碼。

  applicationframework(利用軟件架構(gòu)),java利用程序開(kāi)發(fā)人員主要是使用該層封裝好的api進(jìn)行快速開(kāi)發(fā)。

  applications:該層是java的利用程序?qū)樱琣ndroid內(nèi)置的googlemaps、e-mail、即時(shí)通訊工具、閱讀器、mp3播放器等處于該層,java開(kāi)發(fā)人員開(kāi)發(fā)的程序也處于該層,而且和內(nèi)置的利用程序具有同等的位置,可以調(diào)用內(nèi)置的利用程序,也能夠替換內(nèi)置的利用程序。

  上面的4個(gè)層次,下層為上層服務(wù),上層需要下層的支持,調(diào)用下層的服務(wù),這類嚴(yán)格分層的方式帶來(lái)的極大的穩(wěn)定性、靈活性和可擴(kuò)大性,使得不同層的開(kāi)發(fā)人員可以依照規(guī)范專心特定層的開(kāi)發(fā)。

android利用程序使用框架的api并在框架下運(yùn)行,這就帶來(lái)了程序開(kāi)發(fā)的高度1致性,另外一方面也告知我們,要想寫(xiě)出優(yōu)良高效的程序就必須對(duì)全部 applicationframework進(jìn)行非常深入的理解。精通applicationframework,你就能夠真實(shí)的理解android的設(shè)計(jì)和運(yùn)行機(jī)制,也就更能夠駕馭全部利用層的開(kāi)發(fā)。

19、    請(qǐng)介紹下ContentProvider是如何實(shí)現(xiàn)數(shù)據(jù)同享的。

1個(gè)程序可以通過(guò)實(shí)現(xiàn)1個(gè)Content provider的抽象接口將自己的數(shù)據(jù)完全暴露出去,而且Contentproviders是以類似數(shù)據(jù)庫(kù)中表的方式將數(shù)據(jù)暴露。Content providers存儲(chǔ)和檢索數(shù)據(jù),通過(guò)它可讓所有的利用程序訪問(wèn)到,這也是利用程序之間唯1同享數(shù)據(jù)的方法。

要想使利用程序的數(shù)據(jù)公然化,可通過(guò)2種方法:創(chuàng)建1個(gè)屬于你自己的Content provider或?qū)⒛愕臄?shù)據(jù)添加到1個(gè)已存在的Content provider中,條件是有相同數(shù)據(jù)類型并且有寫(xiě)入Contentprovider的權(quán)限。

如何通過(guò)1套標(biāo)準(zhǔn)及統(tǒng)1的接口獲得其他利用程序暴露的數(shù)據(jù)?

    Android提供了ContentResolver,外界的程序可以通過(guò)ContentResolver接口訪問(wèn)ContentProvider提供的數(shù)據(jù)。

20、    Service和Thread的區(qū)分?

答:servie是系統(tǒng)的組件,它由系統(tǒng)進(jìn)程托管(servicemanager);它們之間的通訊類似于clientserver,是1種輕量級(jí)的ipc通訊,這類通訊的載體是binder,它是在linux層交換信息的1種ipc。而thread是由本利用程序托管。

1). ThreadThread是程序履行的最小單元,它是分配CPU的基本單位。可以用Thread 來(lái)履行1些異步的操作。

2). ServiceServiceandroid的1種機(jī)制,當(dāng)它運(yùn)行的時(shí)候如果是LocalService,那末對(duì)應(yīng)的Service 是運(yùn)行在主進(jìn)程的main 線程上的。如:onCreateonStart這些函數(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)楹我?span style="font-family:Times New Roman">Service 呢?其實(shí)這跟android 的系統(tǒng)機(jī)制有關(guān),我們先拿Thread 來(lái)講。Thread的運(yùn)行是獨(dú)立于 Activity 的,也就是說(shuō)當(dāng)1個(gè)Activity finish 以后,如果你沒(méi)有主動(dòng)停止Thread Thread 里的 run方法沒(méi)有履行終了的話,Thread 也會(huì)1直履行。因此這里會(huì)出現(xiàn)1個(gè)問(wèn)題:當(dāng)Activity finish 以后,你不再持有該Thread 的援用。另外一方面,你沒(méi)有辦法在不同的Activity 中對(duì)同1Thread 進(jìn)行控制。  

舉個(gè)例子:如果你的Thread 需要不停地隔1段時(shí)間就要連接服務(wù)器做某種同步的話,該Thread 需要在Activity 沒(méi)有start的時(shí)候也在運(yùn)行。這個(gè)時(shí)候當(dāng)你start 1個(gè)Activity 就沒(méi)有辦法在該Activity 里面控制之前創(chuàng)建的Thread。因此你便需要?jiǎng)?chuàng)建并啟動(dòng)1個(gè)Service ,在Service 里面創(chuàng)建、運(yùn)行并控制該Thread,這樣便解決了該問(wèn)題(由于任何Activity 都可以控制同1Service,而系統(tǒng)也只會(huì)創(chuàng)建1個(gè)對(duì)應(yīng)Service 的實(shí)例)。  

因此你可以把Service 想象成1種消息服務(wù),而你可以在任何有Context 的地方調(diào)用Context.startServiceContext.stopServiceContext.bindServiceContext.unbindService,來(lái)控制它,你也能夠在Service 里注冊(cè)BroadcastReceiver,在其他地方通過(guò)發(fā)送broadcast 來(lái)控制它,固然這些都是Thread 做不到的。

21、    Android本身的api并未聲明會(huì)拋出異常,則其在運(yùn)行時(shí)有沒(méi)有可能拋出runtime異常,你遇到過(guò)嗎?諾有的話會(huì)致使甚么問(wèn)題?如何解決?

答:會(huì),比如nullpointerException。我遇到過(guò),比如textview.setText()時(shí),textview沒(méi)有初始化。會(huì)致使程序沒(méi)法正常運(yùn)行出現(xiàn)forceclose。打開(kāi)控制臺(tái)查看logcat信息找出異常信息并修改程序。

22、    IntentService有何優(yōu)點(diǎn)?

答:Acitivity的進(jìn)程,當(dāng)處理Intent的時(shí)候,會(huì)產(chǎn)生1個(gè)對(duì)應(yīng)的Service; Android的進(jìn)程處理器現(xiàn)在會(huì)盡量的不kill掉你;非常容易使用

23、    如果后臺(tái)的Activity由于某緣由被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?

答:重寫(xiě)onSaveInstanceState()方法,在此方法中保存需要保存的數(shù)據(jù),該方法將會(huì)在activity被回收之前調(diào)用。通太重寫(xiě)onRestoreInstanceState()方法可以從中提取保存好的數(shù)據(jù)

24、    如何將1個(gè)Activity設(shè)置成窗口的樣式。

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

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

25、    如何退出Activity?如何安全退出已調(diào)用多個(gè)Activity的Application?

答:對(duì)單1Activity的利用來(lái)講,退出很簡(jiǎn)單,直接finish()便可。固然,也能夠用killProcess()和System.exit()這樣的方法。

對(duì)多個(gè)activity,1、記錄打開(kāi)的Activity:每打開(kāi)1個(gè)Activity,就記錄下來(lái)。在需要退出時(shí),關(guān)閉每個(gè)Activity便可。2、發(fā)送特定廣播:在需要結(jié)束利用時(shí),發(fā)送1個(gè)特定的廣播,每一個(gè)Activity收到廣播后,關(guān)閉便可。3、遞歸退出:在打開(kāi)新的Activity時(shí)使用startActivityForResult,然后自己加標(biāo)志,在onActivityResult中處理,遞歸關(guān)閉。為了編程方便,最好定義1個(gè)Activity基類,處理這些共通問(wèn)題。

 

在2.1之前,可使用ActivityManager的restartPackage方法。

它可以直接結(jié)束全部利用。在使用時(shí)需要權(quán)限android.permission.RESTART_PACKAGES。

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

可是,在2.2,這個(gè)方法失效了。在2.2添加了1個(gè)新的方法,killBackground Processes(),需要權(quán)限android.permission.KILL_BACKGROUND_PROCESSES。惋惜的是,它和2.2的restartPackage1樣,根本起不到應(yīng)有的效果。

另外還有1個(gè)方法,就是系統(tǒng)自帶的利用程序管理里,強(qiáng)迫結(jié)束程序的方法,forceStopPackage()。它需要權(quán)限android.permission.FORCE_STOP_PACKAGES。并且需要添加android:sharedUserId="android.uid.system"屬性。一樣惋惜的是,該方法是非公然的,他只能運(yùn)行在系統(tǒng)進(jìn)程,第3方程序沒(méi)法調(diào)用。

由于需要在Android.mk中添加LOCAL_CERTIFICATE := platform。

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

從以上可以看出,在2.2,沒(méi)有辦法直接結(jié)束1個(gè)利用,而只能用自己的辦法間接辦到。

現(xiàn)提供幾個(gè)方法,供參考:

1、拋異常強(qiáng)迫退出:

該方法通過(guò)拋異常,使程序Force Close。

驗(yàn)證可以,但是,需要解決的問(wèn)題是,如何使程序結(jié)束掉,而不彈出Force Close的窗口。

2、記錄打開(kāi)的Activity:

每打開(kāi)1個(gè)Activity,就記錄下來(lái)。在需要退出時(shí),關(guān)閉每個(gè)Activity便可。

3、發(fā)送特定廣播:

在需要結(jié)束利用時(shí),發(fā)送1個(gè)特定的廣播,每一個(gè)Activity收到廣播后,關(guān)閉便可。

4、遞歸退出

在打開(kāi)新的Activity時(shí)使用startActivityForResult,然后自己加標(biāo)志,在onActivityResult中處理,遞歸關(guān)閉。

除第1個(gè),都是想辦法把每個(gè)Activity都結(jié)束掉,間接到達(dá)目的。但是這樣做一樣不完善。你會(huì)發(fā)現(xiàn),如果自己的利用程序?qū)γ總€(gè)Activity都設(shè)置了nosensor,在兩個(gè)Activity結(jié)束的間隙,sensor可能有效了。但最少,我們的目的到達(dá)了,而且沒(méi)有影響用戶使用。為了編程方便,最好定義1個(gè)Activity基類,處理這些共通問(wèn)題。

 

26、    AIDL的全稱是甚么?如何工作?能處理哪些類型的數(shù)據(jù)?

答:全稱是:AndroidInterface Define Language

在Android中, 每一個(gè)利用程序都可以有自己的進(jìn)程. 在寫(xiě)UI利用的時(shí)候, 常常要用到Service. 在不同的進(jìn)程中, 怎樣傳遞對(duì)象呢?明顯, Java中不允許跨進(jìn)程內(nèi)存同享.因此傳遞對(duì)象, 只能把對(duì)象拆分成操作系統(tǒng)能理解的簡(jiǎn)單情勢(shì), 以到達(dá)跨界對(duì)象訪問(wèn)的目的. 在J2EE中,采取RMI的方式, 可以通過(guò)序列化傳遞對(duì)象.在Android中, 則采取AIDL的方式. 理論上AIDL可以傳遞Bundle,實(shí)際上做起來(lái)卻比較麻煩。

AIDL(AndRoid接口描寫(xiě)語(yǔ)言)是1種借口描寫(xiě)語(yǔ)言; 編譯器可以通過(guò)aidl文件生成1段代碼,通過(guò)預(yù)先定義的接口到達(dá)兩個(gè)進(jìn)程內(nèi)部通訊進(jìn)程的目的. 如果需要在1個(gè)Activity中, 訪問(wèn)另外一個(gè)Service中的某個(gè)對(duì)象, 需要先將對(duì)象轉(zhuǎn)化成AIDL可辨認(rèn)的參數(shù)(多是多個(gè)參數(shù)),然后使用AIDL來(lái)傳遞這些參數(shù), 在消息的接收端, 使用這些參數(shù)組裝成自己需要的對(duì)象.

AIDL的IPC的機(jī)制和COM或CORBA類似, 是基于接口的,但它是輕量級(jí)的。它使用代理類在客戶端和實(shí)現(xiàn)層間傳遞值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相干類.; 2.調(diào)用aidl產(chǎn)生的class.

AIDL的創(chuàng)建方法:

AIDL語(yǔ)法很簡(jiǎn)單,可以用來(lái)聲明1個(gè)帶1個(gè)或多個(gè)方法的接口,也能夠傳遞參數(shù)和返回值。 由于遠(yuǎn)程調(diào)用的需要, 這些參數(shù)和返回值其實(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ì):

1、開(kāi)放性

在優(yōu)勢(shì)方面,Android平臺(tái)首先就是其開(kāi)發(fā)性,開(kāi)發(fā)的平臺(tái)允許任何移動(dòng)終端廠商加入到Android同盟中來(lái)。顯著的開(kāi)放性可使其具有更多的開(kāi)發(fā)者,隨著用戶和利用的日趨豐富,1個(gè)嶄新的平臺(tái)也將很快走向成熟。開(kāi)放性對(duì)Android的發(fā)展而言,有益于積累人氣,這里的人氣包括消費(fèi)者和廠商,而對(duì)消費(fèi)者來(lái)說(shuō),隨大的受益正是豐富的軟件資源。開(kāi)放的平臺(tái)也會(huì)帶來(lái)更大競(jìng)爭(zhēng),如此1來(lái),消費(fèi)者將可以用更低的價(jià)位購(gòu)得心儀的手機(jī)。

2、掙脫運(yùn)營(yíng)商的束縛

在過(guò)去很長(zhǎng)的1段時(shí)間,特別是在歐美地區(qū),手機(jī)利用常常遭到運(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)1樣?互聯(lián)網(wǎng)巨頭Google推動(dòng)的Android終端天生就有網(wǎng)絡(luò)特點(diǎn),將讓用戶離互聯(lián)網(wǎng)更近。

3、豐富的硬件選擇

這1點(diǎn)還是與Android平臺(tái)的開(kāi)放性相干,由于Android的開(kāi)放性,眾多的廠商會(huì)推出千奇百怪,功能特點(diǎn)各具的多種產(chǎn)品。功能上的差異和特點(diǎn),卻不會(huì)影響到數(shù)據(jù)同步、乃至軟件的兼容,好比你從諾基亞 Symbian風(fēng)格手機(jī) 1下改用蘋(píng)果 iPhone ,同時(shí)還可將Symbian中優(yōu)秀的軟件帶到iPhone上使用、聯(lián)系人等資料更是可以方便地轉(zhuǎn)移,是否是非常方便呢?

4、不受任何限制的開(kāi)發(fā)商

Android平臺(tái)提供給第3方開(kāi)發(fā)商1個(gè)10分寬泛、自由的環(huán)境,不會(huì)遭到各種條條框框的阻擾,可想而知,會(huì)有多少新穎新穎的軟件會(huì)誕生。但也有其兩面性,血腥、暴力、情色方面的程序和游戲如可控制正是留給Android困難之1。

5、無(wú)縫結(jié)合的Google利用

如今叱詫互聯(lián)網(wǎng)的Google已走過(guò)10年度歷史,從搜索偉人到全面的互聯(lián)網(wǎng)滲透,Google服務(wù)如地圖、郵件、搜索等已成為連接用戶和互聯(lián)網(wǎng)的重要紐帶,而Android平臺(tái)手機(jī)將無(wú)縫結(jié)合這些優(yōu)秀的Google服務(wù)。

再說(shuō)Android的5大不足:

1、安全和隱私

由于手機(jī) 與互聯(lián)網(wǎng)的緊密聯(lián)系,個(gè)人隱私很難得到守舊。除上網(wǎng)進(jìn)程中經(jīng)意或不經(jīng)意留下的個(gè)人足跡,Google這個(gè)偉人也時(shí)時(shí)站在你的身后,洞穿1切,因此,互聯(lián)網(wǎng)的深入將會(huì)帶來(lái)新1輪的隱私危機(jī)。

2、首先開(kāi)賣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ì)其他3家也要遜色很多,因此,用戶可以買(mǎi)賬購(gòu)買(mǎi)G1,能否體驗(yàn)到最好的3G網(wǎng)絡(luò)服務(wù)則要另當(dāng)別論了!

3、運(yùn)營(yíng)商依然能夠影響到Android手機(jī)

在國(guó)內(nèi)市場(chǎng),很多用戶對(duì)購(gòu)得移動(dòng)定制機(jī)不滿,感覺(jué)所購(gòu)的手機(jī)被人涂畫(huà)了廣告1般。這樣的情況在國(guó)外市場(chǎng)一樣出現(xiàn)。Android手機(jī)的另外一發(fā)售運(yùn)營(yíng)商Sprint就將在其機(jī)型中內(nèi)置其手機(jī)商店程序。

4、同類機(jī)型用戶減少

在很多手機(jī)論壇都會(huì)有針對(duì)某1型號(hào)的子論壇,對(duì)1款手機(jī)的使用心得交換,并分享軟件資源。而對(duì)Android平臺(tái)手機(jī),由于廠商豐富,產(chǎn)品類型多樣,這樣使用同1款機(jī)型的用戶愈來(lái)愈少,缺少統(tǒng)1機(jī)型的程序強(qiáng)化。舉個(gè)稍顯不當(dāng)?shù)睦樱F(xiàn)在山寨機(jī)泛濫,品種各異,就很少有專門(mén)針對(duì)某個(gè)型號(hào)山寨機(jī)的討論和群組,除哪些功能異常搶眼、頗受追捧的機(jī)型之外。

5、過(guò)分依賴開(kāi)發(fā)商缺少標(biāo)準(zhǔn)配置

在使用PC真?zhèn)€Windows Xp系統(tǒng)的時(shí)候,都會(huì)內(nèi)置微軟Windows Media Player這樣1個(gè)閱讀器程序,用戶可以選擇更多樣的播放器,如Realplay或狂風(fēng)影音等。但入手開(kāi)始使用默許的程序一樣可以應(yīng)付多樣的需要。在Android平臺(tái)中,由于其開(kāi)放性,軟件更多依賴第3方廠商,比如Android系統(tǒng)的SDK中就沒(méi)有內(nèi)置音樂(lè) 播放器,全部依賴第3方開(kāi)發(fā),缺少了產(chǎn)品的統(tǒng)1性。

30、    Android dvm的進(jìn)程和Linux的進(jìn)程, 利用程序的進(jìn)程是不是為同1個(gè)概念

答:DVM指dalivk的虛擬機(jī)。每個(gè)Android利用程序都在它自己的進(jìn)程中運(yùn)行,都具有1個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。而每個(gè)DVM都是在Linux 中的1個(gè)進(jìn)程,所以說(shuō)可以認(rèn)為是同1個(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)進(jìn)程或?qū)μ幚硐到y(tǒng)作出快速響應(yīng),并控制所有實(shí)時(shí)任務(wù)調(diào)和1致運(yùn)行的嵌入式操作系統(tǒng)。主要用于工業(yè)控制、軍事裝備、 航空航天等領(lǐng)域?qū)ο到y(tǒng)的響應(yīng)時(shí)間有刻薄的要求,這就需要使用實(shí)時(shí)系統(tǒng)。又可分為軟實(shí)時(shí)和硬實(shí)時(shí)兩種,而android是基于linux內(nèi)核的,因此屬于軟實(shí)時(shí)。

34、    1條最長(zhǎng)的短信息約占多少byte?

  中文70(包括標(biāo)點(diǎn)),英文160,160個(gè)字節(jié)。  

36、    如何將SQLite數(shù)據(jù)庫(kù)(dictionary.db文件)與apk文件1起發(fā)布

解答:可以將dictionary.db文件復(fù)制到Eclipse Android工程中的res raw目錄中。所有在res raw目錄中的文件不會(huì)被緊縮,這樣可以直接提取該目錄中的文件。可以將dictionary.db文件復(fù)制到res raw目錄中

37、    如何將打開(kāi)res raw目錄中的數(shù)據(jù)庫(kù)文件?

解答:在Android中不能直接打開(kāi)res raw目錄中的數(shù)據(jù)庫(kù)文件,而需要在程序第1次啟動(dòng)時(shí)將該文件復(fù)制得手機(jī)內(nèi)存或SD卡的某個(gè)目錄中,然后再打開(kāi)該數(shù)據(jù)庫(kù)文件。

復(fù)制的基本方法是使用getResources().openRawResource方法取得res raw目錄中資源的 InputStream對(duì)象,然后將該InputStream對(duì)象中的數(shù)據(jù)寫(xiě)入其他的目錄中相應(yīng)文件中。在Android SDK中可使用SQLiteDatabase.openOrCreateDatabase方法來(lái)打開(kāi)任意目錄中的SQLite數(shù)據(jù)庫(kù)文件。

38、    DDMS和TraceView的區(qū)分?

DDMS是1個(gè)程序履行查看器,在里面可以看見(jiàn)線程和堆棧等信息,TraceView是程序性能分析器 。

39、    java中如何援用本地語(yǔ)言

可以用JNI(java native interface  java 本地接口)接口 。

40、    談?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接口本地代理。

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 欧美日韩黄色大片 | 国产一区二区三区免费视频 | 少妇精品久久久一区二区三区 | 久久精品不卡 | 亚洲精品福利视频 | 日韩av中文| 3p视频在线 | 亚洲一区二区三区四区在线 | 色爱区综合 | 国产福利免费在线观看 | 欧美一区二区在线观看视频 | 91精品国产综合久久久久久丝袜 | 免费a级毛片视频 | 亚洲专区久久 | 污污免费网站 | 亚洲福利精品 | 一个色综合视频 | 国产一区二区三区影视 | 免费视频一区 | 成人欧美一区二区三区视频网页 | 91精品一区二区三区久久久久久 | 亚洲一二三在线 | 一区二区三区欧美日韩 | 在线观看欧美一区 | 国内精品视频一区 | 国产精品久久久久久久久久免费看 | 理论片在线看片三免费 | 国产精品二三区 | 国产精品久久久久一区二区三区 | 亚洲国产精品久久久久久久久久 | 国产一级片在线 | 色婷婷综合久久久久中文一区二区 | 国产成人精品电影 | 黄色亚洲片 | 国产精品婷婷久久久久 | 国产精品成人免费视频 | 国产精品三级三级三级 | 久久久91精品国产一区二区三区 | 成人午夜精品 | 精品国产一区二区三区久久 | 黄色在线免费视频 |