今天早上10分,我接到一個電話採訪百度。固然,我說提早。個人病是多麼強烈延遲。因此我也沒怎麼準備,固然,我也看他們的真實水平的思考。在此次審查中!html
!java
!android
!c++
!面試
!!算法
。!sql
!數據庫
!緩存
!。!!markdown
!。!
!
!。!!
!
!
!
!!。!
!
!。!!!
。!
!!
!!
!!
!
!!!!!。!!
!
。!!
!
!!!
!!
上來就是百度的一個技術人員打過電話來,簡單確認了個人信息以後。就開始問問題。此刻個人心中有一萬匹草泥馬奔騰。
。。。開始問的是數據結構和算法的相關知識,我本科學過一小點,只是沒有及時複習全忘記了。。。接下來就是android的相關知識了,這部分我算是回答的中規中矩,有一個關於ANR的問題,沒有回答上來。。。後面是關於java的問題,我也沒有回答好。
java的泛型
我本身又去各大站點看了一下。如下是我總結的問題和答案的地址
1.Activity之間的跳轉
http://android.blog.51cto.com/268543/323982
http://blog.csdn.net/super1900/article/details/4098615
2.android View刷新機制
http://blog.csdn.net/dragondog/article/details/6454551
3.實現Strlen(char* str)
int strlen(const char *str)
{
if (‘\0’ == *str)
return 0;
else
return strlen(str+1) + 1;
}
4.實現strcpy(char * str)
第一種:
void strcpy( char *strDest, char *strSrc )
{
while( (strDest++ = strSrc++) != ‘\0’ );
//把後一個字符串的第一個字符賦值給前面一個字符串的第一個字符的地址上,假設碰到’\0’就退出.此
時後一個字符串也把’\0’賦值給了前一個字符串的尾部
}
5.常見數據結構的差異
http://blog.csdn.net/ceasar11/article/details/12615225
http://www.360doc.com/content/12/1009/16/9400799_240455229.shtml
6.android WiFi定位
http://www.zhihu.com/question/21365402
7.C++ 引用與指針的差異
http://blog.csdn.net/dujiangyan101/article/details/2844138
9.Android爲每一個應用程序分配的內存大小是多少?
http://www.cnblogs.com/mythou/p/3203536.html
16m也有的是24m
10.排序算法總結
http://blog.chinaunix.net/uid-25906157-id-3318529.html
11.Integer與Int的差異 java
http://developer.51cto.com/art/200906/130459.htm
12.android AIDL
http://blog.csdn.net/android_tutor/article/details/6427680
13.請說明一下acitivity的生命週期?
http://blog.csdn.net/android_tutor/article/details/6427680
14.請說明一下android程序的入口有哪些?
http://blog.csdn.net/zhaokaiqiang1992/article/details/25154981
http://blog.csdn.net/zcmain/article/details/14451591
15.Intent是什麼有哪些功能?
http://blog.csdn.net/dlmu2001/article/details/3478266
16.android常用的存儲方式有哪些?假設想要保留登陸時的username和password。用哪一個比較好?
http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html
17.不一樣尺寸的手機是怎麼適配的?
http://www.zhihu.com/question/19929388
18.優化LIstView控件
http://blog.csdn.net/zhaokaiqiang1992/article/details/33405181
一、 Android的四大組件是哪些,它們的做用?
答:Activity:Activity是Android程序與用戶交互的窗體。是Android構造塊中最主要的一種。它需要爲保持各界面的狀態,作很是多持久化的事情。妥善管理生命週期以及一些跳轉邏輯
service:後臺服務於Activity,封裝有一個完整的功能邏輯實現。接受上層指令,完畢相關的食物,定義好需要接受的Intent提供同步和異步的接口
Content Provider:是Android提供的第三方應用數據的訪問方案。可以派生Content Provider類,對外提供數據。可以像數據庫同樣進行選擇排序。屏蔽內部數據的存儲細節,向外提供統一的藉口模型,大大簡化上層應用,對數據的整合提供了更方便的途徑
BroadCast Receiver:接受一種或者多種Intent做觸發事件。接受相關消息。作一些簡單處理,轉換成一條Notification。統一了Android的事件廣播模型
二、 請介紹下Android中常用的五種佈局。
常用五種佈局方式,各自是:FrameLayout(框架佈局)。LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局)。TableLayout(表格佈局)。
1、FrameLayout:所有東西依次都放在左上角,會重疊。這個佈局比較簡單,也僅僅能放一點比較簡單的東西。
2、LinearLayout:線性佈局,每一個LinearLayout裏面又可分爲垂直佈局(android:orientation=」vertical」)和水平佈局(android:orientation=」horizontal」 )。當垂直佈局時,每一行就僅僅有一個元素,多個元素依次垂直往下;水平佈局時,僅僅有一行,每一個元素依次向右排列。3、AbsoluteLayout:絕對佈局用X,Y座標來指定元素的位置。這種佈局方式也比較簡單,但是在屏幕旋轉時。每每會出問題。並且多個元素的時候,計算比較麻煩。
4、RelativeLayout:相對佈局可以理解爲某一個元素爲參照物。來定位的佈局方式。主要屬性有:相對於某一個元素android:layout_below、 android:layout_toLeftOf相對於父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;5、TableLayout:表格佈局。每一個TableLayout裏面有表格行TableRow。TableRow裏面可以詳細定義每一個元素。
每一個佈局都有本身適合的方式。這五個佈局元素可以相互嵌套應用,作出美觀的界面。
三、 android中的動畫有哪幾類,它們的特色和差異是什麼
答:兩種。一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;還有一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,類似電影。
四、 android 中有哪幾種解析xml的類?官方推薦哪一種?以及它們的原理和差異。
答:XML解析主要有三種方式。SAX、DOM、PULL。常規在PC上開發咱們使用Dom相對輕鬆些,但一些性能敏感的數據庫或手機上仍是主要採用SAX方式,SAX讀取是單向的,優勢:不佔內存空間、解析屬性方便,但缺點就是對於套嵌多個分支來講處理不是很是方便。而DOM方式會把整個XML文件載入到內存中去。這裏Android開發網提醒你們該方法在查找方面可以和XPath很是好的結合假設數據量不是很是大推薦使用。而PULL常常常使用在J2ME對於節點處理比較好。類似SAX方式,一樣很是節省內存。在J2ME中咱們常用的KXML庫來解析。
五、 ListView的優化方案
答:一、假設本身定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否爲null。假設爲null就建立contentView並返回,假設不爲null則直接使用。在這種方法中儘量少建立view。
二、給contentView設置tag(setTag())。傳入一個viewHolder對象,用於緩存要顯示的數據,可以達到圖像數據異步載入的效果。
三、假設listview需要顯示的item很是多,就要考慮分頁載入。比方一共要顯示100條或者不少其餘的時候,咱們可以考慮先載入20條,等用戶拉到列表底部的時候再去載入接下來的20條。
六、 請介紹下Android的數據存儲方式。
答:使用SharedPreferences存儲數據;文件存儲數據;SQLite數據庫存儲數據。使用ContentProvider存儲數據。網絡存儲數據。
Preference,File, DataBase這三種方式分別相應的文件夾是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。
一:使用SharedPreferences存儲數據
首先說明SharedPreferences存儲方式。它是 Android提供的用來存儲一些簡單配置信息的一種機制,好比:登陸用戶的username與password。
其採用了Map數據結構來存儲數據,以鍵值的方式存儲。可以簡單的讀取與寫入,詳細實比例如如下:
void ReadSharedPreferences(){
String strName,strPassword;
SharedPreferences user = getSharedPreferences(「user_info」,0);
strName = user.getString(「NAME」,」」);
strPassword = user getString(「PASSWORD」,」」);
}
void WriteSharedPreferences(String strName,String strPassword){
SharedPreferences user = getSharedPreferences(「user_info」,0);
uer.edit();
user.putString(「NAME」, strName);
user.putString(「PASSWORD」 ,strPassword);
user.commit();
}
數據讀取與寫入的方法都很是easy,僅僅是在寫入的時候有些差異:先調用edit()使其處於編輯狀態,而後才幹改動數據,最後使用commit()提交改動的數據。
實際上SharedPreferences是採用了XML格式將數據存儲到設備中。在DDMS中的File Explorer中的/data/data//shares_prefs下。使用SharedPreferences是有些限制的:僅僅能在同一個包內使用。不能在不一樣的包之間使用。
二:文件存儲數據
文件存儲方式是一種較常用的方法。在Android中讀取/寫入文件的方法,與 Java中實現I/O的程序是全然同樣的。提供了openFileInput()和openFileOutput()方法來讀取設備上的文件。
詳細實比例如如下:
String fn = 「moandroid.log」;
FileInputStream fis = openFileInput(fn);
FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);
三:網絡存儲數據
網絡存儲方式,需要與Android 網絡數據包打交道,關於Android 網絡數據包的詳細說明,請閱讀Android SDK引用了Java SDK的哪些package?。
四:ContentProvider
一、ContentProvider簡單介紹
當應用繼承ContentProvider類。並重寫該類用於提供數據和存儲數據的方法。就可以向其餘應用共享其數據。
雖然使用其餘方法也可以對外共享數據。但數據訪問方式會因數據存儲的方式而不一樣,如:採用文件方式對外共享數據,需要進行文件操做讀寫數據。採用sharedpreferences共享數據,需要使用sharedpreferences API讀寫數據。而使用ContentProvider共享數據的優勢是統一了數據訪問方式。
二、Uri類簡單介紹
Uri表明了要操做的數據。Uri主要包括了兩部分信息:1.需要操做的ContentProvider 。2.對ContentProvider中的什麼數據進行操做。一個Uri由如下幾部分組成:
1.scheme:ContentProvider(內容提供者)的scheme已經由Android所規定爲:content://…
2.主機名(或Authority):用於惟一標識這個ContentProvider,外部調用者可以依據這個標識來找到它。
3.路徑(path):可以用來表示咱們要操做的數據,路徑的構建應依據業務而定,例如如下:
要操做contact表中id爲10的記錄,可以構建這種路徑:/contact/10
要操做contact表中id爲10的記錄的name字段, contact/10/name
要操做contact表中的所有記錄,可以構建這種路徑:/contact?
要操做的數據不必定來自數據庫,也可以是文件等他存儲方式,例如如下:
要操做xml文件裏contact節點下的name節點,可以構建這種路徑:/contact/name
假設要把一個字符串轉換成Uri,可以使用Uri類中的parse()方法。例如如下:
Uri uri = Uri.parse(「content://com.changcheng.provider.contactprovider/contact」)
三、UriMatcher、ContentUrist和ContentResolver簡單介紹
因爲Uri表明了要操做的數據,因此咱們很是常常需要解析Uri,並從 Uri中獲取數據。
Android系統提供了兩個用於操做Uri的工具類,分別爲UriMatcher 和ContentUris 。掌握它們的使用。會便於咱們的開發工做。
UriMatcher:用於匹配Uri,它的使用方法例如如下:
1.首先把你需要匹配Uri路徑所有給註冊上。例如如下:
//常量UriMatcher.NO_MATCH表示不匹配不論什麼路徑的返回碼(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//假設match()方法匹配content://com.changcheng.sqlite.provider.contactprovider /contact路徑,返回匹配碼爲1
uriMatcher.addURI(「com.changcheng.sqlite.provider.contactprovider」, 「contact」, 1);//加入需要匹配uri。假設匹配就會返回匹配碼
//假設match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路徑,返回匹配碼爲2
uriMatcher.addURI(「com.changcheng.sqlite.provider.contactprovider」, 「contact/#」, 2);//#號爲通配符
2.註冊完需要匹配的Uri後。就可以使用uriMatcher.match(uri)方法對輸入的Uri進行匹配,假設匹配就返回匹配碼,匹配碼是調用 addURI()方法傳入的第三個參數。假設匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回的匹配碼爲1。
ContentUris:用於獲取Uri路徑後面的ID部分。它有兩個比較實用的方法:
withAppendedId(uri, id)用於爲路徑加上ID部分
parseId(uri)方法用於從路徑中獲取ID部分
ContentResolver:當外部應用需要對ContentProvider中的數據進行加入、刪除、改動和查詢操做時。可以使用 ContentResolver 類來完畢,要獲取ContentResolver 對象。可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法。來操做數據。
七、 activity的啓動模式有哪些?是什麼含義?
答:在android裏。有4種activity的啓動模式,分別爲:
「standard」 (默認)
「singleTop」
「singleTask」
「singleInstance」
它們主要有例如如下不一樣:
1. 怎樣決定所屬task
「standard」和」singleTop」的activity的目標task,和收到的Intent的發送者在同一個task內,除非intent包括參數FLAG_ACTIVITY_NEW_TASK。
假設提供了FLAG_ACTIVITY_NEW_TASK參數。會啓動到別的task裏。
「singleTask」和」singleInstance」老是把activity做爲一個task的根元素。他們不會被啓動到一個其餘task裏。
2. 是否贊成多個實例
「standard」和」singleTop」可以被實例化屢次,並且存在於不一樣的task中,且一個task可以包括一個activity的多個實例;
「singleTask」和」singleInstance」則限制僅僅生成一個實例。並且是task的根元素。 singleTop要求假設建立intent的時候棧頂已經有要建立 的Activity的實例,則將intent發送給該實例,而不發送給新的實例。
3. 是否贊成其餘activity存在於本task內
「singleInstance」獨佔一個task,其餘activity不能存在那個task裏;假設它啓動了一個新的activity。不管新的activity的launch mode 怎樣,新的activity都將會到別的task裏執行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。
而另外三種模式,則可以和其餘activity共存。
4. 是否每次都生成新實例
「standard」對於沒一個啓動Intent都會生成一個activity的新實例。
「singleTop」的activity假設在task的棧頂的話,則不生成新的該activity的實例。直接使用棧頂的實例。不然,生成該activity的實例。
比方現在task棧元素爲A-B-C-D(D在棧頂),這時候給D發一個啓動intent,假設D是 「standard」的,則生成D的一個新實例。棧變爲A-B-C-D-D。
假設D是singleTop的話。則不會生產D的新實例,棧狀態仍爲A-B-C-D
假設這時候給B發Intent的話。不管B的launchmode是」standard」 仍是 「singleTop」 ,都會生成B的新實例,棧狀態變爲A-B-C-D-B。
「singleInstance」是其所在棧的惟一activity。它會每次都被重用。
「singleTask」假設在棧頂,則接受intent,不然,該intent會被丟棄,但是該task仍會回到前臺。
當已經存在的activity實例處理新的intent時候,會調用onNewIntent()方法 假設收到intent生成一個activity實例,那麼用戶可以經過back鍵回到上一個狀態。假設是已經存在的一個activity來處理這個intent的話,用戶不能經過按back鍵返回到這以前的狀態。
八、 跟activity和Task 有關的 Intent啓動方式有哪些?其含義?
核心的Intent Flag有:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP
FLAG_ACTIVITY_NEW_TASK
假設設置,這個Activity會成爲歷史stack中一個新Task的開始。一個Task(從啓動它的Activity到下一個Task中的 Activity)定義了用戶可以遷移的Activity原子組。
Task可以移動到前臺和後臺;在某個特定Task中的所有Activity老是保持一樣的次序。
這個標誌通常用於呈現「啓動」類型的行爲:它們提供用戶一系列可以單獨完畢的事情,與啓動它們的Activity全然無關。
使用這個標誌。假設正在啓動的Activity的Task已經在執行的話。那麼,新的Activity將不會啓動;取代的。當前Task會簡單的移入前臺。
參考FLAG_ACTIVITY_MULTIPLE_TASK標誌,可以禁用這一行爲。
這個標誌不能用於調用方對已經啓動的Activity請求結果。
FLAG_ACTIVITY_CLEAR_TOP
假設設置,並且這個Activity已經在當前的Task中執行,所以。再也不是又一次啓動一個這個Activity的實例,而是在這個Activity上方的所有Activity都將關閉,而後這個Intent會做爲一個新的Intent投遞到老的Activity(現在位於頂端)中。
好比,假設一個Task中包括這些Activity:A。B,C,D。假設D調用了startActivity()。並且包括一個指向Activity B的Intent,那麼。C和D都將結束,而後B接收到這個Intent,所以,眼下stack的情況是:A。B。
上例中正在執行的Activity B既可以在onNewIntent()中接收到這個新的Intent。也可以把本身關閉而後又一次啓動來接收這個Intent。假設它的啓動模式聲明爲 「multiple」(默認值)。並且你沒有在這個Intent中設置FLAG_ACTIVITY_SINGLE_TOP標誌,那麼它將關閉而後又一次建立;對於其餘的啓動模式,或者在這個Intent中設置FLAG_ACTIVITY_SINGLE_TOP標誌,都將把這個Intent投遞到當前這個實例的onNewIntent()中。
這個啓動模式還可以與FLAG_ACTIVITY_NEW_TASK結合起來使用:用於啓動一個Task中的根Activity。它會把那個Task中不論什麼執行的實例帶入前臺。而後清除它直到根Activity。
這很是實用。好比,當從Notification Manager處啓動一個Activity。
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
假設設置這個標誌。這個activity不管是從一個新的棧啓動仍是從已有棧推到棧頂。它都將以the front door of the task的方式啓動。
這就講致使不論什麼與應用相關的棧都講重置到正常狀態(不管是正在講activity移入仍是移除)。假設需要。或者直接重置該棧爲初始狀態。
FLAG_ACTIVITY_SINGLE_TOP
假設設置,當這個Activity位於歷史stack的頂端執行時,再也不啓動一個新的
FLAG_ACTIVITY_BROUGHT_TO_FRONT
這個標誌通常不是由程序代碼設置的。如在launchMode中設置singleTask模式時系統幫你設定。
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
假設設置。這將在Task的Activity stack中設置一個還原點,當Task恢復時。需要清理Activity。也就是說,下一次Task帶着 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標記進入前臺時(典型的操做是用戶在主畫面從新啓動它),這個Activity和它之上的都將關閉,以致於用戶不能再返回到它們。但是可以回到以前的Activity。
這在你的程序有切割點的時候很是實用。好比。一個e-mail應用程序可能有一個操做是查看一個附件。需要啓動圖片瀏覽Activity來顯示。這個 Activity應該做爲e-mail應用程序Task的一部分,因爲這是用戶在這個Task中觸發的操做。
然而,當用戶離開這個Task。而後從主畫面選擇e-mail app。咱們可能但願回到查看的會話中,但不是查看圖片附件,因爲這讓人困惑。經過在啓動圖片瀏覽時設定這個標誌,瀏覽及其餘啓動的Activity在下次用戶返回到mail程序時都將所有清除。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
假設設置,新的Activity不會在近期啓動的Activity的列表中保存。
FLAG_ACTIVITY_FORWARD_RESULT
假設設置,並且這個Intent用於從一個存在的Activity啓動一個新的Activity,那麼,這個做爲答覆目標的Activity將會傳到這個新的Activity中。這種方式下,新的Activity可以調用setResult(int)。並且這個結果值將發送給那個做爲答覆目標的 Activity。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
這個標誌通常不禁應用程序代碼設置,假設這個Activity是從歷史記錄裏啓動的(常按HOME鍵),那麼,系統會幫你設定。
FLAG_ACTIVITY_MULTIPLE_TASK
不要使用這個標誌,除非你本身實現了應用程序啓動器。與FLAG_ACTIVITY_NEW_TASK結合起來使用,可以禁用把已存的Task送入前臺的行爲。
當設置時,新的Task老是會啓動來處理Intent。而不管這是是否已經有一個Task可以處理一樣的事情。
因爲默認的系統不包括圖形Task管理功能。所以,你不該該使用這個標誌,除非你提供給用戶一種方式可以返回到已經啓動的Task。
假設FLAG_ACTIVITY_NEW_TASK標誌沒有設置,這個標誌被忽略。
FLAG_ACTIVITY_NO_ANIMATION
假設在Intent中設置,並傳遞給Context.startActivity()的話。這個標誌將阻止系統進入下一個Activity時應用 Acitivity遷移動畫。
這並不意味着動畫將永不執行——假設還有一個Activity在啓動顯示以前,沒有指定這個標誌。那麼,動畫將被應用。這個標誌可以很是好的用於執行一連串的操做,而動畫被看做是更高一級的事件的驅動。
FLAG_ACTIVITY_NO_HISTORY
假設設置,新的Activity將再也不歷史stack中保留。用戶一離開它,這個Activity就關閉了。這也可以經過設置noHistory特性。
FLAG_ACTIVITY_NO_USER_ACTION
假設設置,做爲新啓動的Activity進入前臺時,這個標誌將在Activity暫停以前阻止從最前方的Activity回調的onUserLeaveHint()。
典型的。一個Activity可以依賴這個回調指明顯式的用戶動做引發的Activity移出後臺。這個回調在Activity的生命週期中標記一個合適的點,並關閉一些Notification。
假設一個Activity經過非用戶驅動的事件,如來電或鬧鐘。啓動的。這個標誌也應該傳遞給Context.startActivity,保證暫停的Activity不以爲用戶已經知曉其Notification。
FLAG_ACTIVITY_PREVIOUS_IS_TOP
If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.
FLAG_ACTIVITY_REORDER_TO_FRONT
假設在Intent中設置,並傳遞給Context.startActivity(),這個標誌將引起已經執行的Activity移動到歷史stack的頂端。
好比。假設一個Task由四個Activity組成:A,B,C,D。
假設D調用startActivity()來啓動Activity B。那麼,B會移動到歷史stack的頂端。現在的次序變成A,C,D,B。
假設FLAG_ACTIVITY_CLEAR_TOP標誌也設置的話,那麼這個標誌將被忽略。
九、 請描寫敘述下Activity的生命週期。
答:activity的生命週期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();
可見生命週期:從onStart()直到系統調用onStop()
前臺生命週期:從onResume()直到系統調用onPause()
十、 activity在屏幕旋轉時的生命週期
答:不設置Activity的android:configChanges時。切屏會又一次調用各個生命週期。切橫屏時會執行一次。切豎屏時會執行兩次;設置Activity的android:configChanges=」orientation」時,切屏仍是會又一次調用各個生命週期,切橫、豎屏時僅僅會執行一次;設置Activity的android:configChanges=」orientation|keyboardHidden」時,切屏不會又一次調用各個生命週期,僅僅會執行onConfigurationChanged方法
十一、 怎樣啓用Service,怎樣停用Service。
服務的開發比較簡單。例如如下:
第一步:繼承Service類
public class SMSService extends Service {}
第二步:在AndroidManifest.xml文件裏的節點裏對服務進行配置:
服務不能本身執行,需要經過調用Context.startService()或Context.bindService()方法啓動服務。這兩個方法都可以啓動Service,但是它們的使用場合有所不一樣。使用startService()方法啓用服務,調用者與服務之間沒有關連,即便調用者退出了。服務仍然執行。
使用bindService()方法啓用服務。調用者與服務綁定在了一塊兒,調用者一旦退出,服務也就終止。大有「不求同一時候生,必須同一時候死」的特色。
假設打算採用Context.startService()方法啓動服務,在服務未被建立時。系統會先調用服務的onCreate()方法。接着調用onStart()方法。假設調用startService()方法前服務已經被建立,屢次調用startService()方法並不會致使屢次建立服務,但會致使屢次調用onStart()方法。
採用startService()方法啓動的服務,僅僅能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
假設打算採用Context.bindService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法。接着調用onBind()方法。
這個時候調用者和服務綁定在一塊兒,調用者退出了,系統就會先調用服務的onUnbind()方法。接着調用onDestroy()方法。假設調用bindService()方法前服務已經被綁定,屢次調用bindService()方法並不會致使屢次建立服務及綁定(也就是說onCreate()和onBind()方法並不會被屢次調用)。
假設調用者但願與正在綁定的服務解除綁定。可以調用unbindService()方法。調用該方法也會致使系統調用服務的onUnbind()–>onDestroy()方法。
服務常用生命週期回調方法例如如下:
onCreate() 該方法在服務被建立時調用,該方法僅僅會被調用一次,不管調用多少次startService()或bindService()方法,服務也僅僅被建立一次。
onDestroy()該方法在服務被終止時調用。
與採用Context.startService()方法啓動服務有關的生命週期方法
onStart() 僅僅有採用Context.startService()方法啓動服務時纔會回調該方法。該方法在服務開始執行時被調用。屢次調用startService()方法雖然不會屢次建立服務,但onStart() 方法會被屢次調用。
與採用Context.bindService()方法啓動服務有關的生命週期方法
onBind()僅僅有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,屢次調用Context.bindService()方法並不會致使該方法被屢次調用。
onUnbind()僅僅有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務解除綁定時被調用 十二、 註冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。 答:首先寫一個類要繼承BroadcastReceiver 第一種:在清單文件裏聲明,加入