android概述和環境搭建_第1頁
android概述和環境搭建_第2頁
android概述和環境搭建_第3頁
android概述和環境搭建_第4頁
android概述和環境搭建_第5頁
已閱讀5頁,還剩80頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第一章android概述與環境搭建學習目標環境搭建工具的使用程序目錄與AndroidManifestandroid應用的基本組件環境搭建

目標:熟悉android應用程序開發環境以及應用程序調試方法。

1.安裝JDK2.安裝SDK3.安裝Eclipse4.安裝ADT插件5.創建AVD1.安裝JDK①到sun官方網站/javase/downloads/index.jsp

下載JDK(1.5以上版本),或由BTG服務器上獲取,然后安裝。②安裝完成后,將JDK的安裝根目錄配置為環境變量JAVA_HOME,并在Path環境變量中添加%JAVA_HOME%\bin和%JAVA_HOME%\lib\tools.jar。2.安裝SDK到Android官方網站/index.html下載獲取。解壓SDK的zip文件到指定目錄,該目錄即作為Android的主目錄。將Android主目錄下的tools目錄添加到Path環境變量。例:如將下載的SDK解壓到D:\android-sdk-windows-1.6_r1,則在Path環境變量中添加D:\android-sdk-windows-1.6_r1\tools打開命令行工具輸入android-h,測試androidSDK是否配置成功。3.安裝Eclipse到eclipse官方網站/downloads/

下載Eclipse4.3.1版(低版本缺少plug-in,后續步驟可能會出現問題),也可由BTG服務器上獲取。解壓縮后即可直接使用。4.安裝ADT插件

ADT全稱Android

Development

Tools,它是一款用于開發android應用程序的eclipse插件,由于Android的官方網站需要翻墻,以下我們采用離線安裝的方式。到Google官方地址/android/ADT-22.3.0.zip下載ADT離線包。打開eclipse,按以下步驟安裝ADT插件:先點擊help再點擊InstallNewSoftware在彈出的界面點擊此處的Add單擊Archive在“打開”窗口找到剛剛下載的ADT,并點擊“打開”點擊OK勾選DeveloperTools并點擊Next開始安裝當安裝過程中彈出此界面時,點擊Next繼續安裝先選中此單選按鈕再點擊Finish按鈕,繼續安裝當彈出此界面時點擊OK,繼續安裝點擊Yes,完成安裝重啟Eclipse后彈出此界面,點擊OpenPreferences在Preferences在右邊的SDKLocation輸入框中輸入SDK的根目錄,然后單擊右下角的OK按鈕。至此,Android開發環境配置完成。5.創建AVD

AVD全稱AndroidVirturalDevice(android模擬器),在androidSDK1.5版本后的android開發中必須至少創建1個AVD。打開eclipse,按以下步驟創建AVD:1.選擇Window>AndroidVirtualDeviceManager菜單。在打開的AndroidVirtualDeviceManager點擊窗口右側的New…按鈕。在彈出的窗口中輸入AVD的名字并選擇需要的設備型號和Android版本,然后點擊OK按鈕。點擊新建的AVD(模擬器),再點擊窗口右方的Start按鈕點擊Launch按鈕,運行模擬器模擬器運行后效果:小練習:按照上面講到的方法自己配置一下Android開發環境,并通過Eclipse運行模擬器Eclipse的使用Eclipse菜單欄簡單介紹創建第一個Android項目——hello,world!Eclipse菜單欄

(File菜單)(Edit菜單)創建第一個Android項目——hello,world!1.選擇File>New>AndroidApplicationProject菜單。如圖2.給項目命名并設置好相關參數,然后點擊Next繼續。如圖3.點擊Next,繼續4.點擊Next,繼續4.此處默認,點擊Next,繼續5.設置好內容,點擊Finish,完成創建運行新建的程序模擬器中運行效果程序目錄與AndroidManifest

程序目錄結構說明描述文件AndroidManifest.xml說明程序目錄結構說明1.src目錄src目錄中存放的是該項目的源代碼,其內部結構會根據用戶所聲明的包自動組織,該目錄的組織方式為src/com/soarsky/activity/movie/LoginActivity.java,其中com/soarsky為包名,軟件開發人員在項目開發過程中,大部分時間是對該目錄下的源代碼文件進行編寫。

2.gen目錄

