版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
Android系統(tǒng)的架構(gòu)從底層往上層主要包含:LinuxKernel:Android基于Linux2.6提供核心系統(tǒng)服務(wù),例如:安全、內(nèi)存管理、進程管理、網(wǎng)絡(luò)堆棧、驅(qū)動模型。LinuxKernel也作為硬件和軟件之間的抽象層,它隱藏具體硬件細(xì)節(jié)而為上層提供統(tǒng)一的服務(wù)。AndroidRuntime:Android包含一個核心庫的集合,提供大部分在Java編程語言核心類庫中可用的功能。每一個Android應(yīng)用程序是Dalvik虛擬機中的實例,運行在他們自己的進程中。Dalvik虛擬機設(shè)計成,在一個設(shè)備可以高效地運行多個虛擬機。Dalvik虛擬機可執(zhí)行文件格式是.dex,dex格式是專為Dalvik設(shè)計的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)。Libraries:Android包含一個C/C++庫的集合,供Android系統(tǒng)的各個組件使用。這些功能通過Android的應(yīng)用程序框架(applicationframework)暴露給開發(fā)者。主要包含:系統(tǒng)C庫、媒體庫、界面管理、LibWebCore、SGL(2D)、3D庫、FreeType、SQLite
ApplicationFramework:所有的應(yīng)用程序其實是一組服務(wù)和系統(tǒng),包括:視圖(View)、內(nèi)容提供者(ContentProviders)、資源管理器(ResourceManager)、通知管理器(NotificationManager)、活動管理器(ActivityManager)、通訊、定位、消息提醒等。Applicationsactivity的生命周期Activity有四種本質(zhì)區(qū)別的狀態(tài):在屏幕的前臺(Activity棧頂),叫做活動狀態(tài)或者運行狀態(tài)(activeorrunning)如果一個Activity失去焦點,但是依然可見(一個新的非全屏的Activity或者一個透明的Activity被放置在棧頂),叫做暫停狀態(tài)(Paused)。一個暫停狀態(tài)的Activity依然保持活力(保持所有的狀態(tài),成員信息,和窗口管理器保持連接),但是在系統(tǒng)內(nèi)存極端低下的時候?qū)⒈粴⒌簟H绻粋€Activity被另外的Activity完全覆蓋掉,叫做停止?fàn)顟B(tài)(Stopped)。它依然保持所有狀態(tài)和成員信息,但是它不再可見,所以它的窗口被隱藏,當(dāng)系統(tǒng)內(nèi)存需要被用在其他地方的時候,Stopped的Activity將被殺掉。如果一個Activity是Paused或者Stopped狀態(tài),系統(tǒng)可以將該Activity從內(nèi)存中刪除,Android系統(tǒng)采用兩種方式進行刪除,要么要求該Activity結(jié)束,要么直接殺掉它的進程。當(dāng)該Activity再次顯示給用戶時,它必須重新開始和重置前面的狀態(tài)。service的周期AndroidService生命周期與Activity生命周期是相似的,但是也存在一些細(xì)節(jié)上也存在著重要的不同:onCreate和onStart是不同的通過從客戶端調(diào)用Context.startService(Intent)方法我們可以啟動一個服務(wù)。如果這個服務(wù)還沒有運行,Android將啟動它并且在onCreate方法之后調(diào)用它的onStart方法。如果這個服務(wù)已經(jīng)在運行,那么它的onStart方法將被新的Intent再次調(diào)用。所以對于單個運行的Service它的onStart方法被反復(fù)調(diào)用是完全可能的并且是很正常的。onResume、onPause以及onStop是不需要的回調(diào)一個服務(wù)通常是沒有用戶界面的,所以我們也就不需要onPause、onResume或者onStop方法了。無論何時一個運行中的Service它總是在后臺運行。onBind如果一個客戶端需要持久的連接到一個服務(wù),那么他可以調(diào)用Context.bindService方法。如果這個服務(wù)沒有運行方法將通過調(diào)用onCreate方法去創(chuàng)建這個服務(wù)但并不調(diào)用onStart方法來啟動它。相反,onBind方法將被客戶端的Intent調(diào)用,并且它返回一個IBind對象以便客戶端稍后可以調(diào)用這個服務(wù)。同一服務(wù)被客戶端同時啟動和綁定是很正常的。onDestroy與Activity一樣,當(dāng)一個服務(wù)被結(jié)束是onDestroy方法將會被調(diào)用。當(dāng)沒有客戶端啟動或綁定到一個服務(wù)時Android將終結(jié)這個服務(wù)。與很多Activity時的情況一樣,當(dāng)內(nèi)存很低的時候Android也可能會終結(jié)一個服務(wù)。如果這種情況發(fā)生,Android也可能在內(nèi)存夠用的時候嘗試啟動被終止的服務(wù),所以你的服務(wù)必須為重啟持久保存信息,并且最好在onStart方法內(nèi)來做??偨Y(jié):1.startService()的目的是回調(diào)onStart()方法,onCreate()方法是在Service不存在的時候調(diào)用的,如果Service存在(例如之前調(diào)用了bindService,那么Service的onCreate方法已經(jīng)調(diào)用了)那么startService()將跳過onCreate()方法。2.bindService()目的是回調(diào)onBind()方法,它的作用是在Service和調(diào)用者之間建立一個橋梁,并不負(fù)責(zé)更多的工作(例如一個Service需要連接服務(wù)器的操作),一般使用bindService來綁定到一個現(xiàn)有的Service(即通過StartService啟動的服務(wù))。由于Service的onStart()方法只有在startService()啟動Service的情況下才調(diào)用,故使用onStart()的時候要注意這點。BroadCastReceiver,注冊廣播有幾種方式,這些方式有何優(yōu)缺點?請談?wù)凙ndroid引入廣播機制的用意。廣播(Broadcast)-用于發(fā)送廣播廣播接收器(BroadcastReceiver)-用于接收廣播Intent-用于連接以上各個組件,并在其間傳遞消息BroadcastReceiver在Android中,Broadcast是一種廣泛運用的在應(yīng)用程序之間傳輸信息的機制。而BroadcastReceiver是對發(fā)送出來的Broadcast進行過濾接受并響應(yīng)的一類組件。下面將詳細(xì)的闡述如何發(fā)送Broadcast和使用BroadcastReceiver過濾接收的過程:首先在需要發(fā)送信息的地方,把要發(fā)送的信息和用于過濾的信息(如Action、Category)裝入一個Intent對象,然后通過調(diào)用Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把Intent對象以廣播方式發(fā)送出去。當(dāng)Intent發(fā)送以后,所有已經(jīng)注冊的BroadcastReceiver會檢查注冊時的IntentFilter是否與發(fā)送的Intent相匹配,若匹配則就會調(diào)用BroadcastReceiver的onReceive()方法。所以當(dāng)我們定義一個BroadcastReceiver的時候,都需要實現(xiàn)onReceive()方法。注冊BroadcastReceiver有兩種方式:一種方式是,靜態(tài)的在AndroidManifest.xml中用標(biāo)簽生命注冊,并在標(biāo)簽內(nèi)用標(biāo)簽設(shè)置過濾器。另一種方式是,動態(tài)的在代碼中先定義并設(shè)置好一個IntentFilter對象,然后在需要注冊的地方調(diào)Context.registerReceiver()方法,如果取消時就調(diào)用Context.unregisterReceiver()方法。如果用動態(tài)方式注冊的BroadcastReceiver的Context對象被銷毀時,BroadcastReceiver也就自動取消注冊了。另外,若在使用sendBroadcast()的方法是指定了接收權(quán)限,則只有在AndroidManifest.xml中用標(biāo)簽聲明了擁有此權(quán)限的BroascastReceiver才會有可能接收到發(fā)送來的Broadcast。同樣,若在注冊BroadcastReceiver時指定了可接收的Broadcast的權(quán)限,則只有在包內(nèi)的AndroidManifest.xml中用標(biāo)簽聲明了,擁有此權(quán)限的Context對象所發(fā)送的Broadcast才能被這個BroadcastReceiver所接收。動態(tài)注冊:IntentFilterintentFilter=newIntentFilter();intentFilter.addAction(String);--為BroadcastReceiver指定action,使之用于接收同action的廣播registerReceiver(BroadcastReceiver,intentFilter);一般:在onStart中注冊,onStop中取消unregisterReceiver發(fā)送廣播消息:指定廣播目標(biāo)Action:IntentIntent=newIntent(action-String)--指定了此action的receiver會接收此廣播需傳遞參數(shù)(可選)putExtra();發(fā)送:sendBroadcast(Intent);ContentProvider創(chuàng)建ContentProvider:
要創(chuàng)建我們自己的ContentProvider的話,我們需要遵循以下幾步:
1.創(chuàng)建一個繼承了ContentProvider父類的類
2.定義一個名為CONTENT_URI,并且是publicstaticfinal的Uri類型的類變量,你必須為其指定一個唯一的字符串值,最好的方案是以類的全名稱,如:
publicstaticfinalUriCONTENT_URI=Uri.parse(“content://com.google.android.MyContentProvider”);
3.創(chuàng)建你的數(shù)據(jù)存儲系統(tǒng)。大多數(shù)ContentProvider使用Android文件系統(tǒng)或SQLite數(shù)據(jù)庫來保持?jǐn)?shù)據(jù),但是你也可以以任何你想要的方式來存儲。
4.定義你要返回給客戶端的數(shù)據(jù)列名。如果你正在使用Android數(shù)據(jù)庫,則數(shù)據(jù)列的使用方式就和你以往所熟悉的其他數(shù)據(jù)庫一樣。但是,你必須為其定義一個叫_id的列,它用來表示每條記錄的唯一性。
5.如果你要存儲字節(jié)型數(shù)據(jù),比如位圖文件等,那保存該數(shù)據(jù)的數(shù)據(jù)列其實是一個表示實際保存文件的URI字符串,客戶端通過它來讀取對應(yīng)的文件數(shù)據(jù),處理這種數(shù)據(jù)類型的ContentProvider需要實現(xiàn)一個名為_data的字段,_data字段列出了該文件在Android文件系統(tǒng)上的精確路徑。這個字段不僅是供客戶端使用,而且也可以供ContentResolver使用??蛻舳丝梢哉{(diào)用ContentResolver.openOutputStream()方法來處理該URI指向的文件資源,如果是ContentResolver本身的話,由于其持有的權(quán)限比客戶端要高,所以它能直接訪問該數(shù)據(jù)文件。
6.聲明publicstaticString型的變量,用于指定要從游標(biāo)處返回的數(shù)據(jù)列。
7.查詢返回一個Cursor類型的對象。所有執(zhí)行寫操作的方法如insert(),update()以及delete()都將被監(jiān)聽。我們可以通過使用ContentResover().notifyChange()方法來通知監(jiān)聽器關(guān)于數(shù)據(jù)更新的信息。
8.在AndroidMenifest.xml中使用<provider>標(biāo)簽來設(shè)置ContentProvider。
9.如果你要處理的數(shù)據(jù)類型是一種比較新的類型,你就必須先定義一個新的MIME類型,以供ContentProvider.geType(url)來返回。MIME類型有兩種形式:一種是為指定的單個記錄的,還有一種是為多條記錄的。這里給出一種常用的格式:vnd.android.cursor.item/vnd.yourcompanyname.contenttype(單個記錄的MIME類型)
比如,一個請求列車信息的URI如content://com.example.transportationprovider/trains/122可能就會返回typevnd.android.cursor.item/vnd.example.rail這樣一個MIME類型。vnd.android.cursor.dir/vnd.yourcompanyname.contenttype(多個記錄的MIME類型)
比如,一個請求所有列車信息的URI如content://com.example.transportationprovider/trains可能就會返回vnd.android.cursor.dir/vnd.example.rail這樣一個MIME類型。如果后臺的Activity由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)onSaveInstanceState和onRestoreInstanceState在activity被殺掉之前調(diào)用保存每個實例的狀態(tài),以保證該狀態(tài)可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle)(傳入的Bundle參數(shù)是由onSaveInstanceState封裝好的)中恢復(fù)。這個方法在一個activity被殺死前調(diào)用,當(dāng)該activity在將來某個時刻回來時可以恢復(fù)其先前狀態(tài)。例如,如果activityB啟用后位于activityA的前端,在某個時刻activityA因為系統(tǒng)回收資源的問題要被殺掉,A通過onSaveInstanceState將有機會保存其用戶界面狀態(tài),使得將來用戶返回到activityA時能通過onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢復(fù)界面的狀態(tài)。不要將這個方法和activity生命周期回調(diào)如onPause()或onStop()搞混淆了,onPause()在activtiy被放置到背景或者自行銷毀時總會被調(diào)用,onStop()在activity被銷毀時被調(diào)用。一個會調(diào)用onPause()和onStop(),但不觸發(fā)onSaveInstanceState的例子是當(dāng)用戶從activityB返回到activityA時:沒有必要調(diào)用B的onSaveInstanceState(Bundle),此時的B實例永遠不會被恢復(fù),因此系統(tǒng)會避免調(diào)用它。一個調(diào)用onPause()但不調(diào)用onSaveInstanceState的例子是當(dāng)activityB啟動并處在activityA的前端:如果在B的整個生命周期里A的用戶界面狀態(tài)都沒有被破壞的話,系統(tǒng)是不會調(diào)用activityA的onSaveInstanceState(Bundle)的。默認(rèn)的實現(xiàn)負(fù)責(zé)了大部分UI實例狀態(tài)(的保存),采用的方式是調(diào)用UI層上每個擁有id的view的onSaveInstanceState(),并且保存當(dāng)前獲得焦點的view的id(所有保存的狀態(tài)信息都會在默認(rèn)的onRestoreInstanceState(Bundle)實現(xiàn)中恢復(fù))。如果你覆寫這個方法來保存額外的沒有被各個view保存的信息,你可能想要在默認(rèn)實現(xiàn)過程中調(diào)用或者自己保存每個視圖的所有狀態(tài)。如果被調(diào)用,這個方法會在onStop()前被觸發(fā),但系統(tǒng)并不保證是否在onPause()之前或者之后觸發(fā)。AndroidcallsonSaveInstanceState()beforetheactivitybecomesvulnerabletobeingdestroyedbythesystem,butdoesnotbothercallingitwhentheinstanceisactuallybeingdestroyedbyauseraction(suchaspressingtheBACKkey)從這句話可以知道,當(dāng)某個activity變得“容易”被系統(tǒng)銷毀時,該activity的onSaveInstanceState就會被執(zhí)行,除非該activity是被用戶主動銷毀的,例如當(dāng)用戶按BACK鍵的時候。注意上面的雙引號,何為“容易”?言下之意就是該activity還沒有被銷毀,而僅僅是一種可能性。這種可能性有哪些?通過重寫一個activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我們可以清楚地知道當(dāng)某個activity(假定為activityA)顯示在當(dāng)前task的最上層時,其onSaveInstanceState方法會在什么時候被執(zhí)行,有這么幾種情況:
1、當(dāng)用戶按下HOME鍵時。這是顯而易見的,系統(tǒng)不知道你按下HOME后要運行多少其他的程序,自然也不知道activityA是否會被銷毀,故系統(tǒng)會調(diào)用onSaveInstanceState,讓用戶有機會保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則
2、長按HOME鍵,選擇運行其他的程序時。
3、按下電源按鍵(關(guān)閉屏幕顯示)時。
4、從activityA中啟動一個新的activity時。
5、屏幕方向切換時,例如從豎屏切換到橫屏?xí)r。在屏幕切換之前,系統(tǒng)會銷毀activityA,在屏幕切換之后系統(tǒng)又會自動地創(chuàng)建activityA,所以onSaveInstanceState一定會被執(zhí)行總而言之,onSaveInstanceState的調(diào)用遵循一個重要原則,即當(dāng)系統(tǒng)“未經(jīng)你許可”時銷毀了你的activity,則onSaveInstanceState會被系統(tǒng)調(diào)用,這是系統(tǒng)的責(zé)任,因為它必須要提供一個機會讓你保存你的數(shù)據(jù)(當(dāng)然你不保存那就隨便你了)。
至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調(diào)用的,onRestoreInstanceState被調(diào)用的前提是,activityA“確實”被系統(tǒng)銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調(diào)用,例如,當(dāng)正在顯示activityA的時候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到activityA,這種情況下activityA一般不會因為內(nèi)存的原因被系統(tǒng)銷毀,故activityA的onRestoreInstanceState方法不會被執(zhí)行
另外,onRestoreInstanceState的bundle參數(shù)也會傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數(shù)據(jù)還原橫豎屏切換時候activity的生命周期
不設(shè)置Activity的android:configChanges時:模擬器這種情況切屏?xí)匦抡{(diào)用各個生命周期,切橫屏?xí)r會生命周期執(zhí)行一次,切豎屏?xí)r生命周期會執(zhí)行兩次,且橫豎屏onConfigurationChanged未被調(diào)用。但是在HTCDESIREHD(G10)這款手機上測試結(jié)果為:生命周期都只執(zhí)行一次,且橫豎屏onConfigurationChanged未被調(diào)用。設(shè)置Activity的android:configChanges="orientation"時:模擬器這種情況切屏還是會重新調(diào)用各個生命周期,切橫屏onConfigurationChanged未執(zhí)行、豎屏?xí)ronConfigurationChanged執(zhí)行1次。但是在HTCDESIREHD(G10)這款手機上測試結(jié)果為:生命周期未發(fā)生變化,且橫豎屏onConfigurationChanged都只執(zhí)行一次。設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時:模擬器這種情況切屏不會重新調(diào)用各個生命周期,切橫屏?xí)ronConfigurationChanged會執(zhí)行1次,切豎屏?xí)ronConfigurationChanged方法調(diào)用2次。但是在HTCDESIREHD(G10)這款手機上測試結(jié)果為:橫豎屏onConfigurationChanged都只執(zhí)行一次。android中的動畫有哪幾類,它們的特點和區(qū)別是什么
兩種:一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現(xiàn)方式可以使視圖組件移動、放大、縮小以及產(chǎn)生透明度的變化;另一種Frame動畫,傳統(tǒng)的動畫方法,通過順序的播放排列好的圖片來實現(xiàn),類似電影。對多線程的運用和理解,及多線程之間handle的傳值;handler機制的原理
Android開發(fā)過程中為什么要線程呢?我們創(chuàng)建的Service、Activity以及Broadcast均是一個主線程處理,這里我們可以理解為UI線程。但是在操作一些耗時操作時,比如I/O讀寫的大文件讀寫,數(shù)據(jù)庫操作以及網(wǎng)絡(luò)下載需要很長時間,為了不阻塞用戶界面,出現(xiàn)ANR的響應(yīng)提示窗口,這個時候我們可以考慮使用Thread線程來解決。Android中使用Thread線程會遇到哪些問題?對于從事過J2ME開發(fā)的程序員來說Thread比較簡單,直接匿名創(chuàng)建重寫run方法,調(diào)用start方法執(zhí)行即可。或者從Runnable接口繼承,但對于Android平臺來說UI控件都沒有設(shè)計成為線程安全類型,所以需要引入一些同步的機制來使其刷新,這點Google在設(shè)計Android時倒是參考了下Win32的消息處理機制。1.對于線程中的刷新一個View為基類的界面,可以使用postInvalidate()方法在線程中來處理,其中還提供了一些重寫方法比如postInvalidate(intleft,inttop,intright,intbottom)來刷新一個矩形區(qū)域,以及延時執(zhí)行,比如postInvalidateDelayed(longdelayMilliseconds)或postInvalidateDelayed(longdelayMilliseconds,intleft,inttop,intright,intbottom)方法,2.當(dāng)然推薦的方法是通過一個Handler來處理這些,可以在一個線程的run方法中調(diào)用handler對象的postMessage或sendMessage方法來實現(xiàn),Android程序內(nèi)部維護著一個消息隊列,會輪訓(xùn)處理這些,如果你是Win32程序員可以很好理解這些消息處理,不過相對于Android來說沒有提供PreTranslateMessage這些干涉內(nèi)部的方法。3.Looper又是什么呢?,其實Android中每一個Thread都跟著一個Looper,Looper可以幫助Thread維護一個消息隊列,昨天的問題\o"Can'tcreatehandlerinsidethread錯誤"Can'tcreatehandlerinsidethread錯誤一文中提到這一概念,但是Looper和Handler沒有什么關(guān)系,我們從開源的代碼可以看到Android還提供了一個Thread繼承類HanderThread可以幫助我們處理,在HandlerThread對象中可以通過getLooper方法獲取一個Looper對象控制句柄,我們可以將其這個Looper對象映射到一個Handler中去來實現(xiàn)一個線程同步機制,Looper對象的執(zhí)行需要初始化Looper.prepare方法就是昨天我們看到的問題,同時推出時還要釋放資源,使用Looper.release方法。4.Message在Android是什么呢?對于Android中Handler可以傳遞一些內(nèi)容,通過Bundle對象可以封裝String、Integer以及Blob二進制對象,我們通過在線程中使用Handler對象的sendEmptyMessage或sendMessage方法來傳遞一個Bundle對象到Handler處理器。對于Handler類提供了重寫方法handleMessage(Messagemsg)來判斷,通過msg.what來區(qū)分每條信息。將Bundle解包來實現(xiàn)Handler類更新UI線程中的內(nèi)容實現(xiàn)控件的刷新操作。5.java.util.concurrent對象分析,對于過去從事Java開發(fā)的程序員不會對Concurrent對象感到陌生吧,他是JDK1.5以后新增的重要特性作為掌上設(shè)備,我們不提倡使用該類,考慮到Android為我們已經(jīng)設(shè)計好的Task機制,我們這里Android開發(fā)網(wǎng)對其不做過多的贅述,相關(guān)原因參考下面的介紹:6.在Android中還提供了一種有別于線程的處理方式,就是Task以及AsyncTask,從開源代碼中可以看到是針對Concurrent的封裝,開發(fā)人員可以方便的處理這些異步任務(wù),具體的Android123在以前的文章中有詳細(xì)解釋,可以使用站內(nèi)搜索來了解更多。說說在android中有哪幾種數(shù)據(jù)存儲方式
1.SharedPreferences方式2.文件存儲方式3.SQLite數(shù)據(jù)庫方式4.內(nèi)容提供器(Contentprovider)方式android中有哪幾種解析xml的類,以及它們的原理和區(qū)別
SimpleAPIforXML(SAX)、DocumentObjectModel(DOM)和Android附帶的pull解析器解析XML文件SAX:是一個用于處理XML事件驅(qū)動的“推”模型,優(yōu)點是一種解析速度快并且占用內(nèi)存少的xml解析器,它需要哪些數(shù)據(jù)再加載和解析哪些內(nèi)容。缺點是它不會記錄標(biāo)簽的關(guān)系,而要讓你的應(yīng)用程序自己處理,這樣就增加了你程序的負(fù)擔(dān)。DOM:DOM解析XML文件時,會將XML文件的所有內(nèi)容以對象樹方式存放在內(nèi)存中,然后允許您使用DOMAPI遍歷XML樹、檢索所需的數(shù)據(jù)。使用DOM操作XML的代碼看起來比較直觀,并且,在某些方面比基于SAX的實現(xiàn)更加簡單。但是,因為DOM需要將XML文件的所有內(nèi)容以對象樹方式存放在內(nèi)存中,所以內(nèi)存的消耗比較大,特別對于運行Android的移動設(shè)備來說PULL:Pull解析和Sax解析很相似,Pull解析和Sax解析不一樣的地方是pull讀取xml文件后觸發(fā)相應(yīng)的事件調(diào)用方法返回的是數(shù)字還有pull可以在程序中控制想解析到哪里就可以停止解析。如何將一個Activity設(shè)置成窗口的樣式。在AndroidManifest.xml中定義Activity的地方一句話:android:theme="@android:style/Theme.Dialog"或android:theme="@android:style/Theme.Translucent"就變成半透明的請介紹下Android中常用的五種布局。FrameLayout:最簡單的一個布局對象。它被定制為你屏幕上的一個空白備用區(qū)域,之后你可以在其中填充一個單一對象—比如,一張你要發(fā)布的圖片。所有的子元素將會固定在屏幕的左上角;你不能為FrameLayout中的一個子元素指定一個位置。后一個子元素將會直接在前一個子元素之上進行覆蓋填充,把它們部份或全部擋?。ǔ呛笠粋€子元素是透明的)。LinearLayout:以你為它設(shè)置的垂直或水平的屬性值,來排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一個垂直列表的每一行只會有一個元素,而不管他們有多寬,而一個水平列表將會只有一個行高(高度為最高子元素的高度加上邊框高度)。LinearLayout保持子元素之間的間隔以及互相對齊(相對一個元素的右對齊、中間對齊或者左對齊)。LinearLayout還支持為單獨的子元素指定weight。好處就是允許子元素可以填充屏幕上的剩余空間。這也避免了在一個大屏幕中,一串小對象擠成一堆的情況,而是允許他們放大填充空白。子元素指定一個weight值,剩余的空間就會按這些子元素指定的weight比例分配給這些子元素。默認(rèn)的weight值為0。例如,如果有三個文本框,其中兩個指定了weight值為1,那么,這兩個文本框?qū)⒌缺壤胤糯螅⑻顫M剩余的空間,而第三個文本框不會放大。AbsoluteLayout:可以讓子元素指定準(zhǔn)確的x/y坐標(biāo)值,并顯示在屏幕上。(0,0)為左上角,當(dāng)向下或向右移動時,坐標(biāo)值將變大。AbsoluteLayout沒有頁邊框,允許元素之間互相重疊(盡管不推薦)。我們通常不推薦使用AbsoluteLayout,除非你有正當(dāng)理由要使用它,因為它使界面代碼太過剛性,以至于在不同的設(shè)備上可能不能很好地工作。RelativeLayout:RelativeLayout允許子元素指定他們相對于其它元素或父元素的位置(通過ID指定)。因此,你可以以右對齊,或上下,或置于屏幕中央的形式來排列兩個元素。元素按順序排列,因此如果第一個元素在屏幕的中央,那么相對于這個元素的其它元素將以屏幕中央的相對位置來排列。如果使用XML來指定這個layout,在你定義它之前,被關(guān)聯(lián)的元素必須定義。TableLayout:TableLayout將子元素的位置分配到行或列中。一個TableLayout由許多的TableRow組成,每個TableRow都會定義一個row(事實上,你可以定義其它的子對象,這在下面會解釋到)。TableLayout容器不會顯示row、cloumns或cell的邊框線。每個row擁有0個或多個的cell;每個cell擁有一個View對象。表格由列和行組成許多的單元格。表格允許單元格為空。單元格不能跨列,這與HTML中的不一樣。AIDL的全稱是什么?如何工作?能處理哪些類型的數(shù)據(jù)?Android接口定義語言AIDL(AndroidInterfaceDefinitionLanguage)技術(shù):1、把Service中針對MediaPlayer的操作封裝成一個接口(.aidl文件)
2、在Service中建個子類實現(xiàn)這接口的存根(stub)對象
3、并在onBind()方法中返回這個存根對象。
4、在Activity中使用綁定服務(wù)的方式連接Service,但是不用Intent來傳遞信息,而是在ServiceConnection的onServiceConnected方法里,獲得Service中Stub對象的客戶端使用代理。我們通過操作Activity中的代理就可以達到操作Service中的MediaPlayer對象的目的。這樣我們就可以想用本地對象一樣操作Service中的對象了,那么進度條一類的需求自然也就迎刃而解。AIDL服務(wù)只支持有限的數(shù)據(jù)類型,因此,如果用AIDL服務(wù)傳遞一些復(fù)雜的數(shù)據(jù)就需要做更一步處理。AIDL服務(wù)支持的數(shù)據(jù)類型如下:Java的簡單類型(int、char、boolean等)。不需要導(dǎo)入(import)。String和CharSequence。不需要導(dǎo)入(import)。List和Map。但要注意,List和Map對象的元素類型必須是AIDL服務(wù)支持的數(shù)據(jù)類型。不需要導(dǎo)入(import)。AIDL自動生成的接口。需要導(dǎo)入(import)。實現(xiàn)android.os.Parcelable接口的類。需要導(dǎo)入(import)。其中后兩種數(shù)據(jù)類型需要使用import進行導(dǎo)入。系統(tǒng)上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由。Intentintent=newIntent();intent.setClassName("com.uc.browser","com.uc.browser.ActivityUpdate");intent.setAction(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setData(Uri.parse(visitUrl));startActivity(intent);理由:在action賦值為”ent.action.VIEW“時可接收如下scheme為"http"等等類型的data。所以突發(fā)奇想,啟動該程序后,指定action及Uri,即訪問指定網(wǎng)頁。Android數(shù)字簽名Android數(shù)字簽名在Android系統(tǒng)中,所有安裝到系統(tǒng)的應(yīng)用程序都必有一個數(shù)字證書,此數(shù)字證書用于標(biāo)識應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,如果一個permission的protectionLevel為signature,那么就只有那些跟該permission所在的程序擁有同一個數(shù)字證書的應(yīng)用程序才能取得該權(quán)限。Android使用Java的數(shù)字證書相關(guān)的機制來給apk加蓋數(shù)字證書,要理解android的數(shù)字證書,需要先了解以下數(shù)字證書的概念和java的數(shù)字證書機制。Android系統(tǒng)要求每一個安裝進系統(tǒng)的應(yīng)用程序都是經(jīng)過數(shù)字證書簽名的,數(shù)字證書的私鑰則保存在程序開發(fā)者的手中。Android將數(shù)字證書用來標(biāo)識應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,不是用來決定最終用戶可以安裝哪些應(yīng)用程序。這個數(shù)字證書并不需要權(quán)威的數(shù)字證書簽名機構(gòu)認(rèn)證,它只是用來讓應(yīng)用程序包自我認(rèn)證的。同一個開發(fā)者的多個程序盡可能使用同一個數(shù)字證書,這可以帶來以下好處。(1)有利于程序升級,當(dāng)新版程序和舊版程序的數(shù)字證書相同時,Android系統(tǒng)才會認(rèn)為這兩個程序是同一個程序的不同版本。如果新版程序和舊版程序的數(shù)字證書不相同,則Android系統(tǒng)認(rèn)為他們是不同的程序,并產(chǎn)生沖突,會要求新程序更改包名。(2)有利于程序的模塊化設(shè)計和開發(fā)。Android系統(tǒng)允許擁有同一個數(shù)字簽名的程序運行在一個進程中,Android程序會將他們視為同一個程序。所以開發(fā)者可以將自己的程序分模塊開發(fā),而用戶只需要在需要的時候下載適當(dāng)?shù)哪K。(3)可以通過權(quán)限(permission)的方式在多個程序間共享數(shù)據(jù)和代碼。Android提供了基于數(shù)字證書的權(quán)限賦予機制,應(yīng)用程序可以和其他的程序共享概功能或者數(shù)據(jù)給那那些與自己擁有相同數(shù)字證書的程序。如果某個權(quán)限(permission)的protectionLevel是signature,則這個權(quán)限就只能授予那些跟該權(quán)限所在的包擁有同一個數(shù)字證書的程序。在簽名時,需要考慮數(shù)字證書的有效期:(1)數(shù)字證書的有效期要包含程序的預(yù)計生命周期,一旦數(shù)字證書失效,持有改數(shù)字證書的程序?qū)⒉荒苷I墶?2)如果多個程序使用同一個數(shù)字證書,則該數(shù)字證書的有效期要包含所有程序的預(yù)計生命周期。(3)AndroidMarket強制要求所有應(yīng)用程序數(shù)字證書的有效期要持續(xù)到2033年10月22日以后。Android數(shù)字證書包含以下幾個要點:(1)所有的應(yīng)用程序都必須有數(shù)字證書,Android系統(tǒng)不會安裝一個沒有數(shù)字證書的應(yīng)用程序(2)Android程序包使用的數(shù)字證書可以是自簽名的,不需要一個權(quán)威的數(shù)字證書機構(gòu)簽名認(rèn)證(3)如果要正式發(fā)布一個Android,必須使用一個合適的私鑰生成的數(shù)字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調(diào)試證書來發(fā)布。(4)數(shù)字證書都是有有效期的,Android只是在應(yīng)用程序安裝的時候才會檢查證書的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書過期
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 返校出行安全知識培訓(xùn)課件
- 新高一化學(xué)暑假銜接(人教版):第14講 鐵的氫氧化物和鐵鹽、亞鐵鹽【學(xué)生版】
- 市場體系人才盤點測試題及答案
- 車隊安全消防培訓(xùn)課程課件
- 煤礦人員定位系統(tǒng)方案
- 車間設(shè)備安全培訓(xùn)心得課件
- (新)后續(xù)服務(wù)承諾及保證措施(3篇)
- 2025年遠程醫(yī)療研究報告
- 銀行合規(guī)管理制度實施難點
- 車間班組安全培訓(xùn)教材課件
- 食堂2023年工作總結(jié)及2024年工作計劃(匯報課件)
- HG/T 6312-2024 化工園區(qū)競爭力評價導(dǎo)則(正式版)
- 小學(xué)數(shù)學(xué)低年級學(xué)生學(xué)情分析
- 水利水電工程建設(shè)用地設(shè)計標(biāo)準(zhǔn)(征求意見稿)
- 供電一把手講安全課
- 本科實習(xí)男護生職業(yè)認(rèn)同感調(diào)查及影響因素分析
- T-GDWCA 0035-2018 HDMI 連接線標(biāo)準(zhǔn)規(guī)范
- 合肥機床行業(yè)現(xiàn)狀分析
- 無人機裝調(diào)檢修工培訓(xùn)計劃及大綱
- 國家開放大學(xué)《森林保護》形考任務(wù)1-4參考答案
- GB 31604.1-2023食品安全國家標(biāo)準(zhǔn)食品接觸材料及制品遷移試驗通則
評論
0/150
提交評論