Android初級:
1.了解Android系統(tǒng)架構(gòu)
應(yīng)用層: Java應(yīng)用開發(fā)工程師開發(fā)的所有應(yīng)用程序比如地圖,瀏覽器,QQ等屬于該層,手機中的短信,撥號,瀏覽器等這些應(yīng)用程序都是可以被開發(fā)人員開發(fā)的其他應(yīng)用程序所替換卒茬,這點不同于其他手機操作系統(tǒng)固化在系統(tǒng)內(nèi)部的系統(tǒng)軟件啥刻,更加靈活和個性化
應(yīng)用框架層:Java framework層源碼OS定制開發(fā)為應(yīng)用層開發(fā)人員提供API
系統(tǒng)運行庫層: C語言包括C語言標準庫,多媒體庫,OpenGL ES, SQLite, Webkit,Dalvik虛擬機等,該層是對應(yīng)用框架層提供支持的層, Java訪問硬件需通過NDK實現(xiàn)
Linux內(nèi)核層:Android是基于Linux2.6內(nèi)核,其核心系統(tǒng)服務(wù)如安全性少辣、內(nèi)存管理炉爆、進程管理、網(wǎng)路協(xié)議以及驅(qū)動模型都依賴于Linux內(nèi)核
DVM與JVM區(qū)別
http://yxwang0615.iteye.com/blog/947245
區(qū)別一:dvm執(zhí)行的是.dex格式文件jvm執(zhí)行的是.class文件android程序編譯完之后生產(chǎn).class文件,然后,dex工具會把.class文件處理成.dex文件拉盾,然后把資源文件和.dex文件等打包成.apk文件。apk就是android package的意思豁状。jvm執(zhí)行的是.class文件。
區(qū)別二:dvm是基于寄存器的虛擬機而jvm執(zhí)行是基于虛擬棧的虛擬機倒得。寄存器存取速度比椥汉欤快的多,dvm可以根據(jù)硬件實現(xiàn)最大的優(yōu)化霞掺,比較適合移動設(shè)備谊路。
區(qū)別三:.class文件存在很多的冗余信息,dex工具會去除冗余信息菩彬,并把所有的.class文件整合到.dex文件中缠劝。減少了I/O操作,提高了類的查找速度
2.掌握如何搭建Android開發(fā)環(huán)境
需準備的工具與開發(fā)包(32位/64位, Windows/Linux) :JDKeclipse ADTSDK
1)安裝JDK配置環(huán)境變量(bin)
2)安裝eclipse
3) eclipse安裝ADT插件---離線安裝
4) eclipse指定SDK目錄
5)配置SDK環(huán)境變量(toots, platform-tools)
注: Linux常用操作系統(tǒng): Red Hat, Ubuntu
3.掌握Android項目目錄結(jié)構(gòu)
1.src目錄:src(即Source Code)骗灶,src目錄用來存放應(yīng)用程序中所有的源代碼惨恭,代碼的源文件一般存放在該目錄下的相應(yīng)的包下。
2.gen目錄:gen目錄耙旦,該目錄下一般只有一個 文件脱羡,即R文件。該文件夾下面有個R.java文件免都,R.java是在建立項目時自動生成的锉罐,定義該項目所有資源的索引。
3.Android4.1目錄:該文件夾下包含android.jar文件绕娘,這是一個Java歸檔文件脓规,其中包含構(gòu)建應(yīng)用程序所需的所有的Android SDK庫(如Views、Controls)和APIs险领。
通過android.jar將自己的應(yīng)用程序綁定到Android SDK和Android Emulator侨舆,這允許你使用所有Android的庫和包升酣,且使你的應(yīng)用程序在適當(dāng)?shù)沫h(huán)境中調(diào)試。
4.assets目錄:該目錄存放應(yīng)用程序中使用的外部資源文件态罪,如聲音 視頻等噩茄,在Android程序中可以通過輸入/輸出流對該目錄中的文件進行讀寫。
5.res目錄:該目錄用來存放程序這用到的圖片复颈、界面布局文件及XML格式的描述文件绩聘。該目錄下有多個目錄。新建一個Android項目耗啦,在res目錄下一般
會有drawable,layout,valuse三個目錄凿菩。drawable用來存放圖片資源,目錄下一般會有三個目錄分別存放高中低三種不同分辨率的圖片,layout目錄用來存放應(yīng)用程序的
界面布局文件帜讲,values目錄下存放字符串資源衅谷,顏色資源,數(shù)組資源等XML文件似将。
6.AndroidManifest.xml
4. Android中asset文件夾和raw文件夾區(qū)別获黔?
答:res/raw和assets的相同點:
兩者目錄下的文件在打包后會原封不動的保存在apk包中,不會被編譯成二進制在验。
res/raw和assets的不同點:
1)res/raw中的文件會被映射到R.java文件中玷氏,訪問的時候直接使用資源ID即R.raw.filename;assets文件夾下的文件不會被映射到R.java中腋舌,訪問的時候需要AssetManager類盏触。
2)res/raw不可以有目錄結(jié)構(gòu),而assets則可以有目錄結(jié)構(gòu)块饺,也就是assets目錄下可以再建立文件夾
3)讀取文件資源舉例:
讀取res/raw下的文件資源赞辩,通過以下方式獲取輸入流來進行寫操作
InputStreamis=getResources().openRawResource(R.raw.filename);
讀取assets下的文件資源,通過以下方式獲取輸入流來進行寫操作
AssetManageram=null;
am=getAssets();
InputStreamis=am.open("filename");
5.掌握AndroidManifest.xml結(jié)構(gòu)(應(yīng)用程序入口)
AndroidManifest.xml是每個android程序中必須的文件授艰。它位于整個項目的根目錄辨嗽,描述了package中暴露的組件(activities,services,等等),他們各自的實現(xiàn)類想诅,各種能被處理
的數(shù)據(jù)和啟動位置召庞。除了能聲明程序中的Activities, ContentProviders, Services,和Intent Receivers,還能指定permissions和instrumentation(安全控制和測試)
AndroidManifest.xml結(jié)構(gòu)
Android程序入口:
action節(jié)點中的android.intent.action.MAIN表明它所在的Activity是整個應(yīng)用程序的入口點
6.掌握模擬器的使用以及常用adb命令
1. adb devices
查看當(dāng)前連接設(shè)備
2. adb kill-server
終止adb進程
3. adb start-server
啟動adb進程
4. adb shell
進入shell模式(Linux模式),當(dāng)連接有多個設(shè)備時,需執(zhí)行命令
adb -s設(shè)備名shell
注:進入shell模式后序執(zhí)行Linux命令
5. adb install apk路徑
安裝apk至設(shè)備,當(dāng)連接有多個設(shè)備時,需執(zhí)行命令
adb -s設(shè)備名install apk路徑
當(dāng)設(shè)備之前裝有次apk時,替換安裝序執(zhí)行命令
adb install -r apk路徑
6. adb uninstall要卸載的應(yīng)用包名
卸載已安裝的應(yīng)用
7. adb push要拷貝的文件路徑 設(shè)備上存放次文件的路徑
將文件拷貝至設(shè)備sdcard,如adb push F:\Android授課資料\項目實訓(xùn)\1205A\apk\com.moluo.android_100111.apk /sdcard
8. adb pull設(shè)備上文件路徑電腦存放文件路徑
將文件從設(shè)備拷貝到電腦,如adb pull /sdcard/com.moluo.android_100111.apk E:/
9. adb logcat
命令行的方式查看日志
若希望將日志保存至某文件,adb logcat -> E:/test.txt
10. android list avd
查看當(dāng)前創(chuàng)建的所有模擬器列表
11. emulator @模擬器名字
啟動某個模擬器
12.命令行操作數(shù)據(jù)庫
adb shell
cd data/data
cd package
cd databases/cd shared_prefs/ cd files
sqlite3 test.db
>.tables
即可執(zhí)行響應(yīng)sql語句
7.掌握Activity的生命周期及各方法調(diào)用時機
答:共有七個周期函數(shù):
voidonCreate(BundlesavedInstanceState)第一次創(chuàng)建時調(diào)用
voidonStart()被用戶可見時調(diào)用
voidonRestart()當(dāng)Activity處于stop狀態(tài)又被重新啟動時調(diào)用
voidonResume()當(dāng)獲得焦點即可與用戶交互時調(diào)用
voidonPause()當(dāng)失去焦點時調(diào)用
voidonStop()當(dāng)不可見時調(diào)用
voidonDestroy()當(dāng)銷毀時調(diào)用
Activity A---> Activity B, B將A完全覆蓋時生命周期調(diào)用流程:
onPause(A) --> onCreate(B) --> onStart(B) --> onResume(B) --> onStop(A)
此時按"Back"按鍵,證明周期調(diào)用流程
onPause(B) --> onRestart(A) --> onStart(A) -->onResume(A) --> onStop(B) --> onDestroy(B)
作業(yè):屏幕方向發(fā)生改變時如何生命周期?
&&&&&& Android的5個進程等級?
Adroid的5個進程等級
5個進程等級分別為:Foreground Process (前臺進程)、Visible Process来破、Service Process篮灼、Background Process和Empty Process。這幾個進程等級不同徘禁,他們的安全優(yōu)先級也對應(yīng)不同诅诱,有高低之分。下面分別講解送朱。
1娘荡、Foreground Process (前臺進程)
怎么樣的一個進程才是前臺進程呢干旁? 如下情況:
a正處于Activity Resume()狀態(tài)b正處于與bound服務(wù)交互的狀態(tài)c正處于服務(wù)在前臺的狀態(tài),(startForeground()被調(diào)用)d Service生命周期函數(shù)正在被執(zhí)行(onCreate(),onStart(),onDestroy())e BroadcastReceiver正在執(zhí)行onReceive()方法
基本總結(jié)一下炮沐,也就是活動在交互争群,服務(wù)在前臺執(zhí)行,廣播在接收大年,三者其中之一滿足的這個進程换薄,都是前臺進程。從安全優(yōu)先級的角度來說翔试,殺死Foreground Process需要用戶響應(yīng)轻要,因為這個安全優(yōu)先級是最高的。
再回想一下我們Activity的四種狀態(tài)的第一種:Active/Runing狀態(tài)垦缅。在這個狀態(tài)下冲泥,Android系統(tǒng)一般不會殺死這個Activity,除非發(fā)生異常(ANR applicationnot response或者是FC force close)壁涎。是不是也是最高的優(yōu)先級呢凡恍?2、Visible ProcessActivity不在前臺顯示粹庞,但也沒有隱藏咳焚,能夠看的見,比如彈出一個對話框(input Method)一個bound到visible或者foreground的activity的Service ,或者是一個輸入法庞溜。
這種進程等級就對應(yīng)了Activity的狀態(tài):Paused。3碑定、Service Process正在運行的流码,不在上述兩種狀態(tài)的Service4、Background Process不可見狀態(tài)的Activity進程延刘,onStop()被調(diào)用
很明顯漫试,對應(yīng)Activity狀態(tài)的Stoped。5碘赖、Empty Process沒有運行任何Components的進程驾荣,保留這個進程主要是為了緩存的需要。
從以上分析來看普泡,4個活動狀態(tài)和5個進程等級具有密不可分的聯(lián)系播掷。還需融會貫通。
8. Activity四種啟動模式
在AndroidManifest.xml清單文件中的標簽中通過android:launchMode設(shè)置Activity啟動模式
standard默認值,表示在startActivity時即創(chuàng)建其實例
singleTop首先檢查棧頂是否有該Activity實例,有責(zé)返回,無責(zé)創(chuàng)建其實例
singleTask檢查整個堆棧有無該Activity實例,有責(zé)返回,無責(zé)創(chuàng)建其實例
singleInstance單實例模式,一個Activity實例獨享一個任務(wù)堆棧,并且只能有一個堆棧中有該Activity的實例
9.AndroidManifest.xml清單文件標簽中屬性android:excludeFromRecents="true"android:screenOrientation="portrait"android:configChanges="orientation|locale"的含義
答:android:excludeFromRecents表示是否可被顯示在最近打開的activity列表里,true表示否,false表示是
android:screenOrientation表示activity顯示的模式,一般用來設(shè)置activity橫屏顯示(horizontal)或豎屏顯示(portrait)
android:configChanges=[oneormoreof:"mcc""mnc""locale""touchscreen""keyboard""keyboardHidden""navigation""orientation""fontScale"]
是當(dāng)所指定屬性(ConfigurationChanges)發(fā)生改變時撼班,通知程序調(diào)用onConfigurationChanged()函數(shù),比如orientation屏幕方向發(fā)生改變,locale語言環(huán)境發(fā)生改變時
10.如何將一個Activity設(shè)置成窗口的樣式
答:在清單文件AndroidManifest.xml中相應(yīng)的標簽內(nèi)設(shè)置屬性android:theme=”@android:style/Theme.Dialog”
11. Activity的onSaveInstanceState()和onRestoreInstanceState()
答:Activity的onSaveInstanceState()和onRestoreInstanceState()并不是生命周期方法歧匈,它們不同于onCreate()、onPause()等生命周期方法砰嘁,它們并不一定會被觸發(fā)件炉。當(dāng)應(yīng)用遇到意外情況(如:內(nèi)存不足勘究、用戶直接按Home鍵)由系統(tǒng)銷毀一個Activity時,onSaveInstanceState()會被調(diào)用斟冕。但是當(dāng)用戶主動去銷毀一個Activity時口糕,例如在應(yīng)用中按返回鍵,onSaveInstanceState()就不會被調(diào)用磕蛇。因為在這種情況下景描,用戶的行為決定了不需要保存Activity的狀態(tài)。通常onSaveInstanceState()只適合用于保存一些臨時性的狀態(tài)孤里,而onPause()適合用于數(shù)據(jù)的持久化保存伏伯。
另外,當(dāng)屏幕的方向發(fā)生了改變捌袜,Activity會被摧毀并且被重新創(chuàng)建说搅,如果你想在Activity被摧毀前緩存一些數(shù)據(jù),并且在Activity被重新創(chuàng)建后恢復(fù)緩存的數(shù)據(jù)虏等∨螅可以重寫Activity的onSaveInstanceState()和onRestoreInstanceState()方法。
12.列舉Android中各種UI特效
答:兩個Activity切換時動畫設(shè)置: startActivity之后調(diào)用overridePendingTransition(int enterAnim, intexitAnim)
Fragment切換時動畫效果
圖片輪播效果:通過Gallery配合Timer定時器實現(xiàn)
瀑布流效果:
&側(cè)滑菜單:
CoverFlow:
Path菜單:
&關(guān)鍵字飛入飛出效果:
翻頁效果:
ViewPager:
Fragment:
自定義Tabhost:
發(fā)表評論圖文混排:
13.自定義組件的實現(xiàn)思路
答:Android自定義組件有三種實現(xiàn)思路:
1)繼承某個現(xiàn)有組件霍衫,在其基礎(chǔ)上添加額外功能,如繼承Gallery實現(xiàn)CoverFlow效果
2)復(fù)合型組件定義:繼承某個Layout候引,實現(xiàn)復(fù)合組件自定義,如TextView和EditText組合實現(xiàn)登錄注冊組件
3)繼承View敦跌,實現(xiàn)onDraw()方法澄干,實現(xiàn)自己繪制組件,如翻頁效果組件
14.談?wù)刄I中柠傍,Padding和Margin有什么區(qū)別,gravity與layout_gravity的區(qū)別
答:Padding用來指定組件內(nèi)的內(nèi)容距離組件邊界的距離;
Margin用來指定控件與控件之間的距離
Gravity用來指定組件內(nèi)的內(nèi)容相對于組件本身的位置
Layout_gravity用來指定組件相對于其父組件的位置
15.哪個組件可以實現(xiàn)手風(fēng)琴效果麸俘,用來實現(xiàn)設(shè)置界面的類,實現(xiàn)抽屜效果,懸浮窗口惧笛?
答:實現(xiàn)手風(fēng)琴效果(ExpandableListView)
設(shè)置界面的類(PreferenceActivity)保存到sharedpreference中
抽屜效果(slidingDrawer)組件
懸浮窗口:PopWindow,可以實現(xiàn)類似Dialog和菜單的效果
16.listview優(yōu)化策略从媚?
答:1)、自定義Adapter的getView(),對convetView進行判空患整,是當(dāng)convertView不為空的時候直接重新使用convertView
從而減少了很多不必要的View的創(chuàng)建
2)定義一個ViewHolder拜效,將convetView的tag設(shè)置為ViewHolder,不為空時重新使用即可
3)、當(dāng)ListView加載數(shù)據(jù)量較大時可以采用分頁加載和圖片異步加載
17.ListView分頁加載實現(xiàn)思路各谚?
通常實現(xiàn)分頁加載有兩種方式紧憾,一種是在ListView底部設(shè)置一個按鈕,用戶點擊即加載嘲碧。另一種是當(dāng)用戶滑動到底部時自動加載稻励。
在ListView底部設(shè)置一個按鈕,用戶點擊即加載實現(xiàn)思路:
//加上底部View,注意要放在setAdapter方法前
ListView.addFooterView(moreView);
bt.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
pg.setVisibility(View.VISIBLE);//將進度條可見
bt.setVisibility(View.GONE);//按鈕不可見
handler.postDelayed(newRunnable(){
@Override
publicvoidrun(){
loadMoreDate();//加載更多數(shù)據(jù)
bt.setVisibility(View.VISIBLE);
pg.setVisibility(View.GONE);
mSimpleAdapter.notifyDataSetChanged();//通知listView刷新數(shù)據(jù)
}
},2000);
}
});
當(dāng)用戶滑動到底部時自動加載實現(xiàn)思路:
實現(xiàn)OnScrollListener接口重寫onScrollStateChanged和onScroll方法望抽,使用onscroll方法實現(xiàn)”滑動“后處理檢查是否還有新的記錄加矛,如果有,添加記錄到adapter,adapter調(diào)用notifyDataSetChanged更新數(shù)據(jù);如果沒有記錄了,則不再加載數(shù)據(jù)煤篙。使用onScrollStateChanged可以檢測是否滾到最后一行且停止?jié)L動然后執(zhí)行加載.
18.ListView圖片異步加載實現(xiàn)思路斟览?
1.先從內(nèi)存緩存中獲取圖片顯示(內(nèi)存緩沖)
2.獲取不到的話從SD卡里獲取(SD卡緩沖辑奈,苛茂,從SD卡獲取圖片是放在子線程里執(zhí)行的,否則快速滑屏的話會不夠流暢)
3.都獲取不到的話從網(wǎng)絡(luò)下載圖片并保存到SD卡同時加入內(nèi)存并顯示(視情況看是否要顯示)
19.view有哪幾種更新方式
答:在主線程(UI線程)可以直接調(diào)用View.invalidate() ;在子線程需要更新UI可以直接調(diào)用View.postInvalidate(),也可以通過Handler發(fā)送消息給主線程,然后在handleMessage方法中通過View.invalidate()更新UI;還可以在子線程中需要更新UI的時候調(diào)用runOnUIThread(Runnable )方法,然后在此方法中更新UI,同時可以使用AsyncTask異步任務(wù),在doInBackground執(zhí)行耗時操作,然后在onPostExcute方法中執(zhí)行刷新UI動作
20.Intent的原理鸠窗,作用妓羊,可以傳遞哪些類型的參數(shù)?
答:intent是連接Activity,Service,BroadcastReceiver,ContentProvider四大組件的信使,稍计,可以傳遞八種基本數(shù)據(jù)類型以及string,Bundle類型躁绸,以及實現(xiàn)了Serializable或者Parcelable的類型。
Intent可以劃分成顯式意圖和隱式意圖臣嚣。
顯式意圖:調(diào)用Intent.setComponent()或Intent.setClass()方法明確指定了組件名的Intent為顯式意圖净刮,顯式意圖明確指定了Intent應(yīng)該傳遞給哪個組件。
隱式意圖:沒有明確指定組件名的Intent為隱式意圖硅则。Android系統(tǒng)會根據(jù)隱式意圖中設(shè)置的動作(action)淹父、類別(category)、數(shù)據(jù)(URI和數(shù)據(jù)類型)找到最合適的組件來處理這個意圖怎虫。
21.Android的四大組件是什么暑认?它們的作用是什么?
答:Android有四大組件:Activity大审、Service穷吮、BroadcastReceiver、ContentProvider饥努。
Activity:應(yīng)用程序中,一個Activity通常就是一個單獨的屏幕八回,它上面可以顯示一些控件也可以監(jiān)聽并處理用戶的事件做出響應(yīng)酷愧。Activity之間通過Intent進行通信。
Service服務(wù):一個Service是一段長生命周期的缠诅,沒有用戶界面的程序溶浴,可以用來開發(fā)如監(jiān)控類程序。
BroadcastReceive廣播接收器:你的應(yīng)用可以使用它對外部事件進行過濾只對感興趣的外部事件(如當(dāng)電話呼入時管引,或者數(shù)據(jù)網(wǎng)絡(luò)可用時)進行接收并做出響應(yīng)士败。廣播接收器沒有用戶界面。然而,它們可以啟動一個activity或serice來響應(yīng)它們收到的信息谅将。
ContentProvider內(nèi)容提供者:主要用于多個應(yīng)用間數(shù)據(jù)共享漾狼。這些數(shù)據(jù)可以存儲在文件系統(tǒng)中或SQLite數(shù)據(jù)庫。
22.描述下Service的生命周期,Service有哪些啟動方法饥臂,有什么區(qū)別逊躁,怎樣停用Service?
http://blog.csdn.net/huanyufeng/article/details/5873407
答:Service的生命周期:onCreate,onStartCommand,onDestroy,onBind和onUnbind隅熙。
通常有兩種方式啟動一個Service,它們對Service生命周期的影響是不一樣的稽煤。
1)通過context.startService()onCreate-->onStartCommand-->onDestroy
Service會經(jīng)歷onCreate到onStartCommand,然后處于運行狀態(tài)囚戚,stopService的時候調(diào)用onDestroy方法酵熙。
如果是調(diào)用者自己直接退出而沒有調(diào)用stopService的話,Service會一直在后臺運行驰坊。
如果Service已經(jīng)啟動了匾二,當(dāng)我們再次啟動Service時,不會在執(zhí)行onCreate()方法庐橙,而是直接執(zhí)行onStartCommand()方法假勿。
2)通過context.bindService()onCreate--> onBind--->onUnbind-->onDestroy
Service會運行onCreate,然后是調(diào)用onBind态鳖,這個時候調(diào)用者和Service綁定在一起转培。調(diào)用者退出了,Srevice就會調(diào)用onUnbind->onDestroyed方法浆竭。
所謂綁定在一起就共存亡了浸须。調(diào)用者也可以通過調(diào)用unbindService方法來停止服務(wù),這時候Srevice就會調(diào)用onUnbind->onDestroyed方法邦泄。
注:onStartCommand()有四種返回值:
http://wenku.baidu.com/view/0c2b1af8910ef12d2af9e7b5.html
START_STICKY:如果service進程被kill掉删窒,保留service的狀態(tài)為開始狀態(tài),但不保留遞送的intent對象顺囊。隨后系統(tǒng)會嘗試重新創(chuàng)建service肌索,由于服務(wù)狀態(tài)為開始狀態(tài),所以創(chuàng)建服務(wù)后一定會調(diào)用onStartCommand(Intent,int,int)方法特碳。如果在此期間沒有任何啟動命令被傳遞到service诚亚,那么參數(shù)Intent將為null。
START_NOT_STICKY:“非粘性的”午乓。使用這個返回值時站宗,如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉益愈,系統(tǒng)將會把它置為started狀態(tài)梢灭,系統(tǒng)不會自動重啟該服務(wù),直到startService(Intent intent)方法再次被調(diào)用;。
START_REDELIVER_INTENT:重傳Intent敏释。使用這個返回值時库快,如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉颂暇,系統(tǒng)會自動重啟該服務(wù)缺谴,并將Intent的值傳入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本耳鸯,但不保證服務(wù)被kill后一定能重啟湿蛔。
23.AIDL的全稱是什么?有什么樣的功能?
答:AIDL全稱:Androidinterfacedefinitionlanguage(android接口定義語言),
功能:用來跨進程的訪問方法,即訪問遠程服務(wù)的方法
http://blog.csdn.net/stonecao/article/details/6425019
aidl實現(xiàn)的步驟
aidl可以傳遞的數(shù)據(jù)類型
24.如何防止Android應(yīng)用中的Service被系統(tǒng)回收?
<方案一>:通過設(shè)置setForeground()提升Service優(yōu)先級,將其設(shè)置為前臺進程
或者通過在清單文件中標簽內(nèi)通過設(shè)置android:priority="1000",提升其優(yōu)先級
<方案二>:在startCommand()方法中返回START_STICKY或START_REDELIVER_INTENT則Service銷毀之后會重啟
25.Service是否運行在主線程,Service與Activity是否運行在同一個線程?
Service與Activity與BroadcastReceiver同樣都運行在UI主線程,如果有耗時操作都會引發(fā)ANR問題
26.IntentService的用法
http://android.blog.51cto.com/268543/528166
http://blog.csdn.net/zhf198909/article/details/6906786
是Service的子類,主要用來解決在Service中處理耗時操作.
IntentService使用隊列的方式將請求的Intent加入隊列县爬,然后開啟一個worker thread(線程)來處理隊列中的Intent阳啥,對于異步的startService請求,IntentService會處理完成一個之后再處理第二個财喳,每一個請求都會在一個單獨的worker thread中處理察迟,不會阻塞應(yīng)用程序的主線程
27.注冊廣播有幾種方式,這些方式有什么特點和區(qū)別?
答:第一種:在清單文件中聲明,添加
第二種使用代碼進行注冊如:
IntentFilterfilter=newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiverreceiver=newIncomgSMSReceiver();
registerReceiver(receiver.filter);
兩種注冊類型的區(qū)別是:
1)第二種不是常駐型廣播耳高,也就是說廣播跟隨程序的生命周期扎瓶。
2)第一種是常駐型,也就是說當(dāng)應(yīng)用程序關(guān)閉后泌枪,如果有信息廣播來概荷,程序也會被系統(tǒng)調(diào)用自動運行。
28.廣播的發(fā)送方式有哪些
sendBroadcast(),sendOrderedBroadcast()和sendStickyBroadcast()三種
sendBroadcast()這個方法的廣播是能夠發(fā)送給所有廣播接收者碌燕,按照注冊的先后順序误证,如果你這個時候設(shè)置了廣播接收者的優(yōu)先級,優(yōu)先級如果恰好與注冊順序相同修壕,則不會有任何問題愈捅,如果順序不一樣,會出leaked IntentReceiver這樣的異常慈鸠,并且在前面的廣播接收者不能調(diào)用abortBroadcast()方法將其終止蓝谨,如果調(diào)用會出BroadcastReceiver trying to return result during a non-ordered broadcast的異常,當(dāng)然青团,先接收到廣播的receiver可以修改廣播數(shù)據(jù)像棘。
sendOrderedBroadcast()方法顧名思義就是priority的屬性能起作用,并且在隊列前面的receiver可以隨時終止廣播的發(fā)送壶冒。還有這個api能指定final的receiver,這個receiver是最后一個接收廣播時間的receiver截歉,并且一定會接收到廣播事件胖腾,是不能被前面的receiver攔截的。實際做實驗的情況是這樣的,假設(shè)我有3個receiver依序排列咸作,并且sendOrderedBroadcast()方法指定了一個finalReceiver锨阿,那么intent傳遞給這4個Receiver的順序為Receiver1-->finalReceiver-->Receiver2-->finalReceiver-->Receiver3-->finalReceiver。這個特性可以用來統(tǒng)計系統(tǒng)中能監(jiān)聽某種廣播的Receiver的數(shù)目记罚。
sendStickyBroadcast()字面意思是發(fā)送粘性的廣播墅诡,使用這個api需要權(quán)限android.Manifest.permission.BROADCAST_STICKY,粘性廣播的特點是Intent會一直保留到廣播事件結(jié)束,而這種廣播也沒有所謂的10秒限制桐智,10秒限制是指普通的廣播如果onReceive方法執(zhí)行時間太長末早,超過10秒的時候系統(tǒng)會將這個廣播置為可以干掉的candidate,一旦系統(tǒng)資源不夠的時候说庭,就會干掉這個廣播而讓它不執(zhí)行然磷。
注: (下面是廣播接收者的生命周期以及一些細節(jié)部分:
1.廣播接收者的生命周期是非常短暫的,在接收到廣播的時候創(chuàng)建刊驴,onReceive()方法結(jié)束之后銷毀
2.廣播接收者中不要做一些耗時的工作姿搜,否則會彈出Application No Response錯誤對話框
3.最好也不要在廣播接收者中創(chuàng)建子線程做耗時的工作,因為廣播接收者被銷毀后進程就成為了空進程捆憎,很容易被系統(tǒng)殺掉
4.耗時的較長的工作最好放在服務(wù)中完成)
29.簡述Android中的IPC機制(進程間的通信機制)IPC(Inter-ProcessCommunication舅柜,進程間通信).
由于android系統(tǒng)中應(yīng)用程序之間不能共享內(nèi)存。在android SDK中提供了4種用于跨進程通訊的方式躲惰。這4種方式正好對應(yīng)于android系統(tǒng)中4種應(yīng)用程序組件:Activity致份、Content Provider、Broadcast和Service礁扮。其中Activity可以跨進程調(diào)用其他應(yīng)用程序的Activity知举;Content Provider可以跨進程訪問其他應(yīng)用程序中的數(shù)據(jù)(以Cursor對象形式返回),當(dāng)然太伊,也可以對其他應(yīng)用程序的數(shù)據(jù)進行增雇锡、刪、改操 作僚焦;Broadcast可以向android系統(tǒng)中所有應(yīng)用程序發(fā)送廣播锰提,而需要跨進程通訊的應(yīng)用程序可以監(jiān)聽這些廣播;Service和Content Provider類似芳悲,也可以訪問其他應(yīng)用程序中的數(shù)據(jù)立肘,但不同的是,Content Provider返回的是Cursor對象名扛,而Service返回的是Java對象谅年,這種可以跨進程通訊的服務(wù)叫AIDL服務(wù)。
aidl是AndroidInterfacedefinitionlanguage的縮寫肮韧,它是一種android內(nèi)部進程通信接口的描述語言融蹂,通過它我們可以定義進程間的通信接口.編譯器可以通過擴展名為aidl的文件生成一段代碼旺订,通過預(yù)先定義的接口達到兩個進程內(nèi)部通信進程的目的.
30.什么是ANR如何避免它?(Android線程間的通信方式?)
答:ANR:ApplicationNotResponding(應(yīng)用程序無響應(yīng)).當(dāng)出現(xiàn)下列情況時超燃,Android就會顯示ANR對話框了:對輸入事件(如按鍵区拳、觸摸屏事件)的響應(yīng)超過5秒意向接受器(intentReceiver)超過10秒鐘仍未執(zhí)行完畢Android應(yīng)用程序完全運行在一個獨立的線程中(例如main)。這就意味著意乓,任何在主線程中運行的樱调,需要消耗大量時間的操作都會引發(fā)ANR。
解決方案有兩種:
1.AsyncTask異步任務(wù)中届良,doInBackground()和onPostExecute(Result)兩個方法非常重要
doInBackground()這個方法運行在后臺線程中笆凌,主要負責(zé)執(zhí)行那些很耗時的操作,如移動護理系統(tǒng)中的網(wǎng)絡(luò)連接伙窃、解析XML等操作菩颖。該方法必須重載。
onPostExecute(Result)這個方法也運行于UI線程为障,在doInBackground(Params…)方法執(zhí)行后調(diào)用晦闰,該方法用于處理后臺任務(wù)執(zhí)行后返回的結(jié)果。
2.子thread+handler
31. Handler的運行機制(運行原理)(Handler,Looper,MessageQueue,Message,Thread之間的關(guān)系)
一個Handler允許你發(fā)送和處理Message和Runable對象鳍怨,每個線程都有自己的Looper呻右,每個Looper中封裝著MessageQueue。Looper負責(zé)不斷的從自己的消息隊列里取出隊頭的任務(wù)或消息執(zhí)行鞋喇。每個handler也和線程關(guān)聯(lián)声滥,Handler負責(zé)把Message和Runable對象傳遞給MessageQueue(用到post,sendMessage等方法)侦香,而且在這些對象離開MessageQueue時落塑,Handler負責(zé)執(zhí)行他們(用到handleMessage方法)。
其中Message類就是定義了一個信息罐韩,這個信息中包含一個描述符和任意的數(shù)據(jù)對象台谊,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域绞绒。
32. AsyncTask的主要方法有哪些?如何啟動和停止AsyncTask?如何在AsyncTask中更新UI
答: AsyncTask的主要方法有doInBackGround()運行在后臺子線程,執(zhí)行耗時操作
onPostExcute()運行在UI主線程,用于執(zhí)行刷新UI的代碼
啟動通過execute()方法
停止通過cancel(boolean flag)方法取消執(zhí)行,傳入?yún)?shù)ture表示如果調(diào)用方法時異步任務(wù)正在執(zhí)行則打斷執(zhí)行并取消,如果傳false表示執(zhí)行完畢再取消
刷新UI的代碼一般卸載onPostExcute()方法中
33.Android中的五種存儲方式及其應(yīng)用場景
答:1)SharedPreferences
存儲路徑:(data/data/packagename/shares_prefs),輕量級存儲,以鍵值對的形式存儲在xml中,一般用來保存應(yīng)用中的設(shè)置屬性
2)文件存儲SD卡存儲多媒體文件,文件緩存
3)Sqlite數(shù)據(jù)庫嵌入式存儲,存儲路徑:(data/data/packagename/databases),一種嵌入式數(shù)據(jù)庫,支持sql語言,存儲大量結(jié)構(gòu)性數(shù)據(jù)
4)ContentProvider進程(應(yīng)用程序)間數(shù)據(jù)共享,數(shù)據(jù)源可以是sqlite,也可以是xml,相關(guān)類:ContentResolver(內(nèi)容解析器),ContentObserver(
數(shù)據(jù)觀察者)
5)網(wǎng)絡(luò)存儲天氣數(shù)據(jù)的xml,json格式等等,通過HttpUrlConnection,HttpClient,或者SOAP協(xié)議獲取數(shù)據(jù)
34. Android中的動畫API,及項目中的應(yīng)用
答: Android中有兩種動畫,幀動畫和補間動畫,補間動畫又有平移,旋轉(zhuǎn),縮放,漸變動畫
3.0之后又有新特性屬性動畫
項目中使用場景:項目啟動向?qū)赢? Activity切換時動畫效果(overriedPendingTransaction()),類似Tab標簽頁選中項背景的切換, Fragment切換時動畫效果設(shè)置(setTransation()),
ViewPager翻頁時動畫效果
動畫效果不可以在onCreate()方法中啟動,因為此時窗口沒有完全渲染成功,可以再onWindowFocusChanged()方法中啟動動畫
35.播放視頻有哪些實現(xiàn)方式髓介?
答:1.使用系統(tǒng)自帶的播放器來播放愤炸,指定Action為ACTION_VIEW,Data為Uri,Type為其MIME類型矾睦。
//調(diào)用系統(tǒng)自帶的播放器
Intentintent=newIntent(Intent.ACTION_VIEW);
intent.setDataAndType(uri,"video/mp4");
startActivity(intent);
2.使用VideoView組件來播放,可以結(jié)合MediaController來實現(xiàn)播控,只是不能隨意更改視頻的大小及位置晦款。
3.使用MediaPlayer和SurfaceView來實現(xiàn),這種方式很靈活,可以自定義視頻播放的大小和位置枚冗。
36.如何掃描SD卡所有的多媒體資源:圖片,視頻,音頻
1).通過文件過濾方式掃描(必須制定相應(yīng)的后綴)
2).通過系統(tǒng)提供的ContentProvider獲取
http://ZGC-20130520CLI/svn/pact_train/