百度的android面試總結分析

來源:互聯網
上載者:User

標籤:android面試

今天就是今天上午10點,我接到了百度的電話面試,當然提前和我說了,我的拖延症是有多強烈,以至於我沒怎麼準備,當然我也想著看看自己的真實水平,在此檢討一下!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

廢話不多說

上來就是百度的一個技術人員打過電話來,簡單確認了我的資訊之後,就開始問問題,此刻我的心中有一萬匹草泥馬奔騰。。。。開始問的是資料結構和演算法的相關知識,我本科學過一小點,不過沒有及時複習全忘記了。。。接下來就是android的相關知識了,這部分我算是回答的中規中矩,有一個關於ANR的問題,沒有回答上來。。。後面是關於java的問題,我也沒有回答好。

面試的題目
  1. 二叉樹的前序走訪
  2. 簡單的闡述一下冒泡演算法
  3. android的四大組件及其功能。
  4. service如何保證殺掉後重啟
  5. ANR問題
  6. 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常用的儲存方式有哪些?如果想要保留登入時的使用者名稱和密碼,用哪個比較好?
    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面試問答總結,不用謝,還有疑問的歡迎留言交流

1、 Android的四大組件是哪些,它們的作用?
答:Activity:Activity是Android程式與使用者互動的視窗,是Android構造塊中最基本的一種,它需要為保持各介面的狀態,做很多持久化的事情,妥善管理生命週期以及一些跳轉邏輯
service:後台服務於Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的食物,定義好需要接受的Intent提供同步和非同步介面
Content Provider:是Android提供的第三方應用資料的訪問方案,可以派生Content Provider類,對外提供資料,可以像資料庫一樣進行選擇排序,屏蔽內部資料的儲存細節,向外提供統一的借口模型,大大簡化上層應用,對資料的整合提供了更方便的途徑
BroadCast Receiver:接受一種或者多種Intent作觸發事件,接受相關訊息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型
2、 請介紹下Android中常用的五種布局。
常用五種布局方式,分別是:FrameLayout(架構布局),LinearLayout (線性布局),AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格版面配置)。
一、FrameLayout:所有東西依次都放在左上方,會重疊,這個布局比較簡單,也只能放一點比較簡單的東西。二、LinearLayout:線性布局,每一個LinearLayout裡面又可分為垂直布局(android:orientation=”vertical”)和水平布局(android:orientation=”horizontal” )。當垂直布局時,每一行就只有一個元素,多個元素依次垂直往下;水平布局時,只有一行,每一個元素依次向右排列。三、AbsoluteLayout:絕對布局用X,Y座標來指定元素的位置,這種布局方式也比較簡單,但是在旋轉螢幕時,往往會出問題,而且多個元素的時候,計算比較麻煩。四、RelativeLayout:相對布局可以理解為某一個元素為參照物,來定位的布局方式。主要屬性有:相對於某一個元素android:layout_below、 android:layout_toLeftOf相對於父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;五、TableLayout:表格版面配置,每一個TableLayout裡面有表格行TableRow,TableRow裡面可以具體定義每一個元素。每一個布局都有自己適合的方式,這五個布局元素可以相互嵌套應用,做出美觀的介面。
3、 android中的動畫有哪幾類,它們的特點和區別是什麼
答:兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
4、 android 中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和區別。
答:XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發我們使用Dom相對輕鬆些,但一些效能敏感的資料庫或手機上還是主要採用SAX方式,SAX讀取是單向的,優點:不佔記憶體空間、解析屬性方便,但缺點就是對於套嵌多個分支來說處理不是很方便。而DOM方式會把整個XML檔案載入到記憶體中去,這裡Android開發網提醒大家該方法在尋找方面可以和XPath很好的結合如果資料量不是很大推薦使用,而PULL常常用在J2ME對於節點處理比較好,類似SAX方式,同樣很節省記憶體,在J2ME中我們經常使用的KXML庫來解析。
5、 ListView的最佳化方案
答:1、如果自訂配接器,那麼在getView方法中要考慮方法傳進來的參數contentView是否為null,如果為null就建立contentView並返回,如果不為null則直接使用。在這個方法中儘可能少建立view。
2、給contentView設定tag(setTag()),傳入一個viewHolder對象,用於緩衝要顯示的資料,可以達到映像資料非同步載入的效果。
3、如果listview需要顯示的item很多,就要考慮分頁載入。比如一共要顯示100條或者更多的時候,我們可以考慮先載入20條,等使用者拉到列表底部的時候再去載入接下來的20條。
6、 請介紹下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提供的用來儲存一些簡單配置資訊的一種機制,例如:登入使用者的使用者名稱與密碼。其採用了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();
}
資料讀取與寫入的方法都非常簡單,只是在寫入的時候有些區別:先調用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
1、ContentProvider簡介
當應用繼承ContentProvider類,並重寫該類用於提供資料和儲存資料的方法,就可以向其他應用共用其資料。雖然使用其他方法也可以對外共用資料,但資料訪問方式會因資料存放區的方式而不同,如:採用檔案方式對外共用資料,需要進行檔案操作讀寫資料;採用sharedpreferences共用資料,需要使用sharedpreferences API讀寫資料。而使用ContentProvider共用資料的好處是統一了資料訪問方式。
2、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”)
3、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方法,來操作資料。
7、 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鍵返回到這之前的狀態。
8、 跟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標誌也設定的話,那麼這個標誌將被忽略。
9、 請描述下Activity的生命週期。
答:activity的生命週期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();
可見生命週期:從onStart()直到系統調用onStop()
前台生命週期:從onResume()直到系統調用onPause()
10、 activity在旋轉螢幕時的生命週期
答:不設定Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次;設定Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次;設定Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法
11、 如何啟用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()方法啟動服務時才會回調該方法。該方法在調用者與服務解除綁定時被調用
12、 註冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。
答:首先寫一個類要繼承BroadcastReceiver
第一種:在資訊清單檔中聲明,添加


百度的android面試總結分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.