該目錄下的文件全部都是ADT自動生成的,一般并不需要去修改,實際上該目錄下只定義了一個R.java文件,此文件是應用程序資源Resource類,包括控件id,Layout,Strings,Drawable,以方便在整個應用程序中對資源的使用和統一管理,為項目中用戶界面、字符串、圖片等資源都會在該類中創建其惟一的ID,當項目中使用這些資源時,會通過該ID得到資源的引用。3.Android2.x

該目錄中存放的是該項目支持的jar包,同時其中還包含項目打包時需要的META-INF目錄。

4.assets目錄

該目錄用于存放項目相關的資源文件,例如文本文件等,在程序中可以使用getResources.getAssets().open("text.txt")得到資源文件的輸入流InputStream對象。5.Bin目錄

該目錄用于存放編譯后文件,如:classes.dex為代碼編譯后的文件。***.apk為編譯打包后的安裝程序包。Bin/res文件夾存放圖片、布局等資源。6.res目錄drawable文件夾分別放的是高(h)、低(l)、中(m)不同分辨率的圖片,即為了兼容或者說讓應用程序在不同分辨率下的機器上更好的呈現,一般一張圖片要弄三張不同分辨率的放在這三個文件夾下,如:應用程序的圖標或其中所用到的圖片,應用程序在啟動時會根據當前機器(客戶端)的分辨率采用合適的一張圖片;放在drawable文件夾下的圖片會自動在R.java文件的drawable類生成一個相應的變量,代碼如下:publicstaticfinalclassdrawable{publicstaticfinalinttitlebarimage=0x7f020001;publicstaticfinalintbtn_pressed_back=0x7f020002;publicstaticfinalintbtn_pressed_detail=0x7f020003;publicstaticfinalintbtn_pressedfalse_back=0x7f020004;publicstaticfinalintbutton_bg_b=0x7f020005;publicstaticfinalintbutton_pressed_1=0x7f020006;publicstaticfinalintbutton_pressedfalse_1=0x7f020007;publicstaticfinalintbutton_pressedxml=0x7f020008;publicstaticfinalintbutton_pressedxml1=0x7f020009;}layout文件夾下放的是視圖布局文件,可以理解為跟.net中.aspx文件類似—界面布局文件,那就會有朋友問了:每個內容視圖文件的代碼控制類是如何與之關聯的?這個需要在每個Activity類的onCreate方法中通過方法setContentView(ID);設置。publicstaticfinalclasslayout{publicstaticfinalintabout=0x7f030000;publicstaticfinalintmain=0x7f03000f;}如:setContentView(R.layout.about);values文件夾下放的是當前應用程序中使用到的字符串—以鍵值對的形式存放,如:應用程序的名稱、按鈕等提示文本,這樣做的好處是:將文本字符串與代碼分離,方便做國際化,如你現在做的應用程序針對的是中國用戶,當你想增加個日本或英文版本時,你只需要在values文件夾下增加相應國際化的strings.xml文件即可!描述文件AndroidManifest.xml說明主要包含功能:

1說明application的java數據包,數據包名是application的唯一標識;2描述application的component;3說明application的component運行在哪個process下;4聲明application所必須具備的權限,用以訪問受保護的部分API,以及與其他application的交互;5聲明application其他的必備權限,用以component之間的交互;6列舉application運行時需要的環境配置信息,這些聲明信息只在程序開發和測試時存在,發布前將被刪除;7聲明application所需要的AndroidAPI的最低版本級別,比如1.0,1.1,1.5;8列舉application所需要鏈接的庫;結構和規則

AndroidManifest.xml文件的結構、元素,以及元素的屬性,可以在AndroidSDK文檔中查看詳細說明。而在看這些眾多的元素以及元素的屬性前,需要先了解一下這些元素在命名、結構等方面的規則:

元素:在所有的元素中只有<manifest>和<application>是必需的,且只能出現一次。如果一個元素包含有其他子元素,必須通過子元素的屬性來設置其值。處于同一層次的元素,這些元素的說明是沒有順序的。

屬性:按照常理,所有的屬性都是可選的,但是有些屬性是必須設置的。那些真正可選的屬性,即使不存在,其也有默認的數值項說明。除了根元素<manifest>的屬性,所有其他元素屬性的名字都是以android:前綴的;

定義類名:所有的元素名都對應其在SDK中的類名,如果你自己定義類名,必須包含類的數據包名,如果類與application處于同一數據包中,可以直接簡寫為“.”;

多數值項:如果某個元素有超過一個數值,這個元素必須通過重復的方式來說明其某個屬性具有多個數值項,且不能將多個數值項一次性說明在一個屬性中;

資源項說明:當需要引用某個資源時,其采用如下格式:@[package:]type:name。例如<activityandroid:icon=”@drawable/icon”…>字符串值:類似于其他語言,如果字符中包含有字符“\”,則必須使用轉義字符“\\”;實例說明AndroidManifest.xml文件1)除去頭部XML信息說明,首先是manifest項—根節點,其屬性包括:地址、包名,以及程序的版本說明。2)其次是manifest的子節點application,其屬性包括:程序圖標、程序名稱。前面帶有@表示引用資源,例如:@drawable/icon表示引用的是drawable資源中的icon,可以在其源工程的res/drawable中找到3)然后就是application的子節點activity,其屬性包括:activity的名稱、activity的標簽名,其子節點intent-filter則是對activity的說明。4)而在intent-filter中,actionandroid:name=”ent.action.MAIN”和categoryandroid:name=”ent.category.LAUNCHER”用以說明程序啟動時的入口activity是哪個。如果這兩個屬性值中分別含有MAIN和LAUNCHER,則說明它就是啟動程序時的入口活動。5)uses-sdkandroid:minSdkVersion=”4″說明程序使用的AndroidSDK的最低版本,其中1表示Android1.0,2表示Android1.1,而3則表示Android1.5在Eclipse中創建工程后,會自動生成一個AndroidManifest.xml文件。在代碼編寫的過程中,需要同時修改AndroidManifest.xml,如果配置出現錯誤會導致程序不能正常運行。manifest根節點,描述了package中所有的內容xmlns:android包含命名空間的聲明。xmlns:android=http://schemas./apk/res/android,使得Android中各種標準屬性能在文件中使用,提供了大部分元素中的數據Package聲明應用程序包application包含package中application級別組件聲明的根節點。此元素也可包含application的一些全局和默認的屬性,如標簽、icon、主題、必要的權限,等等。一個manifest能包含零個或一個此元素(不能大余一個)android:icon應用程序圖標android:label應用程序名字Activity用來與用戶交互的主要工具。Activity是用戶打開一個應用程序的初始頁面,大部分被使用到的其他頁面也由不同的activity所實現,并聲明在另外的activity標記中。注意,每一個activity必須有一個<activity>標記對應,無論它給外部使用或是只用于自己的package中。如果一個activity沒有對應的標記,你將不能運行它。另外,為了支持運行時查找Activity,可包含一個或多個<intent-filter>元素來描述activity所支持的操作android:name應用程序默認啟動的activityintent-filter聲明了指定的一組組件支持的Intent值,從而形成了IntentFilter。除了能在此元素下指定不同類型的值,屬性也能放在這里來描述一個操作所需的唯一的標簽、icon和其他信息action組件支持的Intentactioncategory組件支持的IntentCategory。這里指定了應用程序默認啟動的activityuses-sdk該應用程序所使用的sdk版本相關android應用的基本組件ActivityService服務ContentProvider內容提供者BroadcastReceiver消息廣播Activity:應用程序中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽并處理用戶的事件做出響應。Activity之間通過Intent進行通信。在Intent的描述結構中,有兩個最重要的部分:動作和動作對應的數據。典型的動作類型有:MAIN(activity的門戶)、VIEW、PICK、EDIT等。而動作對應的數據則以URI的形式進行表示。例如:要查看一個人的聯系方式,你需要創建一個動作類型為VIEW的intent,以及一個表示這個人的URI。與之有關系的一個類叫IntentFilter。相對于intent是一個有效的做某事的請求,一個intentfilter則用于描述一個activity(或者IntentReceiver)能夠操作哪些intent。一個activity如果要顯示一個人的聯系方式時,需要聲明一個IntentFilter,這個IntentFilter要知道怎么去處理VIEW動作和表示一個人的URI。IntentFilter需要在AndroidManifest.xml中定義。通過解析各種intent,從一個屏幕導航到另一個屏幕是很簡單的。當向前導航時,activity將會調用startActivity(IntentmyIntent)方法。然后,系統會在所有安裝的應用程序中定義的IntentFilter中查找,找到最匹配myIntent的Intent對應的activity。新的activity接收到myIntent的通知后,開始運行。當startActivity方法被調用將觸發解析myIntent的動作,這個機制提供了兩個關鍵好處:

