第一篇:Android之a(chǎn)ctivity總結(jié)
Android之Activity總結(jié)
一、什么是Activity
Activity 是用戶接口程序,原則上它會(huì)提供給用戶一個(gè)交互式的接口功能。它是 android 應(yīng)用程序的基本功能單元。Activity 本身是沒(méi)有界面的。所以activity類創(chuàng)建了一個(gè)窗口,開(kāi)發(fā)人員可以通過(guò)setContentView(View)接口把UI放到activity創(chuàng)建的窗口上,當(dāng)activity指向全屏窗口時(shí),也可以用其他方式實(shí)現(xiàn):作為漂浮窗口(通過(guò)windowIsFloating的主題集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是單獨(dú)的,用于處理用戶操作。幾乎所有的activity都要和用戶打交道
二、Activity生命周期(生命周期方法)
由圖可知,這些方法調(diào)用的順序:
1.Activity正常啟動(dòng):onCreate-> onStart-> onResume;
2.Activity被殺掉:onPause-> onStop-> onDestroy,此為一個(gè)完整的生命周期。3.中斷處理:onPause-> onStop,恢復(fù)時(shí)onRestart-> onStart-> onResume;
4.如果當(dāng)前Activity是半透明狀態(tài)或者對(duì)話框狀態(tài):那么中斷就是onPause ,恢復(fù)的時(shí)候onResume。
那么對(duì)于”O(jiān)ther app need memory”,就是我們手機(jī)在運(yùn)行一個(gè)應(yīng)用程序的時(shí)候,有可能打進(jìn)來(lái)電話發(fā)進(jìn)來(lái)短信,或者沒(méi)有電了,這時(shí)候程序都會(huì)被中斷,優(yōu)先去服務(wù)電話的基本功能,另外系統(tǒng)也不允許你占用太多資源,至少要保證一些功能(比如電話),所以資源不足的時(shí)候也就有可能被kill掉。
方法在系統(tǒng)中的作用及我們應(yīng)該做什么:
onCreate(創(chuàng)建):在這里創(chuàng)建界面,做一些數(shù)據(jù)的初始化工作;
onStart(可視狀態(tài)): 到這一步變成“用戶可見(jiàn)不可交互”的狀態(tài);
onResume(可交互狀態(tài)):變成和用戶可交互的,(在Activity棧系統(tǒng)通過(guò)棧的方式管理這些Activity,即當(dāng)前Activity在棧的最上端,運(yùn)行完彈出棧,則回到上一個(gè)Activity);
onPause(暫停狀態(tài)):到這一步是可見(jiàn)但不可交互的,系統(tǒng)會(huì)停止動(dòng)畫(huà)等消耗CPU的事情。從上文的描述已經(jīng)知道,應(yīng)該在這里保存你的一些數(shù)據(jù),因?yàn)檫@個(gè)時(shí)候你的程序的優(yōu)先級(jí)降
低,有可能被系統(tǒng)收回。在這里保存的數(shù)據(jù),應(yīng)該在onResume里讀出來(lái)。
OnStop(停止?fàn)顟B(tài)):變得不可見(jiàn),被下一個(gè)activity覆蓋了。
onDestroy(殺死):這是Activity被kill前最后一個(gè)被調(diào)用方法了,可能是其他類調(diào)用finish方法或者是系統(tǒng)為了節(jié)省空間將它暫時(shí)性的干掉。
onPause,onstop,onDestroy,三種狀態(tài)下 activity都有可能被系統(tǒng)殺掉。
Activity棧:Activity以棧的形式進(jìn)行管理,后進(jìn)先出的原則
三、Activity之間的通信
在 Android 中,不同的 Activity 實(shí)例可能運(yùn)行在一個(gè)進(jìn)程中,也可能運(yùn)行在不同的進(jìn)程中。因此我們需要一種特別的機(jī)制幫助我們?cè)?Activity 之間傳遞消息。
Android 中通過(guò) Intent 對(duì)象來(lái)表示一條消息,一個(gè) Intent 對(duì)象不僅包含有這個(gè)消息的目的地,還可以包含消息的內(nèi)容,這好比一封 Email,其中不僅應(yīng)該包含收件地址,還可以包含具體的內(nèi)容。
Intent是一種運(yùn)行時(shí)綁定(runtime binding)機(jī)制
Intent負(fù)責(zé)對(duì)操作的動(dòng)作、動(dòng)作涉及數(shù)據(jù)、附加數(shù)據(jù)進(jìn)行描述,Android則根據(jù)此Intent的描述,負(fù)責(zé)找到對(duì)應(yīng)的組件,將 Intent傳遞給調(diào)用的組件,并完成組件的調(diào)用。因此,Intent在這里起著一個(gè)媒體中介的作用,專門(mén)提供組件互相調(diào)用的相關(guān)信息,實(shí)現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。
在應(yīng)用中,我們可以以兩種形式來(lái)使用Intent:
直接Intent(應(yīng)用程序內(nèi)部):指定了component(組建)屬性的Intent。通過(guò)指定具體的組件類,通知應(yīng)用啟動(dòng)對(duì)應(yīng)的組件。
間接Intent(應(yīng)用程序之間):沒(méi)有指定comonent屬性的Intent。這些Intent需要包含足夠的信息,這樣系統(tǒng)才能根據(jù)這些信息,在在所有的可用組件中,確定滿足此Intent的組件。
對(duì)于直接Intent,Android不需要去做解析,因?yàn)槟繕?biāo)組件已經(jīng)很明確。
Android需要解析的是那些間接Intent,通過(guò)解析,將 Intent映射給可以處理此Intent的Activity、IntentReceiver或Service。Intent解析機(jī)制主要是通過(guò)查找已注冊(cè)在AndroidManifest.xml(清單)中的所有IntentFilter(意圖過(guò)濾器)及其中定義的Intent,最終找到匹配的Intent。
橫屏?xí)r:onConfigurationChanged(配置改變))
橫屏以及出現(xiàn)鍵盤(pán)鍵盤(pán)時(shí)生命周期部重新開(kāi)始的方法: KeyboardHidHidden/orientation/screenSize 橫屏顯示:landscape 豎屏顯示:portrait
四大組建:activity:活動(dòng)、service:服務(wù)、content provider:內(nèi)容提供商、broadcast receiver:廣播收音機(jī)
Activity的所有面試題
什么是Activity? 請(qǐng)描述一下Activity 生命周期?
兩個(gè)Activity之間跳轉(zhuǎn)時(shí)必然會(huì)執(zhí)行的是哪幾個(gè)方法?
你后臺(tái)的Activity被系統(tǒng) 回收怎么辦?如果后臺(tái)的Activity由于某原因被系統(tǒng)回收可了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?
如何退出Activity?如何安全退出已調(diào)用多個(gè)Activity的Application? 兩個(gè)Activity之間怎么傳遞數(shù)據(jù)?
第二篇:Android之a(chǎn)ctivity總結(jié)——轉(zhuǎn)自論壇
Android之a(chǎn)ctivity總結(jié)——轉(zhuǎn)自論壇
一、什么是activity Activity 是用戶接口程序,原則上它會(huì)提供給用戶一個(gè)交互式的接口功能。它是 android 應(yīng)用程序的基本功能單元。Activity 本身是沒(méi)有界面的。所以activity類創(chuàng)建了一個(gè)窗口,開(kāi)發(fā)人員可以通過(guò)setContentView(View)接口把UI放到activity創(chuàng)建的窗口上,當(dāng)activity指向全屏窗口時(shí),也可以用其他方式實(shí)現(xiàn):作為漂浮窗口(通過(guò)windowIsFloating的主題集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是單獨(dú)的,用于處理用戶操作。幾乎所有的activity都要和用戶打交道,二、activity生命周期
2011-11-20 20:23:32 上傳 下載附件(64.6 KB)由圖可知:
在一個(gè)Activity正常啟動(dòng)過(guò)程中,這些方法調(diào)用的順序是onCreate-> onStart-> onResume;在Activity被kill掉的時(shí)候方法順序是onPause-> onStop-> onDestroy,此為一個(gè)完整的Lifecycle。那么對(duì)于中斷處理(比如電話來(lái)了),則是onPause-> onStop,恢復(fù)時(shí)onStart-> onResume;如果當(dāng)前應(yīng)用程序的是一個(gè)Theme為T(mén)ranslucent(半透明)或者Dialog 的Activity那么中斷就是onPause ,恢復(fù)的時(shí)候onResume。
那么對(duì)于”O(jiān)ther app need memory”,就是我們手機(jī)在運(yùn)行一個(gè)應(yīng)用程序的時(shí)候,有可能打進(jìn)來(lái)電話發(fā)進(jìn)來(lái)短信,或者沒(méi)有電了,這時(shí)候程序都會(huì)被中斷,優(yōu)先去服務(wù)電話的基本功能,另外系統(tǒng)也不允許你占用太多資源,至少要保證一些功能(比如電話),所以資源不足的時(shí)候也就有可能被kill掉。方法在系統(tǒng)中的作用及我們應(yīng)該做什么:
onCreate:在這里創(chuàng)建界面,做一些數(shù)據(jù)的初始化工作;
onStart: 到這一步變成“用戶可見(jiàn)不可交互”的狀態(tài);
onResume:變成和用戶可交互的,(在Activity棧系統(tǒng)通過(guò)棧的方式管理這些Activity,即當(dāng)前Activity在棧的最上端,運(yùn)行完彈出棧,則回到上一個(gè)Activity);
onPause:到這一步是可見(jiàn)但不可交互的,系統(tǒng)會(huì)停止動(dòng)畫(huà)等消耗CPU的事情。從上文的描述已經(jīng)知道,應(yīng)該在這里保存你的一些數(shù)據(jù),因?yàn)檫@個(gè)時(shí)候你的程序的優(yōu)先級(jí)降
低,有可能被系統(tǒng)收回。在這里保存的數(shù)據(jù),應(yīng)該在onResume里讀出來(lái)。
onStop:變得不可見(jiàn),被下一個(gè)activity覆蓋了
onDestroy:這是Activity被kill前最后一個(gè)被調(diào)用方法了,可能是其他類調(diào)用finish方法或者是系統(tǒng)為了節(jié)省空間將它暫時(shí)性的干掉,可以用isFinishing()來(lái)判斷它,如果你有
一個(gè)Progress Dialog在線程中運(yùn)行,請(qǐng)?jiān)趏nDestroy里把他cancel掉,不然等線程結(jié)束的時(shí)候,調(diào)用Dialog的cancel方法會(huì)拋異常。
onPause,onstop,onDestroy,三種狀態(tài)下 activity都有可能被系統(tǒng)kill 掉。
三、Activity之間的通信
在 Android 中,不同的 Activity 實(shí)例可能運(yùn)行在一個(gè)進(jìn)程中,也可能運(yùn)行在不同的進(jìn)程中。因此我們需要一種特別的機(jī)制幫助我們?cè)?Activity 之間傳遞消息。Android 中通過(guò) Intent 對(duì)象來(lái)表示一條消息,一個(gè) Intent 對(duì)象不僅包含有這個(gè)消息的目的地,還可以包含消息的內(nèi)容,這好比一封 Email,其中不僅應(yīng)該包含收件地址,還可以包含具體的內(nèi)容。對(duì)于一個(gè) Intent 對(duì)象,消息“目的地”是必須的,而內(nèi)容則是可選項(xiàng)。
Intent負(fù)責(zé)對(duì)操作的動(dòng)作、動(dòng)作涉及數(shù)據(jù)、附加數(shù)據(jù)進(jìn)行描述,Android則根據(jù)此Intent的描述,負(fù)責(zé)找到對(duì)應(yīng)的組件,將 Intent傳遞給調(diào)用的組件,并完成組件的調(diào)用。因此,Intent在這里起著一個(gè)媒體中介的作用,專門(mén)提供組件互相調(diào)用的相關(guān)信息,實(shí)現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。
在應(yīng)用中,我們可以以兩種形式來(lái)使用Intent:
直接Intent:指定了component屬性的Intent(調(diào)用setComponent(ComponentName)或者setClass(Context, Class)來(lái)指定)。通過(guò)指定具體的組件類,通知應(yīng)用啟動(dòng)對(duì)應(yīng)的組件。
間接Intent:沒(méi)有指定comonent屬性的Intent。這些Intent需要包含足夠的信息,這樣系統(tǒng)才能根據(jù)這些信息,在在所有的可用組件中,確定滿足此Intent的組件。對(duì)于直接Intent,Android不需要去做解析,因?yàn)槟繕?biāo)組件已經(jīng)很明確。
Android需要解析的是那些間接Intent,通過(guò)解析,將 Intent映射給可以處理此Intent的Activity、IntentReceiver或Service。Intent解析機(jī)制主要是通過(guò)查找已注冊(cè)在AndroidManifest.xml中的所有IntentFilter及其中定義的Intent,最終找到匹配的Intent。
四、Activity 的 Intent Filter
Intent Filter 描述了一個(gè)組件愿意接收什么樣的 Intent 對(duì)象,Android 將其抽象為 android.content.IntentFilter 類。在 Android 的 AndroidManifest.xml 配置文件中可以通過(guò)
當(dāng)使用 startActivity(intent)來(lái)啟動(dòng)另外一個(gè) Activity 時(shí),如果直接指定 intent 對(duì)象的 Component 屬性,那么 Activity Manager 將試圖啟動(dòng)其 Component 屬性指定的 Activity。否則 Android 將通過(guò) Intent 的其它屬性從安裝在系統(tǒng)中的所有 Activity 中查找與之最匹配的一個(gè)啟動(dòng),如果沒(méi)有找到合適的 Activity,應(yīng)用程序會(huì)得到一個(gè)系統(tǒng)拋出的異常。這個(gè)匹配的過(guò)程如下:
2011-11-20 20:23:59 上傳 下載附件(16.72 KB)
五、Activity的棧式管理
Android針對(duì)Activity的管理使用的是棧,就是說(shuō)某一個(gè)時(shí)刻只有一個(gè)Activity處在棧頂,當(dāng)這個(gè)Activity被銷毀后,下面的Activity才有可能浮到棧頂,或者有一個(gè)新的Activity被創(chuàng)建出來(lái),則舊的Activity就被壓棧沉下去了。Activity是Android程序的表現(xiàn)層。程序的每一個(gè)顯示屏幕就是一個(gè)Activity。正在運(yùn)行的Activity處在棧的最頂端,它是運(yùn)行狀態(tài)的。
2011-11-20 20:26:09 上傳 下載附件(23.43 KB)
當(dāng)在程序中調(diào)用 Activity.finish()方法時(shí),結(jié)果和用戶按下 BACK 鍵一樣:它告訴
Activity Manager該Activity實(shí)例可以被“回收”。隨后 Activity Manager 激活處于棧第二層的 Activity,把原 Activity 壓入到棧的第二層,從 Running 狀態(tài)轉(zhuǎn)到 Paused 狀態(tài)。
六、Activity的加載模式standard、singleTop、singleTask、singleInstance(其中前兩個(gè)是一組、后兩個(gè)是一組),默認(rèn)為standard standard:就是intent將發(fā)送給新的實(shí)例,所以每次跳轉(zhuǎn)都會(huì)生成新的activity。singleTop:也是發(fā)送新的實(shí)例,但不同standard的一點(diǎn)是,在請(qǐng)求的Activity正好位于棧頂時(shí)(配置成singleTop的Activity),不會(huì)構(gòu)造新的實(shí)例singleTask:和后面的singleInstance都只創(chuàng)建一個(gè)實(shí)例,當(dāng)intent到來(lái),需要?jiǎng)?chuàng)建設(shè)置為singleTask的Activity的時(shí)候,系統(tǒng)會(huì)檢查棧里面是否已經(jīng)有該Activity的實(shí)例。如果有直接將intent發(fā)送給它。singleInstance:首先說(shuō)明一下task這個(gè)概念,Task可以認(rèn)為是一個(gè)棧,可放入多個(gè)Activity。比如啟動(dòng)一個(gè)應(yīng)用,那么Android就創(chuàng)建了一個(gè)Task,然后啟動(dòng)這個(gè)應(yīng)用的入口Activity,那在它的界面上調(diào)用其他的Activity也只是在這個(gè)task里面。那如果在多個(gè)task中共享一個(gè)Activity的話怎么辦呢。舉個(gè)例來(lái)說(shuō),如果開(kāi)啟一個(gè)導(dǎo)游服務(wù)類的應(yīng)用程序,里面有個(gè)Activity是開(kāi)啟GOOGLE地圖的,當(dāng)按下home鍵退回到主菜單又啟動(dòng)GOOGLE地圖的應(yīng)用時(shí),顯示的就是剛才的地圖,實(shí)際上是同一個(gè)Activity,實(shí)際上這就引入了singleInstance。singleInstance模式就是將該Activity單獨(dú)放入一個(gè)棧中,這樣這個(gè)棧中只有這一個(gè)Activity,不同應(yīng)用的intent都由這個(gè)Activity接收和展示,這樣就做到了共享。當(dāng)然前提是這些應(yīng)用都沒(méi)有被銷毀,所以剛才是按下的HOME鍵,如果按下了返回鍵,則無(wú)效。
七、Activity的跳轉(zhuǎn)Activity跳轉(zhuǎn),無(wú)返回結(jié)果 這是最簡(jiǎn)單的Activity跳轉(zhuǎn)方式。從一個(gè)Activity啟動(dòng)另一個(gè)Activity,直接startActivity(new Intent(當(dāng)前Activity.this, 下一Activity.class))。
Activity跳轉(zhuǎn),返回?cái)?shù)據(jù)/結(jié)果 需要返回?cái)?shù)據(jù)或結(jié)果的,則使用startActivityForResult(Intent intent, int requestCode),requestCode的值是自定義的,用于識(shí)別跳轉(zhuǎn)的目標(biāo)Activity。跳轉(zhuǎn)的目標(biāo)Activity所要做的就是返回?cái)?shù)據(jù)/結(jié)果,setResult(int resultCode)只返回結(jié)果不帶數(shù)據(jù),或者setResult(int resultCode, Intent data)兩者都返回!而接收返回的數(shù)據(jù)/結(jié)果的處理函數(shù)是onActivityResult(int requestCode, int resultCode, Intent data),這里的requestCode就是startActivityForResult的requestCode,resultCode就是setResult里面的resultCode,返回的數(shù)據(jù)在data里面。
** 注意,在setResult后,要調(diào)用finish()銷毀當(dāng)前的Activity,否則無(wú)法返回到原來(lái)的Activity,就無(wú)法執(zhí)行原來(lái)Activity的onActivityResult函數(shù),看到當(dāng)前的Activity沒(méi)反應(yīng)。
第三篇:Android 退出activity 的方式總結(jié)
Android 退出activity 的方式總結(jié)(2012-09-02 22:24:20)在android中使用:[activityname].this.finish();只是退出了activity的堆棧中,要真正的退出程序在手機(jī)cpu中的運(yùn)行,當(dāng)應(yīng)用不再使用時(shí),通常需要關(guān)閉應(yīng)用,可以使用以下三種方法關(guān)閉android應(yīng)用:
一 使用killProcess()函數(shù),首先獲取當(dāng)前進(jìn)程的id,然后殺死該進(jìn)程: android.os.Process.killProcess(android.os.Process.myPid());
通過(guò)這種方式不能將應(yīng)用程序完全殺死,并且他不會(huì)把當(dāng)前應(yīng)用應(yīng)用的Activity的task任務(wù)棧清空
二 在activity的生命周期函數(shù)中添加如下的函數(shù),強(qiáng)制關(guān)閉與該包有關(guān)聯(lián)的一切執(zhí)行:
ActivityManager am =(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
am.restartPackage(“packagename”);
還需要在AndroidManifest.xml文件中加入如下的權(quán)限:
此做法:只能殺死別人,不能殺死自己
三、終止當(dāng)前正在運(yùn)行的Java虛擬機(jī),導(dǎo)致程序終止 System.exit(0);不會(huì)把自己的應(yīng)用程序殺死
企業(yè)中做法:
創(chuàng)建類app 繼承Application
AndroidMainfest-->name-->app //聲明該類為整個(gè)應(yīng)用程序全局的實(shí)例
創(chuàng)建整個(gè)應(yīng)用程序全局的實(shí)例
App.class: ArrayList
其他的Activity中: public void onCreate(Bundle savedInstanceState){ App app =(App)getApplication();//獲取應(yīng)用程序全局的實(shí)例引用
app.activities.add(this);//把當(dāng)前Activity放入集合中 }
public void onDestory(){ App app =(App)getApplication();//獲取應(yīng)用程序全局的實(shí)例引用
app.activities.remove(this);//把當(dāng)前Activity從集合中移除 }
安全退出:
在菜單退出按鈕的事件中定義如下代碼: App app =(App)getApplication();List
第四篇:Android關(guān)于Activity管理的一個(gè)簡(jiǎn)單封裝
我的Android進(jìn)階之旅------>Android關(guān)于Activity管理的一個(gè)簡(jiǎn)單封裝
2015-07-30 12:10 631人閱讀 評(píng)論(2)收藏 舉報(bào)
分類:
Android應(yīng)用開(kāi)發(fā)(226)
版權(quán)聲明:本文為【歐陽(yáng)鵬】原創(chuàng)文章,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處!【http://blog.csdn.net/ouyang_peng】
如何管理當(dāng)前的運(yùn)行Activity棧,如何徹底退出程序,本文封裝了一個(gè)Activity管理類,可以方便隨時(shí)退出程序。
[java] view plain copy
1.import java.util.Stack;2.3.import android.app.Activity;4.import android.content.Context;5.6.public class ActivityManager {
7.private static Stack
10.instance = new ActivityManager();11.} 12.13.public static ActivityManager getInstance(){ 14.return instance;15.} 16.17./**
18.* 添加指定Activity到堆棧
19.*/
20.public void addActivity(Activity activity){ 21.if(activityStack==null){
22.activityStack=new Stack
24.activityStack.add(activity);25.} 26./**
27.* 獲取當(dāng)前Activity
28.*/
29.public Activity currentActivity(){
30.Activity activity=activityStack.lastElement();31.return activity;32.} 33./**
34.* 結(jié)束當(dāng)前Activity
35.*/
36.public void finishActivity(){
37.Activity activity=activityStack.lastElement();38.finishActivity(activity);39.} 40./**
41.* 結(jié)束指定的Activity
42.*/
43.public void finishActivity(Activity activity){ 44.if(activity!=null){
45.activityStack.remove(activity);46.activity.finish();47.activity=null;48.} 49.} 50./**
51.* 結(jié)束指定Class的Activity
52.*/
53.public void finishActivity(Class> cls){ 54.for(Activity activity : activityStack){ 55.if(activity.getClass().equals(cls)){ 56.finishActivity(activity);57.return;58.} 59.} 60.} 61.62./**
63.* 結(jié)束全部的Activity
64.*/
65.public void finishAllActivity(){
66.for(int i = 0, size = activityStack.size();i < size;i++){ 67.if(null!= activityStack.get(i)){ 68.activityStack.get(i).finish();69.} 70.}
71.activityStack.clear();72.} 73./**
74.* 退出應(yīng)用程序
75.*/
76.public void AppExit(Context context){ 77.try {
78.finishAllActivity();
79.android.app.ActivityManager activityMgr=(android.app.ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);80.activityMgr.restartPackage(context.getPackageName());81.System.exit(0);82.} catch(Exception e){ } 83.} 84.}
======
下面從http://004km.cn
17.* weibo : @橋下一粒砂
18.* date : 2012-7-8
19.*
20.*/
21.public class ActivityUtil { 22.23./**
24.* title : 設(shè)置Activity全屏顯示
25.* description :設(shè)置Activity全屏顯示。
26.* @param activity Activity引用
27.* @param isFull true為全屏,false為非全屏
28.*/
29.public static void setFullScreen(Activity activity,boolean isFull){ 30.Window window = activity.getWindow();
31.WindowManager.LayoutParams params = window.getAttributes();32.if(isFull){
33.params.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;34.window.setAttributes(params);
35.window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
36.} else {
37.params.flags &=(~WindowManager.LayoutParams.FLAG_FULLSCREEN);38.window.setAttributes(params);
39.window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);40.} 41.} 42.43./**
44.* title : 隱藏系統(tǒng)標(biāo)題欄
45.* description :隱藏Activity的系統(tǒng)默認(rèn)標(biāo)題欄
46.* @param activity Activity對(duì)象
47.*/
48.public static void hideTitleBar(Activity activity){
49.activity.requestWindowFeature(Window.FEATURE_NO_TITLE);50.} 51.52./**
53.* title : 設(shè)置Activity的顯示方向?yàn)榇怪狈较?/p>
54.* description :強(qiáng)制設(shè)置Actiity的顯示方向?yàn)榇怪狈较颉?/p>
55.* @param activity Activity對(duì)象
56.*/
57.public static void setScreenVertical(Activity activity){
58.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);59.} 60.61./**
62.* title : 設(shè)置Activity的顯示方向?yàn)闄M向
63.* description :強(qiáng)制設(shè)置Actiity的顯示方向?yàn)闄M向。
64.* @param activity Activity對(duì)象
65.*/
66.public static void setScreenHorizontal(Activity activity){
67.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);68.} 69.70./**
71.* title : 隱藏軟件輸入法
72.* description :隱藏軟件輸入法
73.* time : 2012-7-12 下午7:20:00
74.* @param activity
75.*/
76.public static void hideSoftInput(Activity activity){
77.activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);78.} 79.80./**
81.* title : 使UI適配輸入法
82.* description :使UI適配輸入法
83.* time : 2012-7-17 下午10:21:26
84.* @param activity
85.*/
86.public static void adjustSoftInput(Activity activity){ 87.activity.getWindow().setSoftInputMode(88.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);89.} 90.91./** 92.* title : 跳轉(zhuǎn)到某個(gè)Activity。
93.* description :跳轉(zhuǎn)到某個(gè)Activity
94.* time : 2012-7-8 下午3:20:00
95.* @param activity 本Activity
96.* @param targetActivity 目標(biāo)Activity的Class
97.*/
98.public static void switchTo(Activity activity,Class extends Activity> targetActivity){
99.switchTo(activity, new Intent(activity,targetActivity));100.} 101.102./**
103.* title : 根據(jù)給定的Intent進(jìn)行Activity跳轉(zhuǎn)
104.* description :根據(jù)給定的Intent進(jìn)行Activity跳轉(zhuǎn)
105.* time : 2012-7-8 下午3:22:23
106.* @param activity Activity對(duì)象
107.* @param intent 要傳遞的Intent對(duì)象
108.*/
109.public static void switchTo(Activity activity,Intent intent){ 110.activity.startActivity(intent);111.} 112.113./**
114.* title : 帶參數(shù)進(jìn)行Activity跳轉(zhuǎn)
115.* description :帶參數(shù)進(jìn)行Activity跳轉(zhuǎn)
116.* time : 2012-7-8 下午3:24:54
117.* @param activity Activity對(duì)象
118.* @param targetActivity 目標(biāo)Activity的Class
119.* @param params 跳轉(zhuǎn)所帶的參數(shù)
120.*/
121.public static void switchTo(Activity activity,Class extends Activity> targetActivity,Map
123.Intent intent = new Intent(activity,targetActivity);124.for(Map.Entry
126.}
127.switchTo(activity, intent);128.} 129.} 130.131./**
132.* title : 帶參數(shù)進(jìn)行Activity跳轉(zhuǎn) 133.* description :帶參數(shù)進(jìn)行Activity跳轉(zhuǎn)
134.* time : 2012-7-17 下午10:22:58
135.* @param activity
136.* @param target
137.* @param params
138.*/
139.public static void switchTo(Activity activity,Class extends Activity> target,NameValuePair...params){ 140.if(null!= params){
141.Intent intent = new Intent(activity,target);142.for(NameValuePair param : params){
143.setValueToIntent(intent, param.getName(), param.getValue());
144.}
145.switchTo(activity, intent);146.} 147.} 148.149.150./**
151.* title : 顯示Toast消息。
152.* description :顯示Toast消息,并保證運(yùn)行在UI線程中
153.* time : 2012-7-10 下午08:36:02
154.* @param activity
155.* @param message
156.*/
157.public static void toastShow(final Activity activity,final String message){
158.activity.runOnUiThread(new Runnable(){ 159.public void run(){
160.Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
161.} 162.});163.} 164.165./**
166.* title : 將值設(shè)置到Intent里
167.* description :將值設(shè)置到Intent里
168.* time : 2012-7-8 下午3:31:17
169.* @param intent Inent對(duì)象
170.* @param key Key
171.* @param val Value
172.*/ 173.public static void setValueToIntent(Intent intent, String key, Object val){
174.if(val instanceof Boolean)
175.intent.putExtra(key,(Boolean)val);176.else if(val instanceof Boolean[])
177.intent.putExtra(key,(Boolean[])val);178.else if(val instanceof String)
179.intent.putExtra(key,(String)val);180.else if(val instanceof String[])
181.intent.putExtra(key,(String[])val);182.else if(val instanceof Integer)
183.intent.putExtra(key,(Integer)val);184.else if(val instanceof Integer[])
185.intent.putExtra(key,(Integer[])val);186.else if(val instanceof Long)
187.intent.putExtra(key,(Long)val);188.else if(val instanceof Long[])
189.intent.putExtra(key,(Long[])val);190.else if(val instanceof Double)
191.intent.putExtra(key,(Double)val);192.else if(val instanceof Double[])
193.intent.putExtra(key,(Double[])val);194.else if(val instanceof Float)
195.intent.putExtra(key,(Float)val);196.else if(val instanceof Float[])
197.intent.putExtra(key,(Float[])val);198.} 199.200.}
第五篇:Android總結(jié)
Android四大組件:
Activity—表現(xiàn)屏幕界面
Service—后臺(tái)服務(wù)
BroadcastReceiver—實(shí)現(xiàn)廣播機(jī)制
ContentProvider—實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)
Intent類:用來(lái)啟動(dòng)程序并傳遞信息的類
用于Activity、Receiver、Service之間進(jìn)行交互的類,通過(guò)無(wú)參構(gòu)造方法創(chuàng)建對(duì)象,增加其action、category、data、extra等屬性進(jìn)行信息傳遞,并通過(guò)Activity中的startActivity(Intent intent)進(jìn)行界面的跳轉(zhuǎn);通過(guò)Context中的StartService(Intent intent)進(jìn)行服務(wù)跳轉(zhuǎn);通過(guò)Context中的registerReceive(Intent intent)對(duì)廣播進(jìn)行注冊(cè),并通過(guò)sendBroadcast()進(jìn)行無(wú)序消息發(fā)送,或可以通過(guò)SendOrderedBroadcast()進(jìn)行有序的消息發(fā)送。Handler類:
用來(lái)發(fā)送和處理消息,并配合主線程完成UI的更新;消息Message/Runnable傳遞通過(guò)MessageQueue(消息隊(duì)列,先進(jìn)先出)進(jìn)行傳遞,并通過(guò)Lopper進(jìn)行接收,傳遞的消息可以為Message對(duì)象,也可以是Runnable對(duì)象;接收方法通過(guò)HandleMessage(Message msg)進(jìn)行獲取。SharedPreferences類:
一般用于第一次登錄時(shí)的設(shè)置,或者是各個(gè)界面的一些小型格式設(shè)置,如字體等。是本地的小型共享數(shù)據(jù)庫(kù),可以通過(guò)Context的靜態(tài)方法getSharedPreferences獲得其對(duì)象,對(duì)象內(nèi)的值均為鍵值對(duì)進(jìn)行儲(chǔ)存。通過(guò)SharedPreferences對(duì)象調(diào)用editor()獲取SharedPreferences.Editor對(duì)象,向共享數(shù)據(jù)庫(kù)中增加數(shù)據(jù),putString(),并提交數(shù)據(jù),commit();通過(guò)SharedPreferences對(duì)象獲取共享數(shù)據(jù)庫(kù)中的數(shù)據(jù),getString()。
ViewPager:實(shí)現(xiàn)界面滑動(dòng)的類;
通過(guò)設(shè)置OnPagerChangedListener設(shè)置ViewPager的監(jiān)聽(tīng)事件;
實(shí)現(xiàn)流程:
①布局文件中設(shè)置ViewPager控件;
②代碼中進(jìn)行綁定控件;
③通過(guò)繼承PagerAdapter抽象類進(jìn)行設(shè)置適配器,并傳遞數(shù)據(jù)源;
④適配器中實(shí)現(xiàn)兩個(gè)抽象方法,兩個(gè)重寫(xiě)方法:getCount()—獲取滑動(dòng)界面的數(shù)量,isViewFromObject()—判斷視圖是否是來(lái)自于Object文件中;重寫(xiě)兩個(gè)方法,分別為destoryItem—銷毀指定位置的視圖;InstantiateItem(),設(shè)置指定位置的視圖;
Timer與TimerTask類:
Timer為計(jì)時(shí)器的類,通過(guò)無(wú)參構(gòu)造方法可以獲取對(duì)象,通過(guò)Timer.schedule(TimerTask task,long time)進(jìn)行設(shè)置多久后執(zhí)行某任務(wù),當(dāng)任務(wù)執(zhí)行完后,取消計(jì)時(shí)的功能,Timer.cancle();TimerTask類為抽象類,實(shí)例化時(shí),必須重寫(xiě)run方法;執(zhí)行的內(nèi)容,均在run方法中進(jìn)行設(shè)置,并且執(zhí)行時(shí),已在子線程中進(jìn)行執(zhí)行。自定義View:用到的類有Paint、Canvas、Spec、SpecF、Path、View.MeasureSpec、Timer、TimerTask;
抽象類,通過(guò)子類繼承,獲取對(duì)象;在布局文件中綁定后,通過(guò)代碼,設(shè)置自定義View的屬性;自定義View中,通過(guò)重寫(xiě)OnMeasure方法,對(duì)布局文件中的尺寸進(jìn)行測(cè)量,并由View中的setMeasureDimenson()方法,進(jìn)行數(shù)據(jù)的保存;通過(guò)重寫(xiě)Ondraw方法,進(jìn)行繪圖;當(dāng)需要繪制動(dòng)態(tài)圖形時(shí),使用計(jì)時(shí)器Timer的schedule(TimerTask,long time,delay time2)方法,在time時(shí)間后,每隔time2時(shí)間,重寫(xiě)執(zhí)行run方法中的內(nèi)容;將耗時(shí)的操作設(shè)置在run方法中,并通過(guò)View中的invalidate()方法刷新主線程中的繪的圖形,通過(guò)postInvalidate()刷新子線程中的圖形。數(shù)據(jù)庫(kù):
常用的數(shù)據(jù)庫(kù)有Oracle,需要安裝和配置的大型收費(fèi)數(shù)據(jù)庫(kù);MySQL是中型數(shù)據(jù)庫(kù),同樣需要安裝配置,但不需要收費(fèi);Sqlite是小型免費(fèi)的嵌入式數(shù)據(jù)庫(kù),占用內(nèi)存低,最新版本為3.0。Sqlite數(shù)據(jù)庫(kù)需要通過(guò)SqliteDatabaseOpenHelper進(jìn)行創(chuàng)建數(shù)據(jù)庫(kù),并通過(guò)SqliteDatabase進(jìn)行數(shù)據(jù)庫(kù)的操作。輔助類是抽象類,通過(guò)繼承,重寫(xiě)兩個(gè)方法,并在子類的構(gòu)造方法中通過(guò)OpenHelper的構(gòu)造方法(Context context,String SqlName,SqliteDatabase.CursorFactory factory,int version)進(jìn)行數(shù)據(jù)庫(kù)的創(chuàng)建,在onCreate方法中,進(jìn)行數(shù)據(jù)庫(kù)表的創(chuàng)建,在onUpdate中進(jìn)行數(shù)據(jù)庫(kù)的版本更新。在數(shù)據(jù)庫(kù)的操作類中,執(zhí)行exect方法,通過(guò)sql語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。Create table student(_id integer primary key auto increament ,name text);insert into student(_id,name)values(1,zx);delete from student where _id=1;update student set _id=2 where name=zx;select *from student;ListView、GridView適配器的優(yōu)化:
將布局文件中的控件進(jìn)行封裝,當(dāng)視圖加載時(shí),判斷可變視圖是否存在,當(dāng)不存在時(shí),通過(guò)布局文件獲取視圖,并新建封裝類,將地址通過(guò)setTag()進(jìn)行發(fā)送;當(dāng)視圖存在時(shí),重復(fù)利用地址—getTag()。反射:
存儲(chǔ)數(shù)據(jù)的方式:
共享數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)、文件、網(wǎng)絡(luò)、內(nèi)容提供者
廣播:
廣播傳播時(shí),需要接收者、發(fā)送者、廣播頻道;根據(jù)發(fā)送者的發(fā)送方式不同,分為有序廣播、無(wú)序廣播;有序廣播為接收者有接收順序,根據(jù)設(shè)置的優(yōu)先級(jí)不同,確定先后順序,接收者同時(shí)也是發(fā)送者,向后面的廣播發(fā)送消息,發(fā)送過(guò)程中,可以添加信息,也可以停止廣播的傳輸;無(wú)序廣播,接收者之間無(wú)聯(lián)系,均從發(fā)送者處接收信息;廣播在傳輸過(guò)程中,不能被添加信息,也不可能被停止。廣播在發(fā)送前,需要對(duì)接收者進(jìn)行注冊(cè),注冊(cè)方式有兩種,動(dòng)態(tài)注冊(cè)、靜態(tài)注冊(cè)。動(dòng)態(tài)注冊(cè),是在代碼中進(jìn)行,通過(guò)Context對(duì)象調(diào)用靜態(tài)方法進(jìn)行注冊(cè),所有的廣播均可以用動(dòng)態(tài)注冊(cè),其生命周期依賴于應(yīng)用,相對(duì)于靜態(tài)注冊(cè),比較節(jié)省內(nèi)存;靜態(tài)方法在清單文件中進(jìn)行注冊(cè),部分系統(tǒng)廣播不能通過(guò)靜態(tài)注冊(cè)進(jìn)行,其生命周期依賴于系統(tǒng),當(dāng)系統(tǒng)啟動(dòng),即運(yùn)行接收廣播,較耗內(nèi)存。廣播接收者需要繼承BroadcastReceiver,并實(shí)現(xiàn)抽象方法onReceive(),通過(guò)回調(diào)接口,進(jìn)行數(shù)據(jù)的傳輸。注意:廣播發(fā)送前,必須進(jìn)行接收者的注冊(cè),并且,當(dāng)顯示跳轉(zhuǎn)時(shí),不需要意圖過(guò)濾器。安卓布局:九種布局
線性布局,水平或垂直方向兩種格式,主要特點(diǎn)為權(quán)重,即規(guī)定各控件在視圖中的占有的比例;
相對(duì)布局,相對(duì)于父控件或兄弟控件的布局,各控件需指定相對(duì)位置; 絕對(duì)布局,指定各控件在視圖中的絕對(duì)位置,幾乎不再使用; 表格布局,子布局放在行中,列由控件表示(TableRow); 幀布局:覆蓋前面布局的布局,一般用于暫停按鈕等; 風(fēng)格布局:可以跨行、跨列的布局,占滿換行;
左右側(cè)滑:可以實(shí)現(xiàn)左右側(cè)滑,通過(guò)設(shè)置主菜單和二級(jí)菜單設(shè)置左右兩個(gè)菜單; 下拉刷新:設(shè)置下拉刷新、上拉加載的功能; 抽屜布局;
安卓版本及對(duì)應(yīng)的API:
1.6—4;2—7;3—11;4—15;4.3—18;5—20;5.1—21;6—23;7—25; 安卓四層架構(gòu):
應(yīng)用層:Java語(yǔ)言開(kāi)發(fā),主要從事App開(kāi)發(fā);
運(yùn)行庫(kù)層:Java語(yǔ)言與C語(yǔ)言,View視圖、管理類等的開(kāi)發(fā); 架構(gòu)層:C語(yǔ)言與Linux語(yǔ)言,各種框架、瀏覽器等; 內(nèi)核層:Linux、C語(yǔ)言,開(kāi)發(fā)各種驅(qū)動(dòng); 安卓四大組件:
Activity:界面,實(shí)現(xiàn)程序與用戶之間的交換,有自己的生命周期,七個(gè)生命周期;4種啟動(dòng)模式 Service:
BroadcastReceive:三要素,發(fā)送者、接收者、發(fā)送頻道(Intent);類型:有序(接收有序,有數(shù)據(jù)傳送,可以攔截?cái)?shù)據(jù))、無(wú)序廣播(相對(duì));注冊(cè)方式:靜態(tài)注冊(cè),持久監(jiān)聽(tīng),占用內(nèi)存比較高生命周期跟隨系統(tǒng),動(dòng)態(tài)注冊(cè)(代碼中),所有廣播都可以動(dòng)態(tài)注冊(cè),部分系統(tǒng)廣播不能動(dòng)態(tài)注冊(cè),臨時(shí)監(jiān)聽(tīng),占用內(nèi)存較少,生命周期隨應(yīng)用進(jìn)行;
ContentProvide:不能存放數(shù)據(jù),五種存放數(shù)據(jù)方式之一,特點(diǎn)為:①為數(shù)據(jù)的獲取等操作添加一個(gè)統(tǒng)一的接口②可以實(shí)現(xiàn)跨應(yīng)用訪問(wèn)數(shù)據(jù);③可以實(shí)現(xiàn)Android中通訊錄、消息、音頻、視頻等的訪問(wèn)或操作;通過(guò)ContentReceive進(jìn)行數(shù)據(jù)的訪問(wèn),可以對(duì)數(shù)據(jù)進(jìn)行增刪改查操作。
動(dòng)畫(huà): IO流: 序列化: AlertDialog:
Set實(shí)現(xiàn)類: 手機(jī)電量檢測(cè):
自定義SurfaceView:
自定義View:三個(gè)構(gòu)造方法的區(qū)別
Message:Handler.obtain/new/Message.obtain
HttpUriConnection訪問(wèn)網(wǎng)絡(luò)
gride 異步任務(wù) 動(dòng)畫(huà)
抽象類和接口 反射 克隆 序列化 側(cè)滑的實(shí)現(xiàn) 數(shù)據(jù)庫(kù) Socket:
Gson解析
異步任務(wù)和子線程區(qū)別 WebView 版本更新 照片的圓角化
Collection與Collections Sql語(yǔ)句
MVP框架與MVC: TCP與UDP的區(qū)別: 一鍵分享的流程: Http協(xié)議的理解: 不使用框架訪問(wèn)網(wǎng)絡(luò): List集合與set集合: 自定義View的流程: 線性布局的特點(diǎn): ViewPager的原理: 服務(wù)的啟動(dòng)方式:
Activity的啟動(dòng)方式: Xml數(shù)據(jù)解析: