package="com.apress.book.PrankApp">
<uses-permission android:name=
"android.permission.RECEIVE_SMS" />
沒有權(quán)限標(biāo)志,Android將你的應(yīng)用程序無法啟動(dòng)當(dāng)它接收到一個(gè)短信。還有其他的權(quán)限我需要涵蓋你向前看。在此期間 , 你可以找到所有在列表的權(quán)限 Android 的文件資料 http://code.google.com/android/reference/android/ Manifest.permission.html 。
向我發(fā)送短信!
現(xiàn)在,你已經(jīng)允許進(jìn)行與手機(jī)的SMS層交互,你必須告訴手機(jī)做什么,當(dāng)一個(gè)新的文本信息到達(dá)時(shí)。要做到這一點(diǎn),你必須打開AndroidManifest.xml文件,添加一個(gè)新的Intent Receiver。代碼清單2-3顯示了要插入的代碼。
Code Listing 2-3. Registering the New Intent Receiver for
Incoming SMSs
</activity>
<receiver android:name=
"PrankSMSReceiver"android:enabled="true">
<intent-filter>
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"
/>
<categoryandroid:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
這就是你每次必須要接受的 Intent notification , 當(dāng)手機(jī)得到一個(gè)接收到的 SMS 。
在 Action 中分析 Intent Receiver
要完成這個(gè)要比我們想象的有一點(diǎn)困難。一個(gè)進(jìn)程必須在一個(gè) DDMS 中運(yùn)行 。但在大多數(shù)情況下,你不想讓應(yīng)用程序運(yùn)行,除非新的事件觸發(fā)它。這問題的解決方案在Eclipse IDE中只是一個(gè)小小的把戲。當(dāng)你一步一步往下走時(shí),這可能會(huì)一點(diǎn)一點(diǎn)變得復(fù)雜。
在你的onReceiveIntent方法中放置一個(gè)斷點(diǎn)。開始調(diào)試應(yīng)用程序,并讓模擬器位于“Hello World,PrankActivity”屏幕上。在Eclipse中,切換視圖到DDMS。你可以按這命令+ F8鍵幾次或選擇菜單 Window ?? Open Perspective ?? DDMS 。
沿著左邊窗口,在Device選項(xiàng)卡上,你現(xiàn)在應(yīng)該看有一個(gè)綠色bug圖標(biāo)在你的應(yīng)用旁邊。這是DDMS告訴你調(diào)試器附加到你的PrankApp進(jìn)程中。在它的下面是Emulator Control選項(xiàng)卡。在這里你可以發(fā)送短信消息。首先輸入任何一個(gè)電話號(hào)碼,選擇SMS,鍵入一個(gè)測(cè)試消息,并按下Send。
如果你的配置正確,你應(yīng)該看到Eclipse切換到Debug透視圖,并停止在你的新設(shè)置斷點(diǎn)上。
注意:如果沒有發(fā)生,首先確保你設(shè)置了權(quán)限正確。如果他們不正確,你應(yīng)該看到一個(gè)失敗的權(quán)限信息顯示在DDMS屏幕底部的LogCat標(biāo)簽中。此外,請(qǐng)確保你的應(yīng)用程序已經(jīng)在運(yùn)行,并在Devices選項(xiàng)卡有綠色調(diào)試圖標(biāo)在它的旁邊。如果所有這些都不奏效,比較你的項(xiàng)目與文中的示例。
目前為止,如果你正確地完成了。你的Intent的onReceiveIntent功能被調(diào)用,當(dāng)每一個(gè)SMS消息發(fā)送到手機(jī)上。接下來,你就必須弄清楚如何得到短信的內(nèi)容。
什么是在一個(gè)SMS中?
可悲的是,到目前為止Android關(guān)于接收和過濾SMS信息的文檔只不過是混亂的。我懷疑這不是一項(xiàng)需要告訴開發(fā)人員的重要功能。我不同意這些優(yōu)先事項(xiàng),但是使我有機(jī)會(huì)填補(bǔ)空缺。
下面是methodonReceiveIntent的代碼,功能是監(jiān)聽新的SMS信息:
public void onReceiveIntent
(Context context, Intent intent)
{
SmsMessage msg[] =
Telephony.Sms.Intents.getMessagesFromIntent(intent);
for(int i = 0; i < msg.length; i++)
{
String msgTxt = msg[i].getMessageBody();
if (msgTxt.equals("0xBADCAT0_Fire_The_Missiles!"))
{
//Start the pranking here
}
}
return;
}
你還需要輸入兩個(gè)類庫來完成這項(xiàng)工作:
Import android.telephony.gsm.SmsMessage;
Import android.provider.Telephony;
getMessageFromIntent 方法是在 Telephony 類中 , 這將返回 SMS 信息的數(shù)組。現(xiàn)在剩下的就是得到短信的有效載荷。你要找的觸發(fā)惡作劇活動(dòng)的特殊代碼為文本
“ 0xBADCAT0_Fire_The_Missiles ! ”
它必須是一個(gè)適當(dāng)?shù)莫?dú)特組合,以便它不會(huì)被觸發(fā)事故。你不會(huì)希望自己的惡作劇失火并提醒受害人太早的。
注意:在Android里,沒有記載的功能是很可能還沒有完成。由于接收短信的文檔幾乎不存在,你應(yīng)該會(huì)有些變化在如何處理手機(jī)簡(jiǎn)訊上。更可能的是整體的方法應(yīng)該是相似的,但它有把握地認(rèn)為其中的一些細(xì)節(jié)將改變SDK的前到達(dá)它的最終版本。這個(gè)例子是有關(guān)學(xué)習(xí)如何使用意圖接收器多是有關(guān)文本的消息通信資料。
觸發(fā)活動(dòng)
重要的是要記住,意圖接收器的生命周期短,只有只要方法調(diào)用onReceiveIntent。一旦出于這一職能,Android是免費(fèi)殺死進(jìn)程中運(yùn)行你的應(yīng)用程序。任何異步功能會(huì)死去,如果是一個(gè)十分棘手的死亡開始。如果你想要做超越了簡(jiǎn)單的處理方法內(nèi)的任何事情,你需要啟動(dòng)服務(wù)或活動(dòng)。既然你要同時(shí)播放音樂和警報(bào)你的受害者,他們?nèi)ミ^了,你需要啟動(dòng)的一項(xiàng)活動(dòng)。你完成此情況如下:
if (msgTxt.equals("0xBADCAT0_Fire_The_Missiles!"))
{
//Start the Activity
Intent startActivity = new Intent();
startActivity.setLaunchFlags(Intent.NEW_TASK_LAUNCH);
startActivity.setAction("com.apress.START_THE_MUSIC");
context.startActivity(startActivity);
}
你會(huì)看到這里是增補(bǔ) NEW_TASK_LAUNCH 在 setLaunchFlags 。你需要做任何你要發(fā)送的 Intent action , 將啟動(dòng)一項(xiàng)新的活動(dòng)。此外,正如你在啟動(dòng)畫面示例應(yīng)用程序,你必須添加一個(gè)新的行動(dòng),你的Activity的Intent filter。那個(gè)過程應(yīng)該看起來很熟悉:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="com.apress.START_THE_MUSIC" />
<category android:name=
"android.intent.category.LAUNCHER" />
<category android:name=
"android.intent.category.DEFAULT" />
</intent-filter>
現(xiàn)在 , 如果你在前面正確地添加了代碼 , 當(dāng)你從 DDMS 透視圖中 發(fā)送 SMS 消息時(shí) , 你應(yīng)該看到你的應(yīng)用跳出到前臺(tái) , 顯示 “Hello World ,PrankActivity ” 文本在屏幕上。
索具的活動(dòng)
一個(gè)最后的工作你需要添加 , 在得到卑鄙的音樂播放服務(wù)之前 : 裝配 Activity , 以回應(yīng)你的 Intent Receiver 發(fā)送的活動(dòng) 。如果應(yīng)用程序正常啟動(dòng),你要立即關(guān)閉了。同樣,如果可以通過菜單啟動(dòng),這樣你的惡作劇的計(jì)劃就會(huì)過早的曝光。要做到這一點(diǎn),你必須檢索發(fā)射的Intent,并調(diào)用getAction方法來計(jì)算出在什么情況下,它已經(jīng)啟動(dòng)。該P(yáng)rankActivity的OnCreate方法現(xiàn)在看起來應(yīng)該代碼2-4。
Code Listing 2-4. Launching on a Specific Intent Action
public void onCreate(Bundle icicle)
{
super .onCreate(icicle);
Intent i = getIntent();
String action = i.getAction();
if (action != null &&
action.equals("com.apress.START_THE_MUSIC"))
{
setContentView(R.layout.pranked);
//We'll need to start the music service here
}
else
finish();
}
首先你會(huì)得到發(fā)起 Activity 的Intent 。使用目前得到的 Intent , 你可以用 getAction 方法檢索調(diào)用的行動(dòng)。這個(gè)將返回一個(gè)包含啟動(dòng)事件的字符串,你核對(duì)你的著名音樂行動(dòng)列在原來的XML。如果在啟動(dòng)事件為你的活動(dòng)來自正常的方式(從菜單或從啟動(dòng)調(diào)試器),該行動(dòng)字符串將是null。如果是這樣的話,你要立即使用finish方法關(guān)閉活動(dòng)。
注意:OnCreate方法被調(diào)用當(dāng)你的應(yīng)用被首次啟動(dòng)時(shí)。如果你已經(jīng)啟動(dòng)你的應(yīng)用程序,然后退出(使用返回鍵),應(yīng)用程序仍然在后臺(tái)運(yùn)行。如果在這時(shí),你發(fā)送短信,你的活動(dòng)將回到前臺(tái),但其OnStart方法將調(diào)用而不是OnCreat。
你今天想羞辱誰呢?
雖然可能有些矯枉過正,你要使用Android的service對(duì)象來處理音樂播放。我打算這樣做有因?yàn)榱韨€(gè)原因:
n ?? 這是一個(gè)好的機(jī)會(huì)來展示以簡(jiǎn)單的方式service的使用,在簡(jiǎn)單的環(huán)境。
n ?? 潛在的,它會(huì)讓你啟動(dòng)音樂不用看到應(yīng)用程序,使你的惡作劇的應(yīng)用程序更卑鄙。
神經(jīng)與服務(wù)
為什么你要使用的服務(wù)?從本質(zhì)上講,它意味著是一個(gè)對(duì)象,與用戶界面分離的可運(yùn)行地過程。這是完美的情況,當(dāng)一個(gè)開發(fā)人員希望的功能(無論是網(wǎng)絡(luò)或多媒體相關(guān))能夠獨(dú)立運(yùn)行。例子包括:音頻播放,網(wǎng)絡(luò)交易的后臺(tái),和邪惡的惡作劇程序。雖然服務(wù)允許多個(gè)應(yīng)用程序(打開通信信道)與他們綁定,你會(huì)使用它作為一個(gè)簡(jiǎn)單的后臺(tái)進(jìn)程。同樣,services有很多用途不只是這個(gè)簡(jiǎn)單的例子。
創(chuàng)建service
添加一個(gè)新類的源碼包。我已經(jīng)再次調(diào)用PrankService(沒有點(diǎn)創(chuàng)意)。在最基本的層面,service要重寫onBind方法。要獲得服務(wù)類編譯,它必須看,至少有一點(diǎn)點(diǎn),如代碼2-5。
Code Listing 2-5. A Stripped-Down Service
public class PrankService extends Service
{
public IBinder onBind(Intent intent)
{
return null;
}
}
在這個(gè)例子中,你不會(huì)使用該服務(wù)onBind方法進(jìn)行互動(dòng)。你可以簡(jiǎn)單地啟動(dòng)和停止服務(wù)在你的主要活動(dòng)內(nèi)。要做到這一點(diǎn),你必須重寫兩個(gè)方法在服務(wù)類:
OnStart (Int startId ,Bundle argument )
onDestroy()
當(dāng)OnStart被調(diào)用時(shí),你會(huì)開始播放的媒體文件。當(dāng)服務(wù)被破壞,就會(huì)明確地停止。這不是必然要求,但你會(huì)明白。
啟動(dòng)服務(wù)
開始一個(gè)新的服務(wù)應(yīng)該類似于開始活動(dòng)。自從你已經(jīng)接觸到這是幾次,我就在給你一段代碼,讓你整理一下。 調(diào)用前面列出的PrankActivity OnCreate方法。簡(jiǎn)單替換注釋“ We’ll need to start the music service here ”用下面的代碼行:
startService(new Intent
("com.apress.START_AUDIO_SERVICE"), null );
同樣,這個(gè)看上去很熟悉。啟動(dòng)Activity和啟動(dòng)service之間唯一的區(qū)別是(除了不同的方法調(diào)用)是隨Intent傳遞bundle(實(shí)際上是一個(gè)地圖或哈希表)參數(shù)的能力。這bundle將被傳遞到OnCreate方法服務(wù)。
啟動(dòng)音樂
BREW和Java一樣,Android的媒體播放(簡(jiǎn)單的播放/停止計(jì)算)非常簡(jiǎn)單易用。當(dāng)你服務(wù)的OnStart函數(shù)被調(diào)用,你會(huì)加載和播放/res/raw 目錄中的測(cè)試音頻文件首先要做的是復(fù)制音頻樣本文件導(dǎo)入/res/raw(如果沒有這個(gè)目錄,繼續(xù)并創(chuàng)建它)。下一步,放下羞辱,并復(fù)制寫入尊重,音頻文件原始文件夾。如果你使用Eclipse,你應(yīng)該添加相應(yīng)的元素R.raw。在你的情況下,它的R.raw.test。
現(xiàn)在你有一個(gè)音樂文件的引用,你可以添加程序 PrankService 的要求如下 :
public void onStart(int startId, Bundle arguments)
{
MediaPlayer p;
super .onStart(startId, arguments);
player = MediaPlayer.create(this , R.raw.test);
player.start();
}
請(qǐng)記住 , 是一個(gè)重寫的 OnStart 方法 , 因此你必須調(diào)用父類同一函數(shù)或 Android 將變得不穩(wěn)定。在這一點(diǎn)上,你需要用MediaPlayer的靜態(tài)類創(chuàng)建一個(gè)新的媒體播放器對(duì)象。因?yàn)閟ervice是context的子類,你將一個(gè)指針傳遞給你當(dāng)前的context和靜態(tài)變量代表你的測(cè)試媒體。在這一點(diǎn)上,你可以調(diào)用play,現(xiàn)在你可以開始忙了。播放會(huì)繼續(xù)在后臺(tái)運(yùn)行,直到stopService這個(gè)方法是由你的主Activity調(diào)用。
當(dāng)stopService被調(diào)用時(shí),下面的方法將調(diào)用:
public void onDestroy()
{
super.onDestroy();
player.stop();
}
同情的行動(dòng)
既然你是一個(gè)不錯(cuò)的愛開玩笑的人 , 你要給你的受害者一個(gè)臺(tái)階下。正如你之前見過的,Activity是由Intent Receiver觸發(fā)的,在活動(dòng)啟動(dòng)服務(wù)的時(shí)間點(diǎn)上。正如你剛才看到的,service是負(fù)責(zé)播放噪聲激怒你副總工程師。同樣,因?yàn)槟闶侨蚀鹊脑谀愕膱?zhí)行回報(bào)的同時(shí),你必須為受害者設(shè)計(jì)關(guān)閉音樂方法。添加在你的PrankActivity下面的方法可以實(shí)現(xiàn)你善意的行動(dòng):
public boolean onKeyDown(int keyCode, KeyEvent event)
{
stopService(new Intent(
"com.apress.START_AUDIO_SERVICE"));
finish();
return true;
}
配置文件
下面是表現(xiàn)如下所示 :
<service android:name=".PrankService">
<intent-filter>
<action android:name=
"com.apress.START_AUDIO_SERVICE" />
<category android:name=
"android.intent.category.DEFAULT" />
</intent-filter>
</service>
禪宗和報(bào)復(fù)的藝術(shù)
通過不光明正大的小惡作劇應(yīng)用程序的使用 , 你應(yīng)該明白了 Intents ,Intent Receivers ,services 和Activities 如何 共同在先進(jìn)的 、 主要是后臺(tái) 的 應(yīng)用程序中運(yùn)行的。我現(xiàn)在要改變一下方式,一步一步做,你做了什么以及如何實(shí)現(xiàn)它。
讓我做的更好
你做了以下內(nèi)容:
1。你使用正確的權(quán)限和系統(tǒng)接收器的意圖級(jí)短信的意圖安排的對(duì)象是PrankSMSReciever每次實(shí)例化一個(gè)手機(jī)上的SMS到達(dá)。如果你的Intent Receiver發(fā)現(xiàn)一個(gè)非常特定的SMS的有效載荷,它將通過發(fā)送Intent將啟動(dòng)你的活動(dòng)。
2。這項(xiàng)活動(dòng)名為PrankActivity,會(huì)監(jiān)聽被PrankSMSReceiver的特定intent action。當(dāng)它收到確切intent action,你的活動(dòng)將顯示一個(gè)“gotcha”消息給受害者。同時(shí),該活動(dòng)將發(fā)出意圖旨在啟動(dòng)服務(wù)。如果在任何時(shí)候受害人/用戶按下一個(gè)電話上的鍵,應(yīng)用程序?qū)⑼顺觯魳贩?wù)將終止。
3。服務(wù)類,稱為PrankService,監(jiān)聽PrankActivity的intent,將啟動(dòng)并開始播放令人討厭,預(yù)定義的音頻文件。它將繼續(xù)播放,直到它被要求停止通過PrankActivity的調(diào)用方法stopService。
注意:此示例應(yīng)用程序不涉及手機(jī)的本地短信應(yīng)用。因?yàn)樗械膇ntent receiver傳入的通知意圖,你的應(yīng)用將被爭(zhēng)奪用戶與Android的關(guān)注短信收件箱的應(yīng)用。在生產(chǎn)中,這可能需要相當(dāng)計(jì)時(shí)器也許觸發(fā)文本有效載荷,這是一個(gè)微妙多一點(diǎn) “0xBADCAT0_Fire_The_Missiles !”
在Android中移動(dòng)數(shù)據(jù)
最后,你需要把重點(diǎn)放在內(nèi)容解析器。 Android不會(huì)給SDK特別的手機(jī)文件系統(tǒng)的訪問權(quán)限,如Brew一樣。它也沒有提供一個(gè)RecordStore,像Java ME一樣。在你的Activities、Intent Receiver和services之間,你傳遞數(shù)據(jù)的主要方法是必須通過ContentResolver超類。雖然你可以存儲(chǔ)數(shù)據(jù)通過文件,參數(shù),和其他數(shù)據(jù)庫,可以采取許多形式,Android附帶的幾個(gè)重要內(nèi)置content resovlers。這里有一個(gè)列表,Android的主要content resovlers,你可能要經(jīng)常互動(dòng)基礎(chǔ)上:
瀏覽器
書簽
搜索歷史
電話呼叫
通話記錄
最近通話
聯(lián)系
系統(tǒng)設(shè)置
硬件設(shè)置(藍(lán)牙,網(wǎng)絡(luò)設(shè)置)
軟件設(shè)置
Android 的文檔提供了非常好的示例 :http://code.google.com/android/ devel /data/contentproviders.html #usingacp 。馬上我要給你演示怎樣添加一個(gè)書簽到手機(jī)瀏覽器的書簽列表。首先,你要搜索當(dāng)前的書簽列表,查看你的鏈接是否存在。第二,你要添加書簽,如果不存在。
注意:可以創(chuàng)建你自己的content provider,作為一種方式,為了公共訪問封裝Android的SQLite的執(zhí)行。你將進(jìn)入如何在后面的章節(jié)中這一點(diǎn)。現(xiàn)在你只是去處理content resolver交給的“client”方面。
Android采用了自定義的SQLite實(shí)現(xiàn),來存儲(chǔ)本地信息。如果你不熟悉SQL的基礎(chǔ)知識(shí),現(xiàn)在也許是一個(gè)學(xué)習(xí)的機(jī)會(huì)。為表述方便,我要假設(shè)你了解基本的SQL查詢命令。如果你需要進(jìn)一步提高,Apress上有一個(gè)很好的資源http://apress.com/book/ catalog?category=145 。
無恥的自我推銷
讓我們說一下你的應(yīng)用程序中“about”部分,你想有一個(gè)按鈕,添加你的商業(yè)軟件網(wǎng)頁到用戶的web書簽。你要確保它不添加兩次,如果你的用戶有再次點(diǎn)擊該按鈕意外。為了使這個(gè)實(shí)例簡(jiǎn)單,你將觸發(fā)這個(gè)事件在你示例應(yīng)用程序中,當(dāng)用戶按下一個(gè)鍵。
注意:在一個(gè)有趣的注意,如果你需要證明,作為一個(gè)開發(fā)人員,Android是還沒有完全成熟的,你只要看看比對(duì)下文件的android.content.ContentResolver方法getDataFilePath,其中規(guī)定: “ 請(qǐng)不要使用此功能!有人說這一點(diǎn),他們不應(yīng)該。你沒有直接的訪問文件內(nèi)的內(nèi)容提供商。不要碰這個(gè)。走開。 “ 這是好,知道即使是對(duì)Android的文檔技術(shù)作家有幽默感。
獲取用戶的書簽
這應(yīng)該是顯而易見的,至少在這一點(diǎn),開發(fā)人員可以做一些非常邪惡的事情,訪問用戶的書簽。目前還不清楚,在這一點(diǎn),Android會(huì)做什么以防止發(fā)生這類事情。我想這得由運(yùn)營(yíng)商來鎖定或監(jiān)視此行為。在任何情況下,你將使用一個(gè)調(diào)用方法managedQuery,它將返回一個(gè)列表用戶的書簽:
Cursor bookmarks =
android.provider.Browser.getAllBookmarks
(getContentResolver());
int urlColumn = bookmarks.getColumnIndex(
android.provider.Browser.BookmarkColumns.URL );
Cursor results;
String[] proj = new String[]
{
android.provider.BaseColumns._ID,
android.provider.Browser.BookmarkColumns.URL,
android.provider.Browser.BookmarkColumns.TITLE
};
results =
managedQuery(android.provider.Browser.BOOKMARKS_URI,
proj, null ,
android.provider.Browser.BookmarkColumns.URL
+ " ASC");
現(xiàn)在我將分解每一個(gè)操作。你首先要書簽網(wǎng)址列索引。再次,因?yàn)锳ndroid通過SQL格式提供其多數(shù)內(nèi)部數(shù)據(jù)的訪問,你應(yīng)該習(xí)慣于用數(shù)據(jù)庫的方式引你保存的信息。接下來,你將設(shè)置游標(biāo),一個(gè)類似Java ME中RecordStore枚舉對(duì)象,設(shè)置字符串?dāng)?shù)值的映射。因?yàn)槟阒魂P(guān)心列包含的網(wǎng)址,它保存非常簡(jiǎn)單。方法調(diào)用managedQuery是調(diào)用將返回你的數(shù)據(jù)。你可以通過URI中為書簽存儲(chǔ)字符串,交給你了簡(jiǎn)單的映射數(shù)值,不需要where語句,并告訴它按降序排列的網(wǎng)址。
搜索結(jié)果
搜索結(jié)果很簡(jiǎn)單只要迭代游標(biāo)對(duì)象,是通過簡(jiǎn)單的光標(biāo)迭代對(duì)象和退出一列從URL字符串ID你檢索前 :
Cursor results =
android.provider.Browser.getAllBookmarks
(getContentResolver());
int urlColumn =
results.getColumnIndex
(android.provider.Browser.BookmarkColumns.URL);
results.first();
do
{
//url is a method param
//containing what we're looking for
if(results.getString(urlColumn).equals(url))
return false;
} while (results.next());
你可以做更多的基于 URL 的內(nèi)容 , 但現(xiàn)在你會(huì)只是看你的 www.apress.com 鏈接。很明顯,如果此代碼的運(yùn)行是上述Apress網(wǎng)址,你不會(huì)找到它。因?yàn)橛脩粝M砑淤F公司的網(wǎng)址在虛擬的“About” ” 部分中,你也要給他們。
使用Content Resolver添加邪惡公司網(wǎng)址
也許他們不是邪惡,但你加入他們。由于Apress也許是公司最邪惡那里(不是我有偏見,記住),你讓他們擺脫它,只此一次。下面是一個(gè)美麗的ContentReceiver方式添加書簽記錄:
ContentValues inputValues = new ContentValues();
inputValues.put
(android.provider.Browser.BookmarkColumns.BOOKMARK,
"1");
inputValues.put
(android.provider.Browser.BookmarkColumns.URL,
"
inputValues.put
(android.provider.Browser.BookmarkColumns.TITLE,
"Apress, the not so evil company");
ContentResolver cr = getContentResolver();
Uri uri =
cr.insert
(android.provider.Browser.BOOKMARKS_URI,
inputValues);
想大多數(shù)軟件開發(fā)工具包,有不止一種方法來完成相同的任務(wù)。早些時(shí)候,你有更復(fù)雜的方法加書簽。這個(gè)方法是有用的,因?yàn)樗o你一個(gè)參考如何添加元素通過ContentResolver不具有輔助功能。現(xiàn)在,這里的簡(jiǎn)單的方法:android.provider.Browser.saveBookmark(this,“Apress”,url);幫助函數(shù)會(huì)啟動(dòng)一個(gè)對(duì)話框,要求用戶確認(rèn)增加書簽。這可能是最用戶友好的方式來添加書簽,除非你想控制對(duì)話框的模樣。
平衡早餐的組成
在過去的三個(gè)例子你探討了Android的所有主要構(gòu)建模塊。一開始你看到了實(shí)用的啟動(dòng)畫面。這讓你探索了基本知識(shí)關(guān)于啟動(dòng)、維護(hù)和移動(dòng)通過Activity對(duì)象。這是你學(xué)習(xí)intents and interprocess/object communication邁出的第一步。使用和傳遞意圖在活動(dòng),服務(wù),內(nèi)容處理,接收器和意圖之間可能是一個(gè)最重要的事情,這是Android與其他移動(dòng)環(huán)境的區(qū)別。
對(duì)于Activity和通信基礎(chǔ)知識(shí),你已經(jīng)有了經(jīng)驗(yàn),你繼續(xù)學(xué)習(xí)服務(wù)和意圖接收器。要使用這兩個(gè)組成部分,你烹調(diào)了 狡猾的 惡作劇應(yīng)用程序,既能強(qiáng)迫你使用所有3個(gè)組建(活動(dòng),服務(wù),和意圖的接收器),使所有三個(gè)互相溝通。幾乎是旁注,你研究什么需要得到通知時(shí),短信在手機(jī)上到達(dá)。最后,你探討如何檢索和寫入的內(nèi)容是解析器本機(jī)設(shè)備:瀏覽器的書簽數(shù)據(jù)庫。事情的證明并非總是按計(jì)劃進(jìn)行,Android拒絕加入你在一個(gè)新的嘗試通過傳統(tǒng)的書簽內(nèi)容解析方法,該方法forcedthat我已經(jīng)介紹的基本知識(shí),現(xiàn)在是時(shí)候讓手機(jī)用戶在權(quán)衡多一點(diǎn)。
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/lihaifeng555/archive/2009/09/27/4599691.aspx
posted on 2010-05-10 20:51
漂漂 閱讀(1819)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
android 開發(fā)