A、Activities能夠重復利用從其它組件中以Intent的形式產生的一個請求;

B、Activities可以在任何時候被一個具有相同IntentFilter的新的Activity取代。

AndroidManifest文件中含有如下過濾器的Activity組件為默認啟動類當程序啟動時系統自動調用它<intent-filter><actionandroid:name="ent.action.MAIN"/><category

android:name="ent.category.LAUNCHER"/></intent-filter>

Activity生命周期Activity的整個生命周期都定義在下面的接口方法中,所有方法都可以被重載。所有的Activity都需要實現onCreate(Bundle)去初始化設置,大部分Activity需要實現onPause()去提交更改過的數據,當前大部分的Activity也需要實現onFreeze()接口,以便恢復在onCreate(Bundle)里面設置的狀態。publicclassActivityextendsApplicationContext{protectedvoidonCreate(Bundleicicle);protectedvoidonStart();protectedvoidonRestart();protectedvoidonResume();protectedvoidonFreeze(BundleoutIcicle);protectedvoidonPause();protectedvoidonStop();protectedvoidonDestroy();}詳細介紹一下這幾個方法中系統在做什么以及我們應該做什么:onCreate:當活動第一次啟動的時候,觸發該方法,可以在此時完成活動的初始化工作。onStart:該方法的觸發表示所屬活動將被展現給用戶。onResume:當一個活動和用戶發生交互的時候,觸發該方法。onPause:當一個正在前臺運行的活動因為其他的活動需要前臺運行而轉入后臺運行的時候,觸發該方法。這時候需要將活動的狀態持久化,比如正在編輯的數據庫記錄等。onStop:當一個活動不再需要展示給用戶的時候,觸發該方法。如果內存緊張,系統會直接結束這個活動,而不會觸發onStop方法。所以保存狀態信息是應該在onPause時做,而不是onStop時做。活動如果沒有在前臺運行,都將被停止或者Linux管理進程為了給新的活動預留足夠的存儲空間而隨時結束這些活動。因此對于開發者來說,在設計應用程序的時候,必須時刻牢記這一原則。在一些情況下,onPause方法或許是活動觸發的最后的方法,因此開發者需要在這個時候保存需要保存的信息。onRestart:當處于停止狀態的活動需要再次展現給用戶的時候,觸發該方法。onDestroy:當活動銷毀的時候,觸發該方法。和onStop方法一樣,如果內存緊張,系統會直接結束這個活動而不會觸發該方法。Activity常見應用1啟動一個Activity

一個activity可以啟動另外一個,甚至包括與它不處于同一應用程序之中的。舉個例子說,假設你想讓用戶看到某個地方的街道地圖。而已經存在一個具有此功能的activity了,那么你的activity所需要做的工作就是把請求信息放到一個Intent對象里面,并把它傳遞給startActivity()。于是地圖瀏覽器就會顯示那個地圖。而當用戶按下BACK鍵的時候,你的activity又會再一次的顯示在屏幕上。//顯示方式聲明Intent,直接啟動SecondActivityIntentintent=newIntent(FirstActivity.this,SecondActivity.class);startActivity(intent);2Activity之間傳遞數據如何在Activity中調用另一個Activity,但若需要在調用另外一個Activity的同時傳遞數據,那么就需要利用android.os.Bundle對象封裝數據的能力,將欲傳遞的數據或參數,通過Bundle來傳遞不同Intent之間的數據。相當于web開發中用session等等進行參數傳遞一樣。

利用Intent傳遞數據傳遞數據的Activity中:Intentintent=newIntent();intent.putExtra("name","Jon");//在Intent中加入鍵值對數據。鍵:name,值:Jonintent.setClass(Activity01.this,Activity02.class);Activity01.this.startActivity(intent);在取出數據的Activity中:Intentintent=getIntent();//獲得傳過來的Intent。Stringvalue=intent.getStringExtra("name");//根據鍵name取出值。利用Bundle傳遞數據,傳遞數據的Activity:Intentintent=newIntent();BundlemyBundle=newBundle();myBundle.putString("Key_Name","Tom");intent.putExtras(myBundle);intent.setClass(Activity01.this,Activity02.class);Activity01.this.startActivity(intent);取出數據的Activity:BundlegetBundle=getIntent().getExtras();Stringvalue=getBundle.getString("Key_Name");利用startActivityForResult傳遞數據startActivityForResult可以把數據傳過去,還可以把那邊的數據傳過來。傳遞數據的Activity中:Intentintent=newIntent();Bundlebundle=newBundle();bundle.putString("data","somedata");//把數據傳過去intent.putExtras(bundle);intent.setClass(Activity01.this,Activity02.class);startActivityForResult(intent,10);//10是一個代碼重載onActivityResult方法,用來接收傳過來的數據:protectedvoidonActivityResult(intrequestCode,intresultCode,Intentintent){switch(resultCode){caseRESULT_OK:Bundleb=intent.getExtras();Stringstr=b.getString("Result");setTitle("Returndata:"+str);break;default:break;}}接收數據的Activity:Intentintent=getIntent();BundlegetBundle=getIntent().getExtras();Stringdata=getBundle.getString("data");//讀取傳過來的數據et.setText(data);EditTextedittext=(EditText)findViewById(R.id.text);Intentintent=newIntent();//實例化一個Intent用來傳過去,可以在Intent里存放數據。Bundlebundle=newBundle();bundle.putString("Result",edittext.getText().toString());intent.putExtras(bundle);Activity02.this.setResult(RESULT_OK,intent);//把Intent(數據)傳過去,RESULT_OK是請求碼。finish();//結束當前的Activity。Service服務:一個Service是一段長生命周期的,沒有用戶界面的程序,可以用來開發如監控類程序。比較好的一個例子就是一個正在從播放列表中播放歌曲的媒體播放器。在一個媒體播放器的應用中,應該會有多個activity,讓使用者可以選擇歌曲并播放歌曲。然而,音樂重放這個功能并沒有對應的activity,因為使用者當然會認為在導航到其它屏幕時音樂應該還在播放的。在這個例子中,媒體播放器這個activity會使用Context.startService()來啟動一個service,從而可以在后臺保持音樂的播放。同時,系統也將保持這個service一直執行,直到這個service運行結束。另外,我們還可以通過使用Context.bindService()方法,連接到一個service上(如果這個service還沒有運行將啟動它)。當連接到一個service之后,我們還可以service提供的接口與它進行通訊。拿媒體播放器這個例子來說,我們還可以進行暫停、重播等操作。Service使用步驟如下

1>繼承service類

2>AndroidManifast.xml配置清單文件中<application>節點里對服務進行配置

<servicename=“.SMSService”/>服務不能自己運行,需要通過Contex.startService()或Contex.bindService()啟動服務。

通過startService()方法啟動的服務于調用者沒有關系,即使調用者關閉了,服務仍然運行想停止服務要調用Context.stopService(),此時系統會調用onDestory(),使用此方法啟動時,服務首次啟動系統先調用服務的onCreate()-->onStart(),如果服務已經啟動再次調用只會觸發onStart()方法使用bindService()啟動的服務與調用者綁定,只要調用者關閉服務就終止,使用此方法啟動時,服務首次啟動系統先調用服務的onCreate()-->onBind(),如果服務已經啟動再次調用不會再觸發這2個方法,調用者退出時系統會調用服務的onUnbind()-->onDestory(),想主動解除綁定可使用Contex.unbindService(),系統依次調用onUnbind()-->onDestory();Service比較流程示意圖

擁有service的進程具有較高的優先級

官方文檔告訴我們,Android系統會盡量保持擁有service的進程運行,只要在該service已經被啟動(start)或者客戶端連接(bindService)到它。當內存不足時,需要保持,擁有service的進程具有較高的優先級。

1.如果service正在調用onCreate,onStartCommand或者onDestory方法,那么用于當前service的進程則變為前臺進程以避免被killed。

2.如果當前service已經被啟動(start),擁有它的進程則比那些用戶可見的進程優先級低一些,但是比那些不可見的進程更重要,這就意味著service一般不會被killed.

3.如果客戶端已經連接到service(bindService),那么擁有Service的進程則擁有最高的優先級,可以認為service是可見的。

4.如果service可以使用startForeground(int,Notification)方法來將service設置為前臺狀態,那么系統就認為是對用戶可見的,并不會在內存不足時killed。如果有其他的應用組件作為Service,Activity等運行在相同的進程中,那么將會增加該進程的重要性。本地service不需和Activity交互的本地服務Activity:在AndroidManifest.xml添加:否則啟動服務時會提示newIntent找不到"com.demo.SERVICE_DEMO"。

對于這類不需和Activity交互的本地服務,是使用startService/stopService的最好例子。運行時可以發現第一次startService時,會調用onCreate和onStart,在沒有stopService前,無論點擊多少次startService,都只會調用onStart。而stopService時調用onDestroy。再次點擊stopService,會發現不會進入service的生命周期的,即不會再調用onCreate,onStart和onDestroy。而onBind在startService/stopService中沒有調用。ContentProvider內容提供者:ContentProvider(內容提供者)是Android中的四大組件之一。主要用于對外共享數據,也就是通過ContentProvider把應用中的數據共享給其他應用訪問,其他應用可以通過ContentProvider對指定應用中的數據進行操作。ContentProvider分為系統的和自定義的,系統的也就是例如聯系人,圖片等數據。

以下這段是GoogleDoc中對ContentProvider的大致概述。

內容提供者將一些特定的應用程序數據供給其它應用程序使用。數據可以存儲于文件系統、SQLite數據庫或其它方式。內容提供者繼承于ContentProvider基類,為其它應用程序取用和存儲它管理的數據實現了一套標準方法。然而,應用程序并不直接調用這些方法,而是使用一個ContentResolver對象,調用它的方法作為替代。ContentResolver可以與任意內容提供者進行會話,與其合作來對所有相關交互通訊進行管理。1.ContentProviderAndroid提供了一些主要數據類型的ContentProvider,比如音頻、視頻、圖片和私人通訊錄等。可在vider包下面找到一些Android提供的ContentProvider。通過獲得這些ContentProvider可以查詢它們包含的數據,當然前提是已獲得適當的讀取權限。

主要方法:publicbooleanonCreate()在創建ContentProvider時調用。

publicCursorquery(Uri,String[],String,String[],String)用于查詢指定Uri的ContentProvider,返回一個Cursor。

publicUriinsert(Uri,ContentValues)用于添加數據到指定Uri的ContentProvider中。

publicintupdate(Uri,ContentValues,String,String[])用于更新指定Uri的ContentProvider中的數據。

publicintdelete(Uri,String,String[])用于從指定Uri的ContentProvider中刪除數據。

publicStringgetType(Uri)用于返回指定的Uri中的數據的MIME類型。

如果操作的數據屬于集合類型,那么MIME類型字符串應該以vnd.android.cursor.dir/開頭。

例如:要得到所有person記錄的Uri為content://contacts/person,那么返回的MIME類型字符串為"vnd.android.cursor.dir/person"。如果要操作的數據屬于非集合類型數據,那么MIME類型字符串應該以vnd.android.cursor.item/開頭。例如:要得到id為10的person記錄的Uri為content://contacts/person/10,那么返回的MIME類型字符串應為"vnd.android.cursor.item/person"。2.ContentResolver當外部應用需要對ContentProvider中的數據進行添加、刪除、修改和查詢操作時,可以使用ContentResolver類來完成,要獲取ContentResolver對象,可以使用Context提供的getContentResolver()方法。ContentResolvercr=getContentResolver();ContentResolver提供的方法和ContentProvider提供的方法對應的有以下幾個方法。

publicUriinsert(Uriuri,ContentValuesvalues)用于添加數據到指定Uri的ContentProvider中。//插入聯系人privatevoidinsert(Personp){ //獲得ContentResolver對象 ContentResolvercr=getContentResolver(); ContentValuesvalues=newContentValues(); values.put(People.NAME,); //表示是否把聯系人添加到收藏(加星),1表示加入,0表示不加入,這行代碼注釋默認是不加入。 values.put(Contacts.People.STARRED,1); Uriuri=Contacts.People.createPersonInMyContactsGroup(cr,values); //獲得聯系人People表的Uri Uriurl=Uri.withAppendedPath(uri, Contacts.People.Phones.CONTENT_DIRECTORY); values.clear(); values.put(Contacts.Phones.TYPE,Contacts.Phones.NUMBER); values.put(Contacts.Phones.NUMBER,p.number); //插入操作 cr.insert(url,values); }publicintdelete(Uriuri,Stringselection,String[]selectionArgs)用于從指定Uri的ContentProvider中刪除數據。//刪除聯系人privatevoiddelete(Stringname){ //獲得ContentResolver對象 ContentResolvercr=getContentResolver(); Uriurl=Contacts.People.CONTENT_URI; //設置刪除條件 Stringwhere=People.NAME+"=?"; String[]selectionArgs={name}; cr.delete(url,where,selectionArgs);}publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)用于查詢指定Uri的ContentProvider。//查詢聯系人privateCursorquery(Stringname){ //獲得ContentResolver對象 ContentResolvercr=getContentResolver(); Uriuri=Contacts.People.CONTENT_URI; //查詢對象 String[]projection={People._ID,People.NAME,People.NUMBER}; //設置查詢條件,selection和selectionArgs參數為null,表示查詢全部數據 Stringselection=null; String[]selectionArgs=null; if(!"".equals(name)){ selection=People.NAME+"=?"; selectionArgs=newString[]{name};} //設置排序條件 StringsortOrder=Contacts.People._ID; Cursorc=cr.query(uri,projection,selection,selectionArgs,sortOrder); returnc; }}3.UriUri指定了將要操作的ContentProvider,其實可以把一個Uri看作是一個網址,我們把Uri分為三部分。如要操作設備上

所有聯系人的數據。對應Uri如下:content://contacts/people/

第一部分是"content://"。

第二部分是主機名或authority,用于唯一標識這個ContentProvider,外部應用需要根據這個標識來找到它。

第三部分是路徑名,用來表示將要操作的數據。BroadcastReceiver消息廣播:廣播接收者(BroadcastReceiver)用于接收廣播Intent,廣播Intent的發送是通過調用Context.sendBroadcast()、Context.sendOrderedBroadcast()來實現的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收。

廣播是一種廣泛運用的在應用程序之間傳輸信息的機制。而BroadcastReceiver是對發送出來的廣播進行過濾接收并響應的一類組件;來自普通應用程序,如一個應用程序通知其他應用程序某些數據已經下載完畢。BroadcastReceiver自身并不實現圖形用戶界面,但是當它收到某個通知后,BroadcastReceiver可以啟動Activity作為響應,或者通過NotificationMananger提醒用戶,或者啟動Service等等。BroadCastReceiver的機制1.機制在Android里面有各種各樣的廣播,比如電池的使用狀態,電話的接收和短信的接收都會產生一個廣播,應用程序開發者也可以監聽這些廣播并做出程序邏輯的處理。如圖:2.實現

用接收短信舉例:第一種方式:系統注冊:在AndroidManifest.xml中注冊第二種方式:

//廣播接收者-廣播的接收代碼中注冊:IntentFilterintentFilter=newIntentFilter("vider.Telephony.SMS_RECEIVED");registerReceiver(mBatteryInfoReceiver,intentFilter);3.生命周期下圖描述了Android中廣播的生命周期,它遠沒有Activity的生命周期那么復雜:廣播的生命周期只有十秒左右,如果在onReceive()內做超過十秒內的事情,就會報錯。

每次廣播到來時,會重新創建

BroadcastReceiver

對象,并且調用onReceive()方法,執行完以后,該對象即被銷毀。當onReceive()方法在

10

秒內沒有執行完畢,Android會認為該程序無響應。所以在BroadcastReceiver

里不能做一些比較耗時的操作,否側會彈出

ANR(ApplicationNoResponse)的對話框。怎么用好

BroadcastReceiver

?如果需要完成一項比較耗時的工作,應該通過發送Intent給Service,由Service來完成。這里不能使用子線程來解決,因為BroadcastReceiver的生命周期很短,子線程可能還沒有結束。BroadcastReceiver就先結束了.BroadcastReceiver

一旦結束,此時BroadcastReceiver的所在進程很容易在系統需要內存時被優先殺死,因為它屬于空進程(沒有任何活動組件的進程)。如果它的宿主進程被殺死,那么正在工作的子線程也會被殺死。所以采用子線程來解決是不可靠的。廣播類型

普通廣播(Normalbroadcasts)

發送一個廣播,所以監聽該廣播的廣播接收者都可以監聽到改廣播。異步廣播,當處理完之后的Intent,依然存在,這時候registerRe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論