




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Android 面試題(1)真..2.13.14.全面呢。請描述下 Activity 的生命周期。如果的 Activity 由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當前狀態(tài)?如何將一個 Activity 設置成窗口的樣式。(Edited by Sodino)如何退出 Activity?如何安全退出已調用多個 Activity 的 Application?請介紹下 Android 中常用的五種布局。請介紹下 Android 的數(shù)據(jù)方式。(Edited by Sodino)請介紹下 ContentProvider 是如何實現(xiàn)數(shù)據(jù)共享的。(Edi
2、ted by Sodino)如何啟用 Service,如何停用 Service。(Edited by Sodino)廣播有幾種方式,這些方式有何優(yōu)缺點?請談談 Android 引入廣播機制的用意。請解釋下在單線程模型中Message、Handler、Message Queue、Looper 之間的關系。AIDL 的全稱是什么?如何工作?能處理哪些類型的數(shù)據(jù)?請解釋下 Android 程序運行時權限與文件系統(tǒng)權限的區(qū)別。(Edited by Sodino)系統(tǒng)上安裝了多種瀏覽器,能否指定某瀏覽器指定頁面?請說明原由。有一個一維整型數(shù)組data 保存的是一張寬為width,高為 height 的像
3、素值信息。請寫一個算法,將該所有的白色不透明(0 xff)像素點的調整為50%。15.你如何評價 Android 系統(tǒng)?優(yōu)缺點。1.請描述下 Activity 的生命周期/1556324/311495詳細介紹一下這幾個方法中系統(tǒng)在做什么以及應該做什么:onCreate:在這里創(chuàng)建界面 ,做一些數(shù)據(jù)的初始化工作onStart:onResume:到這一步變成用戶可見不可交互 的變成和用戶可交互 的,(在 activity 棧系統(tǒng)通過棧的方式管理這些個Activity 的最上面,運行完彈出棧,則回到上一個 Activity)到這一步是可見但不可交互 的,系統(tǒng)會停止動畫 等消耗CPU 的事情 從上文的
4、描述已經知道,應該在這里保存你的一些數(shù)據(jù),因為這個時候你的程序的優(yōu)先級降低,有可能被系統(tǒng)收回。在這里保存的數(shù)據(jù),應該在onPause:onResume 里讀出來,注意:這個方法里做的事情時間要短,因為下一個 activity 不會等到這個方法完成才啟動變得不可見 ,被下一個 activity 覆蓋了onstop:onDestroy:這是 activity掉前最后一個被調用方法了,可能是外面類調用 finish 方法或者是系統(tǒng)為了節(jié)省空間將它暫時性的干掉,可以用 isFinishing()來判斷它,如果你有一個 Progress Dialog轉動,請在 onDestroy 里把他cancel 掉
5、,不然等線程結束的時候,調用 Dialog 的 cancel 方拋異常的。onPause,onstop, onDestroy,三種狀態(tài) 下 activity 都有可能被系統(tǒng)干掉為了保證程序的正確性,你要在 onPause()里寫上持久層操作的代碼,將用戶編輯的內容都保存到介質上(一般都是數(shù)據(jù)庫)。實際工作中因為生命周期的變化而帶來也很多,比如你的應用程序起了新的線程在跑,這時候中斷了,你還要去那個線程,是暫停還是殺掉還是數(shù)據(jù)回滾,是吧?因為 Activity 可能被殺掉,所以線使用的變量和一些界面元素就千萬要注意了,一般我都是采用 Android 的消息機制 Handler,Message來處
6、理多線程和界面交互。這個我后面會講一些,最近因為這些東西頭已經很大了,等我思緒再跟大家。2.如果的 Activity 由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當前狀態(tài)?當你的程序中某一個 Activity A 在運行時中,主動或地運行另一個新的 Activity B這個時候 A 會執(zhí)行Java 代碼publicvoid onSaveInstan super.onSaveInstane(Bundle outSe) e(outSe);outSe.putLong(id, 1234567890);publicvoidsuper.onSaveInstanonSaveInstane(Bundleo
7、utSoutSe)e(outSe);e.putLong(id,1234567890);B 完成以后又會來找 A, 這個時候就有兩種情況,一種是A 被回收,一種是沒有被回收,被回收的 A 就要重新調用 onCreate()方法,不同于直接啟動的是這回 onCreate()里是帶上參數(shù)savedInstansavedInstane,沒被收回的就還是 onResume 就好了。e 是一個 Bundle 對象,你基本上可以把他理解為系統(tǒng)幫你的一個Map 對象。在 onCreate()里你可能會用到它,如果正常啟動 onCreate 就不會有它,所以用的時候要判斷一下是否為空。Java 代碼if(sav
8、edInstane != null)long id = savedInstane.getLong(id);if(savedInstane != null)long id = savedInstane.getLong(id);就像的Notepad里的情況,你正在編輯某一個 note,突然被中斷,那么就把這個 note 的id 記住,再起來的時候就可以根據(jù)這個 id 去把那個 note 取出來,程序就完整一些。這也是看你的應用需不需要保存什么,比如你的界面就是要記住滾動條的位置.一個列表,那就不需要特殊記住什么,哦,沒準你需3.如何將一個 Activity 設置成窗口的樣式簡單你只需要設置 一下
9、Activity 的地方一句話:就可以了在 AndroidManifest.xml 中定義 Activity 的Xml 代碼android :theme=android:style/Theme.Dialog android:theme=android:style/Theme.Dialog這就使你的應用程序變成框的形式彈出來了,或者Xml 代碼 android:theme=android:style/Theme.Translucent android:theme=android:style/Theme.Translucent就變成半透明的,友情提示-.-類似的這種 activity 的屬性可以在
10、android.R.styleable 類的AndroidManifestActivity 方法中看到,AndroidManifest.xml 中所有元素的屬性的介紹都可以參考這個類 android.R.styleable值是在 android.R.style 中可以看到, 比如這個上面說的是屬性名稱, 具體 android:style/Theme.Dialog 就對應于 android.R.style.Theme_Dialog ,(_換成. -注意:這個是文章內容不是笑臉)就可以用在描述文件中了,找找類定義和描述文件中的對應關系就都明白了。4.如何退出 Activity對于單一 Activi
11、ty 的應用來說,退出很簡單,直接 finish()即可。當然,也可以用killPros()和 System.exit()這樣的方法。現(xiàn)提供幾個方法,供參考:1、拋異常強制退出:該方法通過拋異常,使程序 Force Close。是,如何使程序結束掉,而不彈出 Force Close 的窗口。驗證可以,但是,需要解決2、打開的 Activity:每打開一個 Activity,就下來。在需要退出時,關閉每一個 Activity 即可。3、發(fā)送特定廣播:在需要結束應用時,發(fā)送一個特定的廣播,每個 Activity 收到廣播后,關閉即可。4、遞歸退出在打開新的 Activity 時使用startAct
12、ivityForResult,然后自己加標志,在 onActivityResult 中處理,遞歸關閉。除了第一個,都是想辦法把每一個 Activity 都結束掉,間接達到目的。但是這樣做同樣不完美。你會發(fā)現(xiàn),如果自己的應用程序對每一個 Activity 都設置了 nosensor,在兩個 Activity 結束的間隙,sensor 可能有效了。但至少,的目的達到了,而且沒有影響用戶使用。為了編程方便,最好定義一個 Activity 基類,處理這些共通問題。5.請介紹下 Android 中常用的五種布局Android 布局是應用界面開發(fā)的重要一環(huán),在Android(框架布局),LinearLay
13、out有五種布局方式,分別是:FrameLayout(線性布局),Absoluayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格布局)。一、FrameLayout這個布局可以看成是墻腳堆東西,有一個四方的矩形的左上角墻腳,放了第一個東西,要再放一個,那就在放在原來放的位置的上面,這樣依次的放,會蓋住原來的東西。這個布局比較簡單,也只能放一點比較簡單的東西。二、LinearLayout線性布局,這個東西,從外框上可以理解為一個div,他首先是一個一個從上往下羅列在屏幕上。每一個 LinearLayout 里面又可分為垂直布局(android:orien
14、ion=vertical)和水平布局(android:orienion=horizontal)。當垂直布局時,每一行就只有一個元素,多個元素依次垂直往下;水平布局時,只有一行,每一個元素依次向右排列。linearLayout 中有一個重要的屬性 android:layout_weight=1,這個 weight 在垂直布局時,代表行距;水平的時候代表列寬;weight 值越大就越大。三、Absoluayout絕對布局猶 如 div 指定 了 absolute 屬性,用 X,Y 坐標來 指定元素的位 置android:layout_x=20pxandroid:layout_y=12px 這種布局
15、方式也比較簡單,但是在垂直隨便切換時,往往會出問題,而且多個元素的時候,計算比較麻煩。四、RelativeLayout相對布局可以理解為某一個元素為參照物,來定位的布局方式。主要屬性有:相對于某一個元素android:layout_below=id/aaa 該元素在 id 為 aaa 的下面android:layout_toLeftOf=id/bbb 改元素的左邊是 bbb相對于父元素的地方 android:layout_alignParentLeft=true 在父元素左對齊 android:layout_alignParentRight=true 在父元素右對齊還可以指定邊距等,具體詳見
16、API五。TableLayout表格布局類似Html 里面的 Table。每一個 TableLayout 里面有表格行 TableRow,TableRow里面可以具體定義每一個元素,設定他的對齊方式 android:gravity= 。每一個布局都有自己適合的方式,另外,這五個布局元素可以相互嵌套應用,做出美觀的界面。6.請介紹下 Android 的數(shù)據(jù)方式Android 提供了5種方式數(shù)據(jù):-使用SharedPreferen數(shù)據(jù);-文件-數(shù)據(jù);數(shù)據(jù)庫數(shù)據(jù);-使用ContentProvider數(shù)據(jù);-網絡數(shù)據(jù);先 說下, Preference , File , DataBase 這三種方式分別
17、對應的目錄是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files,/data/data/Package Name/database 。在 Android 中通常使用 File方式是用 Context.openFileOutput(StringfileName,mode)和 Context.openFileInput(String fileName)。Context.openFileOutput(String fileName,mode)生成的文件自動在/data/data/Package Name/files 目錄
18、下, 其全路徑是/data/data/Package Name/files/fileName 。注意下,這里的參數(shù) fileName 不可以包含路徑分割符(如/)。通常來說,這種方式生成的文件只能在這個 apk 內。但這個結論是指使用Context.openFileInput(String fileName)的方式。使用這種方式,每個 apk只可以自己的/data/data/Package Name/files 目錄下的文件,原因很簡單,參數(shù) fileName 中不可以包含路徑分割符, Android 會自動在/data/data/Package Name/files 目錄下尋找文件名為 fi
19、leName 的文件。一:使用 SharedPreferen數(shù)據(jù)首先說明 SharedPreferen方式,它是 Android 提供的用來一些簡單配置信息的一種機制,例如:登錄用戶的用戶名與。其采用了 Map 數(shù)據(jù)結構來數(shù)據(jù),以鍵值的方式,可以簡單的與寫入,具體實例如下:()void ReadSharedPreferenString strName,strPassword;SharedPreferenuser = getSharedPreferen(“user_info”,0);strName = user.getString(“NAME”,”); strPassword = user ge
20、tString(“PASSWORD”,”);void WriteSharedPreferen(String strName,String strPassword)SharedPreferenuer.edit();user = getSharedPreferen(“user_info”,0);usutString(“NAME”, strName);usutString(“PASSWORD” ,strPassword); mit();數(shù)據(jù)與寫入的方法都非常簡單,只是在寫入的時候有些區(qū)別:先調用 edit()使其處于編輯狀態(tài),然后才能修改數(shù)據(jù), 最后使用 commit() 提交修改的數(shù)據(jù)。實際上Sh
21、aredPreferen是采用了 XML 格式將數(shù)據(jù)到設備中,在 DDMS 中的 FileExplorer 中的/data/data/shares_prefs 下。以上面的數(shù)據(jù)果為例,打開后可以看到一個user_info.xml 的文件,打開后可以看到:結?xml ver=”1.0 encoding=”UTF-8?moandroidSharedPreferen使用 SharedPreferen用。是有些限制的:只能在同一個包內使用,不能在不同的包之間使二:文件數(shù)據(jù)文件方式是一種較常用的方法,在 Android 中/寫入文件的方法,與 Java 中實現(xiàn)I/O 的程序是完全一樣的,提供了 open
22、FileInput()和 openFileOutput()方法來設備上的文件。 FilterInputStream, FilterOutputStream 等可以到 Java io package 說明中去詳細學習,不再此詳細說明,具體實例如下:String fn = “moandroid.log”; FileInputStream fis = openFileInput(fn);FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);除此之外,Android 還提供了其他函數(shù)來操作文件,詳細說明請閱讀 Android SD
23、K。三:網絡數(shù)據(jù)方式,需要與 Android 網絡數(shù)據(jù)包打交道,關于 Android 網絡數(shù)據(jù)包的詳細說網絡明,請閱讀 Android SDK了 Java SDK 的哪些 package?。四:ContentProvider1、ContentProvider 簡介當應用繼承ContentProvider 類,并重寫該類用于提供數(shù)據(jù)和數(shù)據(jù)的方法,就可以向其他應用共享其數(shù)據(jù)。雖然使用其他方法也可以對外共享數(shù)據(jù),但數(shù)據(jù)方式會因數(shù)據(jù)存儲的方式而不同,如:采用文件方式對外共享數(shù)據(jù),需要進行文件操作讀寫數(shù)據(jù);采用sharedpreferen共享數(shù)據(jù),需要使用 sharedpreferenAPI 讀寫數(shù)據(jù)。
24、而使用ContentProvider 共享數(shù)據(jù)的好處是了數(shù)據(jù)方式。?2、Uri 類簡介Uri 代表了要操作的數(shù)據(jù),Uri 主要包含了兩部分信息:1.需要操作的ContentProvider , 2.對 ContentProvider 中的什么數(shù)據(jù)進行操作,一個 Uri 由以下幾部分組成: 1.scheme:ContentProvider(內容提供者)的 scheme 已經由 Android 所規(guī)定為:content:/。2.主機名(或 Authority):用于唯一標識這個 ContentProvider,外部調用者可以根據(jù)這個標識來找到它。3.路徑(path):可以用來表示要操作的數(shù)據(jù),路徑
25、的構建應根據(jù)業(yè)務而定,如下:,可以構建這樣的路徑:/contact/10的 name 字段, contact/10/name,可以構建這樣的路徑:/contact?要操作 contact 表中 id 為10的要操作 contact 表中 id 為10的要操作 contact 表中的所有要操作的數(shù)據(jù)不一定來自數(shù)據(jù)庫,也可以是文件等他方式,如下:要操作 xml 文件中contact 節(jié)點下的 name 節(jié)點,可以構建這樣的路徑:/contact/name如果要把一個字符串轉換成 Uri,可以使用 Uri 類中的 parse()方法,如下:UriUri.parse(uri.changcheng.pr
26、ovider.contactprovider/contact)=3、UriMatcher、ContentUrist 和ContentResolver 簡介因為 Uri 代表了要操作的數(shù)據(jù),所以Uri,并從 Uri 中獲取數(shù)據(jù)。很經常需要Android 系統(tǒng)提供了兩個用于操作 Uri 的工具類,分別為 UriMatcher 和 ContentUris 。掌握它們的使用,會便于的開發(fā)工作。? UriMatcher:用于匹配 Uri,它的用法如下:1.首先需要匹配 Uri 路徑全部給上,如下:/常量 UriMatcher.NO_MATCH 表示不匹配任何路徑的返回碼(-1)。UriMatcher u
27、riMatcher = new UriMatcher(UriMatcher.NO_MATCH);/match()如果.changcheng.方法匹配.provider.contactprovider /contact 路徑,返回匹配碼為1 uriMatcher.addURI(“vider.contactprovider”,“contact”, 1);/添加需要匹配 uri,如果匹配就會返回匹配碼/match()如果.changcheng.方法匹配.provider.contactprovider/contact/230路徑,返回匹配碼為2 uriMatche
28、r.addURI(“com.changcheng.“contact/#”, 2);/#號為通配符.provider.contactprovider”,2.完需要匹配的 Uri 后,就可以使用 uriMatcher.match(uri)方法對輸入的 Uri 進行匹配,如果匹配就返回匹配碼,匹配碼是調用 addURI()方法傳入的第三個參數(shù),假設匹配.vider.contactprovider/contact 路徑,返回的匹配碼為1。?ContentUris:用于獲取 Uri 路徑后面的 ID 部分,它有兩個比較實用的方法:? wippendedId(uri, id)用
29、于為路徑加上 ID 部分? parseId(uri)方法用于從路徑中獲取 ID 部分? ContentResolver:當外部應用需要對 ContentProvider 中的數(shù)據(jù)進行添加、刪除、修改和查詢操作時,可以使用 ContentResolver 類來完成,要獲取 ContentResolver 對象,可以使用 Activity 提供的 getContentResolver()方法。 ContentResolver 使用 insert、delete、update、query 方法,來操作數(shù)據(jù)。五:總結說明以上5中的數(shù)據(jù)方式,在以后的開發(fā)過方式。Android 中的數(shù)據(jù),根據(jù)設計目標、性能
30、需求、空間需求等找到合適都是私有的,其他應用程序都是無法的,除非通過 ContentResolver 獲取其他程序共享的數(shù)據(jù)。采用文件方式對外共享數(shù)據(jù),需要進行文件操作讀寫數(shù)據(jù);采用 sharedpreferen共享數(shù)據(jù),需要使用 sharedpreferenAPI 讀寫數(shù)據(jù)。而使用ContentProvider 共享數(shù)據(jù)的好處是了數(shù)據(jù)方式。8.如何啟用 Service,如何停用 ServiceAndroid 中的服務和 windows 中的服務是類似的東西,服務一般沒有用戶操作界面,它運行于系統(tǒng)中不容易被用戶發(fā)覺,可以使用它開發(fā)如之類的程序。服務的開發(fā)比較簡單,如下:第一步:繼承 Servi
31、ce 類public class SMSService extends Service 第二步:在 AndroidManifest.xml 文件中的節(jié)點里對服務進行配置:服務不能自己運行,需要通過調用 Context.startService()或 Context.bindService()方法啟動服務。這兩個方法都可以啟動 Service,但是它們的使用場合有所不同。使用 startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。使用 bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有“不求同時生,必
32、須同時死”的特點。如果打算采用 Context.startService()方法啟動服務,在服務未被創(chuàng)建時,系統(tǒng)會先調用服務的 onCreate()方法,接著調用 onStart()方法。如果調用 startService()方法前服務已經被創(chuàng)建,多次調用 startService()方法并不會導致多次創(chuàng)建服務,但會導致多次調用 onStart()方法。采用startService()方法啟動的服務,只能調用 Context.stopService()方法結束服務,服務結束時會調用 onDestroy()方法。如果打算采用 Context.bindService()方法啟動服務,在服務未被創(chuàng)建
33、時,系統(tǒng)會先調用服務的 onCreate()方法,接著調用 onBind()方法。這個時候調用者和服務綁定在一起,調用者退出了,系統(tǒng)就會先調用服務的 onUnbind()方法,接著調用 onDestroy()方法。如果調用 bindService()方法前服務已經被綁定,多次調用 bindService()方法并不會導致多次創(chuàng)建服務及綁定(也就是說 onCreate()和 onBind()方法并不會被多次調用)。如果調用者希望與正在綁定的服務解除綁定,可以調用 unbindService()方法,調用該方法也會導致系統(tǒng)調用服務的onUnbind()-onDestroy()方法。服務常用生命周期回調方法如下:onCreate() 該方法在服務被創(chuàng)建時調用,該方法只會被調用一次,無論調用多少次startService()或bindService()方法,服務也只被創(chuàng)建一次。 onDestroy()該方法在服務被終止時調用。與采用Context.startService()方法啟動服務有關的生命周期方法onStart() 只有采用 Context.startService()方法啟動服務時才會回調該方法。該方法在服務開始運行時被調用。多次調用 startService()方法盡管不會多次創(chuàng)建服務,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 云南省瀘西縣瀘源普通高級中學2025屆高三下學期第二次高考模擬英語試題含解析
- 遼寧省沈陽市沈北新區(qū)重點達標名校2025屆初三下學期第二次模擬考試(期中)數(shù)學試題含解析
- 浙江省池州市2024-2025學年數(shù)學三下期末復習檢測試題含解析
- 陜西省咸陽市秦嶺中學2025年第二學期期末學業(yè)質量陽光指標調研卷初三生物試題含解析
- FIDIC電力工程施工合同版
- 江蘇省徐州市睢寧縣2024-2025學年三年級數(shù)學第二學期期末質量跟蹤監(jiān)視模擬試題含解析
- 設備買賣及所有權轉移合同
- 餐廳檔口租賃合同模板
- 手機SIM卡購銷合同
- 停車庫鋼結構施工合同協(xié)議
- 期中(試題)-2024-2025學年人教精通版(2024)英語三年級下冊
- 2025-2030中國煤焦油雜酚油行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 防洪防汛安全教育知識培訓
- 2020-2025年中國遼寧省風力發(fā)電行業(yè)發(fā)展?jié)摿Ψ治黾巴顿Y方向研究報告
- 規(guī)模養(yǎng)殖場十項管理制度
- 2025航天知識競賽考試題庫(含答案)
- 2025中考英語熱點話題閱讀《哪吒2魔童鬧海》
- 勞務派遣勞務外包項目方案投標文件(技術方案)
- 瘧疾2025培訓課件
- 流行性感冒診療方案(2025版)解讀課件
- 2025年度打印機銷售與升級改造合同模板4篇
評論
0/150
提交評論