第一篇:Android之a(chǎn)ctivity總結(jié)
Android之Activity總結(jié)
一、什么是Activity
Activity 是用戶接口程序,原則上它會提供給用戶一個交互式的接口功能。它是 android 應(yīng)用程序的基本功能單元。Activity 本身是沒有界面的。所以activity類創(chuàng)建了一個窗口,開發(fā)人員可以通過setContentView(View)接口把UI放到activity創(chuàng)建的窗口上,當(dāng)activity指向全屏窗口時,也可以用其他方式實現(xiàn):作為漂浮窗口(通過windowIsFloating的主題集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是單獨的,用于處理用戶操作。幾乎所有的activity都要和用戶打交道
二、Activity生命周期(生命周期方法)
由圖可知,這些方法調(diào)用的順序:
1.Activity正常啟動:onCreate-> onStart-> onResume;
2.Activity被殺掉:onPause-> onStop-> onDestroy,此為一個完整的生命周期。3.中斷處理:onPause-> onStop,恢復(fù)時onRestart-> onStart-> onResume;
4.如果當(dāng)前Activity是半透明狀態(tài)或者對話框狀態(tài):那么中斷就是onPause ,恢復(fù)的時候onResume。
那么對于”O(jiān)ther app need memory”,就是我們手機在運行一個應(yīng)用程序的時候,有可能打進來電話發(fā)進來短信,或者沒有電了,這時候程序都會被中斷,優(yōu)先去服務(wù)電話的基本功能,另外系統(tǒng)也不允許你占用太多資源,至少要保證一些功能(比如電話),所以資源不足的時候也就有可能被kill掉。
方法在系統(tǒng)中的作用及我們應(yīng)該做什么:
onCreate(創(chuàng)建):在這里創(chuàng)建界面,做一些數(shù)據(jù)的初始化工作;
onStart(可視狀態(tài)): 到這一步變成“用戶可見不可交互”的狀態(tài);
onResume(可交互狀態(tài)):變成和用戶可交互的,(在Activity棧系統(tǒng)通過棧的方式管理這些Activity,即當(dāng)前Activity在棧的最上端,運行完彈出棧,則回到上一個Activity);
onPause(暫停狀態(tài)):到這一步是可見但不可交互的,系統(tǒng)會停止動畫等消耗CPU的事情。從上文的描述已經(jīng)知道,應(yīng)該在這里保存你的一些數(shù)據(jù),因為這個時候你的程序的優(yōu)先級降
低,有可能被系統(tǒng)收回。在這里保存的數(shù)據(jù),應(yīng)該在onResume里讀出來。
OnStop(停止?fàn)顟B(tài)):變得不可見,被下一個activity覆蓋了。
onDestroy(殺死):這是Activity被kill前最后一個被調(diào)用方法了,可能是其他類調(diào)用finish方法或者是系統(tǒng)為了節(jié)省空間將它暫時性的干掉。
onPause,onstop,onDestroy,三種狀態(tài)下 activity都有可能被系統(tǒng)殺掉。
Activity棧:Activity以棧的形式進行管理,后進先出的原則
三、Activity之間的通信
在 Android 中,不同的 Activity 實例可能運行在一個進程中,也可能運行在不同的進程中。因此我們需要一種特別的機制幫助我們在 Activity 之間傳遞消息。
Android 中通過 Intent 對象來表示一條消息,一個 Intent 對象不僅包含有這個消息的目的地,還可以包含消息的內(nèi)容,這好比一封 Email,其中不僅應(yīng)該包含收件地址,還可以包含具體的內(nèi)容。
Intent是一種運行時綁定(runtime binding)機制
Intent負責(zé)對操作的動作、動作涉及數(shù)據(jù)、附加數(shù)據(jù)進行描述,Android則根據(jù)此Intent的描述,負責(zé)找到對應(yīng)的組件,將 Intent傳遞給調(diào)用的組件,并完成組件的調(diào)用。因此,Intent在這里起著一個媒體中介的作用,專門提供組件互相調(diào)用的相關(guān)信息,實現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。
在應(yīng)用中,我們可以以兩種形式來使用Intent:
直接Intent(應(yīng)用程序內(nèi)部):指定了component(組建)屬性的Intent。通過指定具體的組件類,通知應(yīng)用啟動對應(yīng)的組件。
間接Intent(應(yīng)用程序之間):沒有指定comonent屬性的Intent。這些Intent需要包含足夠的信息,這樣系統(tǒng)才能根據(jù)這些信息,在在所有的可用組件中,確定滿足此Intent的組件。
對于直接Intent,Android不需要去做解析,因為目標(biāo)組件已經(jīng)很明確。
Android需要解析的是那些間接Intent,通過解析,將 Intent映射給可以處理此Intent的Activity、IntentReceiver或Service。Intent解析機制主要是通過查找已注冊在AndroidManifest.xml(清單)中的所有IntentFilter(意圖過濾器)及其中定義的Intent,最終找到匹配的Intent。
橫屏?xí)r:onConfigurationChanged(配置改變))
橫屏以及出現(xiàn)鍵盤鍵盤時生命周期部重新開始的方法: KeyboardHidHidden/orientation/screenSize 橫屏顯示:landscape 豎屏顯示:portrait
四大組建:activity:活動、service:服務(wù)、content provider:內(nèi)容提供商、broadcast receiver:廣播收音機
Activity的所有面試題
什么是Activity? 請描述一下Activity 生命周期?
兩個Activity之間跳轉(zhuǎn)時必然會執(zhí)行的是哪幾個方法?
你后臺的Activity被系統(tǒng) 回收怎么辦?如果后臺的Activity由于某原因被系統(tǒng)回收可了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?
如何退出Activity?如何安全退出已調(diào)用多個Activity的Application? 兩個Activity之間怎么傳遞數(shù)據(jù)?
第二篇:Android之a(chǎn)ctivity總結(jié)——轉(zhuǎn)自論壇
Android之a(chǎn)ctivity總結(jié)——轉(zhuǎn)自論壇
一、什么是activity Activity 是用戶接口程序,原則上它會提供給用戶一個交互式的接口功能。它是 android 應(yīng)用程序的基本功能單元。Activity 本身是沒有界面的。所以activity類創(chuàng)建了一個窗口,開發(fā)人員可以通過setContentView(View)接口把UI放到activity創(chuàng)建的窗口上,當(dāng)activity指向全屏窗口時,也可以用其他方式實現(xiàn):作為漂浮窗口(通過windowIsFloating的主題集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是單獨的,用于處理用戶操作。幾乎所有的activity都要和用戶打交道,二、activity生命周期
2011-11-20 20:23:32 上傳 下載附件(64.6 KB)由圖可知:
在一個Activity正常啟動過程中,這些方法調(diào)用的順序是onCreate-> onStart-> onResume;在Activity被kill掉的時候方法順序是onPause-> onStop-> onDestroy,此為一個完整的Lifecycle。那么對于中斷處理(比如電話來了),則是onPause-> onStop,恢復(fù)時onStart-> onResume;如果當(dāng)前應(yīng)用程序的是一個Theme為Translucent(半透明)或者Dialog 的Activity那么中斷就是onPause ,恢復(fù)的時候onResume。
那么對于”O(jiān)ther app need memory”,就是我們手機在運行一個應(yīng)用程序的時候,有可能打進來電話發(fā)進來短信,或者沒有電了,這時候程序都會被中斷,優(yōu)先去服務(wù)電話的基本功能,另外系統(tǒng)也不允許你占用太多資源,至少要保證一些功能(比如電話),所以資源不足的時候也就有可能被kill掉。方法在系統(tǒng)中的作用及我們應(yīng)該做什么:
onCreate:在這里創(chuàng)建界面,做一些數(shù)據(jù)的初始化工作;
onStart: 到這一步變成“用戶可見不可交互”的狀態(tài);
onResume:變成和用戶可交互的,(在Activity棧系統(tǒng)通過棧的方式管理這些Activity,即當(dāng)前Activity在棧的最上端,運行完彈出棧,則回到上一個Activity);
onPause:到這一步是可見但不可交互的,系統(tǒng)會停止動畫等消耗CPU的事情。從上文的描述已經(jīng)知道,應(yīng)該在這里保存你的一些數(shù)據(jù),因為這個時候你的程序的優(yōu)先級降
低,有可能被系統(tǒng)收回。在這里保存的數(shù)據(jù),應(yīng)該在onResume里讀出來。
onStop:變得不可見,被下一個activity覆蓋了
onDestroy:這是Activity被kill前最后一個被調(diào)用方法了,可能是其他類調(diào)用finish方法或者是系統(tǒng)為了節(jié)省空間將它暫時性的干掉,可以用isFinishing()來判斷它,如果你有
一個Progress Dialog在線程中運行,請在onDestroy里把他cancel掉,不然等線程結(jié)束的時候,調(diào)用Dialog的cancel方法會拋異常。
onPause,onstop,onDestroy,三種狀態(tài)下 activity都有可能被系統(tǒng)kill 掉。
三、Activity之間的通信
在 Android 中,不同的 Activity 實例可能運行在一個進程中,也可能運行在不同的進程中。因此我們需要一種特別的機制幫助我們在 Activity 之間傳遞消息。Android 中通過 Intent 對象來表示一條消息,一個 Intent 對象不僅包含有這個消息的目的地,還可以包含消息的內(nèi)容,這好比一封 Email,其中不僅應(yīng)該包含收件地址,還可以包含具體的內(nèi)容。對于一個 Intent 對象,消息“目的地”是必須的,而內(nèi)容則是可選項。
Intent負責(zé)對操作的動作、動作涉及數(shù)據(jù)、附加數(shù)據(jù)進行描述,Android則根據(jù)此Intent的描述,負責(zé)找到對應(yīng)的組件,將 Intent傳遞給調(diào)用的組件,并完成組件的調(diào)用。因此,Intent在這里起著一個媒體中介的作用,專門提供組件互相調(diào)用的相關(guān)信息,實現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。
在應(yīng)用中,我們可以以兩種形式來使用Intent:
直接Intent:指定了component屬性的Intent(調(diào)用setComponent(ComponentName)或者setClass(Context, Class)來指定)。通過指定具體的組件類,通知應(yīng)用啟動對應(yīng)的組件。
間接Intent:沒有指定comonent屬性的Intent。這些Intent需要包含足夠的信息,這樣系統(tǒng)才能根據(jù)這些信息,在在所有的可用組件中,確定滿足此Intent的組件。對于直接Intent,Android不需要去做解析,因為目標(biāo)組件已經(jīng)很明確。
Android需要解析的是那些間接Intent,通過解析,將 Intent映射給可以處理此Intent的Activity、IntentReceiver或Service。Intent解析機制主要是通過查找已注冊在AndroidManifest.xml中的所有IntentFilter及其中定義的Intent,最終找到匹配的Intent。
四、Activity 的 Intent Filter
Intent Filter 描述了一個組件愿意接收什么樣的 Intent 對象,Android 將其抽象為 android.content.IntentFilter 類。在 Android 的 AndroidManifest.xml 配置文件中可以通過
當(dāng)使用 startActivity(intent)來啟動另外一個 Activity 時,如果直接指定 intent 對象的 Component 屬性,那么 Activity Manager 將試圖啟動其 Component 屬性指定的 Activity。否則 Android 將通過 Intent 的其它屬性從安裝在系統(tǒng)中的所有 Activity 中查找與之最匹配的一個啟動,如果沒有找到合適的 Activity,應(yīng)用程序會得到一個系統(tǒng)拋出的異常。這個匹配的過程如下:
2011-11-20 20:23:59 上傳 下載附件(16.72 KB)
五、Activity的棧式管理
Android針對Activity的管理使用的是棧,就是說某一個時刻只有一個Activity處在棧頂,當(dāng)這個Activity被銷毀后,下面的Activity才有可能浮到棧頂,或者有一個新的Activity被創(chuàng)建出來,則舊的Activity就被壓棧沉下去了。Activity是Android程序的表現(xiàn)層。程序的每一個顯示屏幕就是一個Activity。正在運行的Activity處在棧的最頂端,它是運行狀態(tài)的。
2011-11-20 20:26:09 上傳 下載附件(23.43 KB)
當(dāng)在程序中調(diào)用 Activity.finish()方法時,結(jié)果和用戶按下 BACK 鍵一樣:它告訴
Activity Manager該Activity實例可以被“回收”。隨后 Activity Manager 激活處于棧第二層的 Activity,把原 Activity 壓入到棧的第二層,從 Running 狀態(tài)轉(zhuǎn)到 Paused 狀態(tài)。
六、Activity的加載模式standard、singleTop、singleTask、singleInstance(其中前兩個是一組、后兩個是一組),默認為standard standard:就是intent將發(fā)送給新的實例,所以每次跳轉(zhuǎn)都會生成新的activity。singleTop:也是發(fā)送新的實例,但不同standard的一點是,在請求的Activity正好位于棧頂時(配置成singleTop的Activity),不會構(gòu)造新的實例singleTask:和后面的singleInstance都只創(chuàng)建一個實例,當(dāng)intent到來,需要創(chuàng)建設(shè)置為singleTask的Activity的時候,系統(tǒng)會檢查棧里面是否已經(jīng)有該Activity的實例。如果有直接將intent發(fā)送給它。singleInstance:首先說明一下task這個概念,Task可以認為是一個棧,可放入多個Activity。比如啟動一個應(yīng)用,那么Android就創(chuàng)建了一個Task,然后啟動這個應(yīng)用的入口Activity,那在它的界面上調(diào)用其他的Activity也只是在這個task里面。那如果在多個task中共享一個Activity的話怎么辦呢。舉個例來說,如果開啟一個導(dǎo)游服務(wù)類的應(yīng)用程序,里面有個Activity是開啟GOOGLE地圖的,當(dāng)按下home鍵退回到主菜單又啟動GOOGLE地圖的應(yīng)用時,顯示的就是剛才的地圖,實際上是同一個Activity,實際上這就引入了singleInstance。singleInstance模式就是將該Activity單獨放入一個棧中,這樣這個棧中只有這一個Activity,不同應(yīng)用的intent都由這個Activity接收和展示,這樣就做到了共享。當(dāng)然前提是這些應(yīng)用都沒有被銷毀,所以剛才是按下的HOME鍵,如果按下了返回鍵,則無效。
七、Activity的跳轉(zhuǎn)Activity跳轉(zhuǎn),無返回結(jié)果 這是最簡單的Activity跳轉(zhuǎn)方式。從一個Activity啟動另一個Activity,直接startActivity(new Intent(當(dāng)前Activity.this, 下一Activity.class))。
Activity跳轉(zhuǎn),返回數(shù)據(jù)/結(jié)果 需要返回數(shù)據(jù)或結(jié)果的,則使用startActivityForResult(Intent intent, int requestCode),requestCode的值是自定義的,用于識別跳轉(zhuǎn)的目標(biāo)Activity。跳轉(zhuǎn)的目標(biāo)Activity所要做的就是返回數(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,否則無法返回到原來的Activity,就無法執(zhí)行原來Activity的onActivityResult函數(shù),看到當(dāng)前的Activity沒反應(yīng)。
第三篇:Android 退出activity 的方式總結(jié)
Android 退出activity 的方式總結(jié)(2012-09-02 22:24:20)在android中使用:[activityname].this.finish();只是退出了activity的堆棧中,要真正的退出程序在手機cpu中的運行,當(dāng)應(yīng)用不再使用時,通常需要關(guān)閉應(yīng)用,可以使用以下三種方法關(guān)閉android應(yīng)用:
一 使用killProcess()函數(shù),首先獲取當(dāng)前進程的id,然后殺死該進程: android.os.Process.killProcess(android.os.Process.myPid());
通過這種方式不能將應(yīng)用程序完全殺死,并且他不會把當(dāng)前應(yīng)用應(yīng)用的Activity的task任務(wù)棧清空
二 在activity的生命周期函數(shù)中添加如下的函數(shù),強制關(guān)閉與該包有關(guān)聯(lián)的一切執(zhí)行:
ActivityManager am =(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
am.restartPackage(“packagename”);
還需要在AndroidManifest.xml文件中加入如下的權(quán)限:
此做法:只能殺死別人,不能殺死自己
三、終止當(dāng)前正在運行的Java虛擬機,導(dǎo)致程序終止 System.exit(0);不會把自己的應(yīng)用程序殺死
企業(yè)中做法:
創(chuàng)建類app 繼承Application
AndroidMainfest-->name-->app //聲明該類為整個應(yīng)用程序全局的實例
創(chuàng)建整個應(yīng)用程序全局的實例
App.class: ArrayList
其他的Activity中: public void onCreate(Bundle savedInstanceState){ App app =(App)getApplication();//獲取應(yīng)用程序全局的實例引用
app.activities.add(this);//把當(dāng)前Activity放入集合中 }
public void onDestory(){ App app =(App)getApplication();//獲取應(yīng)用程序全局的實例引用
app.activities.remove(this);//把當(dāng)前Activity從集合中移除 }
安全退出:
在菜單退出按鈕的事件中定義如下代碼: App app =(App)getApplication();List
第四篇:Android關(guān)于Activity管理的一個簡單封裝
我的Android進階之旅------>Android關(guān)于Activity管理的一個簡單封裝
2015-07-30 12:10 631人閱讀 評論(2)收藏 舉報
分類:
Android應(yīng)用開發(fā)(226)
版權(quán)聲明:本文為【歐陽鵬】原創(chuàng)文章,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處!【http://blog.csdn.net/ouyang_peng】
如何管理當(dāng)前的運行Activity棧,如何徹底退出程序,本文封裝了一個Activity管理類,可以方便隨時退出程序。
[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://www.tmdps.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)默認標(biāo)題欄
46.* @param activity Activity對象
47.*/
48.public static void hideTitleBar(Activity activity){
49.activity.requestWindowFeature(Window.FEATURE_NO_TITLE);50.} 51.52./**
53.* title : 設(shè)置Activity的顯示方向為垂直方向
54.* description :強制設(shè)置Actiity的顯示方向為垂直方向。
55.* @param activity Activity對象
56.*/
57.public static void setScreenVertical(Activity activity){
58.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);59.} 60.61./**
62.* title : 設(shè)置Activity的顯示方向為橫向
63.* description :強制設(shè)置Actiity的顯示方向為橫向。
64.* @param activity Activity對象
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)到某個Activity。
93.* description :跳轉(zhuǎn)到某個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進行Activity跳轉(zhuǎn)
104.* description :根據(jù)給定的Intent進行Activity跳轉(zhuǎn)
105.* time : 2012-7-8 下午3:22:23
106.* @param activity Activity對象
107.* @param intent 要傳遞的Intent對象
108.*/
109.public static void switchTo(Activity activity,Intent intent){ 110.activity.startActivity(intent);111.} 112.113./**
114.* title : 帶參數(shù)進行Activity跳轉(zhuǎn)
115.* description :帶參數(shù)進行Activity跳轉(zhuǎn)
116.* time : 2012-7-8 下午3:24:54
117.* @param activity Activity對象
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ù)進行Activity跳轉(zhuǎn) 133.* description :帶參數(shù)進行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消息,并保證運行在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對象
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—后臺服務(wù)
BroadcastReceiver—實現(xiàn)廣播機制
ContentProvider—實現(xiàn)數(shù)據(jù)存儲
Intent類:用來啟動程序并傳遞信息的類
用于Activity、Receiver、Service之間進行交互的類,通過無參構(gòu)造方法創(chuàng)建對象,增加其action、category、data、extra等屬性進行信息傳遞,并通過Activity中的startActivity(Intent intent)進行界面的跳轉(zhuǎn);通過Context中的StartService(Intent intent)進行服務(wù)跳轉(zhuǎn);通過Context中的registerReceive(Intent intent)對廣播進行注冊,并通過sendBroadcast()進行無序消息發(fā)送,或可以通過SendOrderedBroadcast()進行有序的消息發(fā)送。Handler類:
用來發(fā)送和處理消息,并配合主線程完成UI的更新;消息Message/Runnable傳遞通過MessageQueue(消息隊列,先進先出)進行傳遞,并通過Lopper進行接收,傳遞的消息可以為Message對象,也可以是Runnable對象;接收方法通過HandleMessage(Message msg)進行獲取。SharedPreferences類:
一般用于第一次登錄時的設(shè)置,或者是各個界面的一些小型格式設(shè)置,如字體等。是本地的小型共享數(shù)據(jù)庫,可以通過Context的靜態(tài)方法getSharedPreferences獲得其對象,對象內(nèi)的值均為鍵值對進行儲存。通過SharedPreferences對象調(diào)用editor()獲取SharedPreferences.Editor對象,向共享數(shù)據(jù)庫中增加數(shù)據(jù),putString(),并提交數(shù)據(jù),commit();通過SharedPreferences對象獲取共享數(shù)據(jù)庫中的數(shù)據(jù),getString()。
ViewPager:實現(xiàn)界面滑動的類;
通過設(shè)置OnPagerChangedListener設(shè)置ViewPager的監(jiān)聽事件;
實現(xiàn)流程:
①布局文件中設(shè)置ViewPager控件;
②代碼中進行綁定控件;
③通過繼承PagerAdapter抽象類進行設(shè)置適配器,并傳遞數(shù)據(jù)源;
④適配器中實現(xiàn)兩個抽象方法,兩個重寫方法:getCount()—獲取滑動界面的數(shù)量,isViewFromObject()—判斷視圖是否是來自于Object文件中;重寫兩個方法,分別為destoryItem—銷毀指定位置的視圖;InstantiateItem(),設(shè)置指定位置的視圖;
Timer與TimerTask類:
Timer為計時器的類,通過無參構(gòu)造方法可以獲取對象,通過Timer.schedule(TimerTask task,long time)進行設(shè)置多久后執(zhí)行某任務(wù),當(dāng)任務(wù)執(zhí)行完后,取消計時的功能,Timer.cancle();TimerTask類為抽象類,實例化時,必須重寫run方法;執(zhí)行的內(nèi)容,均在run方法中進行設(shè)置,并且執(zhí)行時,已在子線程中進行執(zhí)行。自定義View:用到的類有Paint、Canvas、Spec、SpecF、Path、View.MeasureSpec、Timer、TimerTask;
抽象類,通過子類繼承,獲取對象;在布局文件中綁定后,通過代碼,設(shè)置自定義View的屬性;自定義View中,通過重寫OnMeasure方法,對布局文件中的尺寸進行測量,并由View中的setMeasureDimenson()方法,進行數(shù)據(jù)的保存;通過重寫Ondraw方法,進行繪圖;當(dāng)需要繪制動態(tài)圖形時,使用計時器Timer的schedule(TimerTask,long time,delay time2)方法,在time時間后,每隔time2時間,重寫執(zhí)行run方法中的內(nèi)容;將耗時的操作設(shè)置在run方法中,并通過View中的invalidate()方法刷新主線程中的繪的圖形,通過postInvalidate()刷新子線程中的圖形。數(shù)據(jù)庫:
常用的數(shù)據(jù)庫有Oracle,需要安裝和配置的大型收費數(shù)據(jù)庫;MySQL是中型數(shù)據(jù)庫,同樣需要安裝配置,但不需要收費;Sqlite是小型免費的嵌入式數(shù)據(jù)庫,占用內(nèi)存低,最新版本為3.0。Sqlite數(shù)據(jù)庫需要通過SqliteDatabaseOpenHelper進行創(chuàng)建數(shù)據(jù)庫,并通過SqliteDatabase進行數(shù)據(jù)庫的操作。輔助類是抽象類,通過繼承,重寫兩個方法,并在子類的構(gòu)造方法中通過OpenHelper的構(gòu)造方法(Context context,String SqlName,SqliteDatabase.CursorFactory factory,int version)進行數(shù)據(jù)庫的創(chuàng)建,在onCreate方法中,進行數(shù)據(jù)庫表的創(chuàng)建,在onUpdate中進行數(shù)據(jù)庫的版本更新。在數(shù)據(jù)庫的操作類中,執(zhí)行exect方法,通過sql語句對數(shù)據(jù)庫進行操作。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)化:
將布局文件中的控件進行封裝,當(dāng)視圖加載時,判斷可變視圖是否存在,當(dāng)不存在時,通過布局文件獲取視圖,并新建封裝類,將地址通過setTag()進行發(fā)送;當(dāng)視圖存在時,重復(fù)利用地址—getTag()。反射:
存儲數(shù)據(jù)的方式:
共享數(shù)據(jù)庫、數(shù)據(jù)庫、文件、網(wǎng)絡(luò)、內(nèi)容提供者
廣播:
廣播傳播時,需要接收者、發(fā)送者、廣播頻道;根據(jù)發(fā)送者的發(fā)送方式不同,分為有序廣播、無序廣播;有序廣播為接收者有接收順序,根據(jù)設(shè)置的優(yōu)先級不同,確定先后順序,接收者同時也是發(fā)送者,向后面的廣播發(fā)送消息,發(fā)送過程中,可以添加信息,也可以停止廣播的傳輸;無序廣播,接收者之間無聯(lián)系,均從發(fā)送者處接收信息;廣播在傳輸過程中,不能被添加信息,也不可能被停止。廣播在發(fā)送前,需要對接收者進行注冊,注冊方式有兩種,動態(tài)注冊、靜態(tài)注冊。動態(tài)注冊,是在代碼中進行,通過Context對象調(diào)用靜態(tài)方法進行注冊,所有的廣播均可以用動態(tài)注冊,其生命周期依賴于應(yīng)用,相對于靜態(tài)注冊,比較節(jié)省內(nèi)存;靜態(tài)方法在清單文件中進行注冊,部分系統(tǒng)廣播不能通過靜態(tài)注冊進行,其生命周期依賴于系統(tǒng),當(dāng)系統(tǒng)啟動,即運行接收廣播,較耗內(nèi)存。廣播接收者需要繼承BroadcastReceiver,并實現(xiàn)抽象方法onReceive(),通過回調(diào)接口,進行數(shù)據(jù)的傳輸。注意:廣播發(fā)送前,必須進行接收者的注冊,并且,當(dāng)顯示跳轉(zhuǎn)時,不需要意圖過濾器。安卓布局:九種布局
線性布局,水平或垂直方向兩種格式,主要特點為權(quán)重,即規(guī)定各控件在視圖中的占有的比例;
相對布局,相對于父控件或兄弟控件的布局,各控件需指定相對位置; 絕對布局,指定各控件在視圖中的絕對位置,幾乎不再使用; 表格布局,子布局放在行中,列由控件表示(TableRow); 幀布局:覆蓋前面布局的布局,一般用于暫停按鈕等; 風(fēng)格布局:可以跨行、跨列的布局,占滿換行;
左右側(cè)滑:可以實現(xiàn)左右側(cè)滑,通過設(shè)置主菜單和二級菜單設(shè)置左右兩個菜單; 下拉刷新:設(shè)置下拉刷新、上拉加載的功能; 抽屜布局;
安卓版本及對應(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語言開發(fā),主要從事App開發(fā);
運行庫層:Java語言與C語言,View視圖、管理類等的開發(fā); 架構(gòu)層:C語言與Linux語言,各種框架、瀏覽器等; 內(nèi)核層:Linux、C語言,開發(fā)各種驅(qū)動; 安卓四大組件:
Activity:界面,實現(xiàn)程序與用戶之間的交換,有自己的生命周期,七個生命周期;4種啟動模式 Service:
BroadcastReceive:三要素,發(fā)送者、接收者、發(fā)送頻道(Intent);類型:有序(接收有序,有數(shù)據(jù)傳送,可以攔截數(shù)據(jù))、無序廣播(相對);注冊方式:靜態(tài)注冊,持久監(jiān)聽,占用內(nèi)存比較高生命周期跟隨系統(tǒng),動態(tài)注冊(代碼中),所有廣播都可以動態(tài)注冊,部分系統(tǒng)廣播不能動態(tài)注冊,臨時監(jiān)聽,占用內(nèi)存較少,生命周期隨應(yīng)用進行;
ContentProvide:不能存放數(shù)據(jù),五種存放數(shù)據(jù)方式之一,特點為:①為數(shù)據(jù)的獲取等操作添加一個統(tǒng)一的接口②可以實現(xiàn)跨應(yīng)用訪問數(shù)據(jù);③可以實現(xiàn)Android中通訊錄、消息、音頻、視頻等的訪問或操作;通過ContentReceive進行數(shù)據(jù)的訪問,可以對數(shù)據(jù)進行增刪改查操作。
動畫: IO流: 序列化: AlertDialog:
Set實現(xiàn)類: 手機電量檢測:
自定義SurfaceView:
自定義View:三個構(gòu)造方法的區(qū)別
Message:Handler.obtain/new/Message.obtain
HttpUriConnection訪問網(wǎng)絡(luò)
gride 異步任務(wù) 動畫
抽象類和接口 反射 克隆 序列化 側(cè)滑的實現(xiàn) 數(shù)據(jù)庫 Socket:
Gson解析
異步任務(wù)和子線程區(qū)別 WebView 版本更新 照片的圓角化
Collection與Collections Sql語句
MVP框架與MVC: TCP與UDP的區(qū)別: 一鍵分享的流程: Http協(xié)議的理解: 不使用框架訪問網(wǎng)絡(luò): List集合與set集合: 自定義View的流程: 線性布局的特點: ViewPager的原理: 服務(wù)的啟動方式:
Activity的啟動方式: Xml數(shù)據(jù)解析: