Android系統(tǒng)中的廣播Broadcast機(jī)制簡(jiǎn)要介紹和學(xué)習(xí)計(jì)劃_第1頁(yè)
Android系統(tǒng)中的廣播Broadcast機(jī)制簡(jiǎn)要介紹和學(xué)習(xí)計(jì)劃_第2頁(yè)
Android系統(tǒng)中的廣播Broadcast機(jī)制簡(jiǎn)要介紹和學(xué)習(xí)計(jì)劃_第3頁(yè)
Android系統(tǒng)中的廣播Broadcast機(jī)制簡(jiǎn)要介紹和學(xué)習(xí)計(jì)劃_第4頁(yè)
Android系統(tǒng)中的廣播Broadcast機(jī)制簡(jiǎn)要介紹和學(xué)習(xí)計(jì)劃_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余12頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、在Android系統(tǒng)中,廣播(Broadcast)是在組件之間傳播數(shù)據(jù)(Intent)的一種機(jī)制;這些組件甚至是可以位于不同的進(jìn)程中,這樣它就像Binder機(jī)制一樣,起到進(jìn)程間通信的作用;本文通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)學(xué)習(xí)Android系統(tǒng)的廣播機(jī)制,為后續(xù)分析廣播機(jī)制的源代碼作準(zhǔn)備。在Android系統(tǒng)中,為什么需要廣播機(jī)制呢?廣播機(jī)制,本質(zhì)上它就是一種組件間的通信方式,如果是兩個(gè)組件位于不同的進(jìn)程當(dāng)中,那么可以用Binder機(jī)制來(lái)實(shí)現(xiàn),如果兩個(gè)組件是在同一個(gè)進(jìn)程中,那么它們之間可以用來(lái)通信的方式就更多了,這樣看來(lái),廣播機(jī)制似乎是多余的。然而,廣播機(jī)制卻是不可替代的,它和Binder機(jī)制不一樣的地

2、方在于,廣播的發(fā)送者和接收者事先是不需要知道對(duì)方的存在的,這樣帶來(lái)的好處便是,系統(tǒng)的各個(gè)組件可以松耦合地組織在一起,這樣系統(tǒng)就具有高度的可擴(kuò)展性,容易與其它系統(tǒng)進(jìn)行集成。在軟件工程中,是非常強(qiáng)調(diào)模塊之間的高內(nèi)聚低耦合性的,不然的話,隨著系統(tǒng)越來(lái)越龐大,就會(huì)面臨著越來(lái)越難維護(hù)的風(fēng)險(xiǎn),最后導(dǎo)致整個(gè)項(xiàng)目的失敗。Android應(yīng)用程序的組織方式,可以說(shuō)是把這種高內(nèi)聚低耦合性的思想貫徹得非常透徹,在任何一個(gè)Activity中,都可以使用一個(gè)簡(jiǎn)單的Intent,通過(guò)startActivity或者startService,就可以把另外一個(gè)Activity或者Service啟動(dòng)起來(lái)為它服務(wù),而且它根本上不依賴

3、這個(gè)Activity或者Service的實(shí)現(xiàn),只需要知道它的字符串形式的名字即可,而廣播機(jī)制更絕,它連接收者的名字都不需要知道。不過(guò)話又說(shuō)回來(lái),廣播機(jī)制在Android系統(tǒng)中,也不算是什么創(chuàng)新的東西。如果讀者了解J2EE或者COM,就會(huì)知道,在J2EE中,提供了消息驅(qū)動(dòng)Bean(Message-DrivenBean),用來(lái)實(shí)現(xiàn)應(yīng)用程序各個(gè)組件之間的消息傳遞;而在COM中,提供了連接點(diǎn)(ConnectionPoint)的概念,也是用來(lái)在應(yīng)用程序各個(gè)組間間進(jìn)行消息傳遞。無(wú)論是J2EE中的消息驅(qū)動(dòng)Bean,還是COM中的連接點(diǎn),或者Android系統(tǒng)的廣播機(jī)制,它們的實(shí)現(xiàn)機(jī)理都是消息發(fā)布/訂閱模式的

4、事件驅(qū)動(dòng)模型,消息的生產(chǎn)者發(fā)布事件,而使用者訂閱感興趣的事件。廢話說(shuō)了一大堆,現(xiàn)在開(kāi)始進(jìn)入主題了,和前面的文章一樣,我們通過(guò)具體的例子來(lái)介紹Android系統(tǒng)的廣播機(jī)制。在這個(gè)例子中,有一個(gè)Service,它在另外一個(gè)線程中實(shí)現(xiàn)了一個(gè)計(jì)數(shù)器服務(wù),每隔一秒鐘就自動(dòng)加1,然后將結(jié)果不斷地反饋給應(yīng)用程序中的界面線程,而界面線程中的Activity在得到這個(gè)反饋后,就會(huì)把結(jié)果顯示在界面上。為什么要把計(jì)數(shù)器服務(wù)放在另外一個(gè)線程中進(jìn)行呢?我們可以把這個(gè)計(jì)數(shù)器服務(wù)想象成是一個(gè)耗時(shí)的計(jì)算型邏輯,如果放在界面線程中去實(shí)現(xiàn),那么勢(shì)必就會(huì)導(dǎo)致應(yīng)用程序不能響應(yīng)界面事件,最后導(dǎo)致應(yīng)用程序產(chǎn)生ANR(Applicatio

5、nNotResponding)問(wèn)題。計(jì)數(shù)器線程為了把加1后的數(shù)字源源不斷地反饋給界面線程,這時(shí)候就可以考慮使用廣播機(jī)制了。首先在Android源代碼工程中創(chuàng)建一個(gè)Android應(yīng)用程序工程,名字就稱為Broadcast吧。關(guān)于如何獲得Android源代碼工程,請(qǐng)參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文;關(guān)于如何在Android源代碼工程中創(chuàng)建應(yīng)用程序工程,請(qǐng)參考在Ubuntu上為Android系統(tǒng)內(nèi)置Java應(yīng)用程序測(cè)試ApplicationFrameworks層的硬件服務(wù)一文。這個(gè)應(yīng)用程序工程定義了一個(gè)名為shy.luo.broadcast的package,這個(gè)例子的

6、源代碼主要就是實(shí)現(xiàn)在這里了。下面,將會(huì)逐一介紹這個(gè)package里面的文件。首先,我們?cè)趕rc/shy/luo/broadcast/ICounterService.java文件中定義計(jì)數(shù)器的服務(wù)接口:viewplain1.packageshy.luo.broadcast;4.publicvoidstartCounter(intinitVal)5.publicvoidstopCounter。;6.3.publicinterfaceICounterService這個(gè)接口很簡(jiǎn)單,它只有兩個(gè)成員函數(shù),分別用來(lái)啟動(dòng)和停止計(jì)數(shù)器;啟動(dòng)計(jì)數(shù)時(shí),還可以指定計(jì)數(shù)器的初始值。接著,我們來(lái)看一個(gè)應(yīng)用程序的默認(rèn)Act

7、ivity的實(shí)現(xiàn),在src/shy/luo/broadcast/MainActivity.java件中:viewplain18.publicclassMainActivityextendsActivityimplementsOnClickListener19.privatefinalstaticStringLOG_TAG="shy.luo.broadcast.MainActivity"1.packageshy.luo.broadcast;2.3.importandroid.app.Activity;4.importandroid.content.BroadcastRecei

8、ver;5.importandroid.content.ComponentName;6.importandroid.content.Context;7.importandroid.content.Intent;8.importandroid.content.IntentFilter;9.importandroid.content.ServiceConnection;10.importandroid.os.Bundle;11.importandroid.os.IBinder;12.importandroid.util.Log;13.importandroid.view.View;14.impor

9、tandroid.view.View.OnClickListener;15.importandroid.widget.Button;16.importandroid.widget.TextView;17.21.privateButtonstartButton=null;22.privateButtonstopButton=null;23.privateTextViewcounterText=null20.;24.25.privateICounterServicecounterService=null;26.27.Override28.publicvoidonCreate(Bundlesaved

10、InstanceState)29.super.onCreate(savedInstanceState);30.setContentView(R.layout.main);31.32.startButton=(Button)findViewById(R.id.button_start);33. stopButton=(Button)findViewById(R.id.button_stop);34. counterText=(TextView)findViewById(R.id.textview_counter);35.36. startButton.setOnClickListener(thi

11、s);37. stopButton.setOnClickListener(this);38.39. startButton.setEnabled(true);40. stopButton.setEnabled(false);41.class);42. IntentbindIntent=newIntent(MainActivity.this,CounterService.43. bindService(bindIntent,serviceConnection,Context.BIND_AUTO_CREATE);44.45. Log.i(LOG_TAG,"MainActivityCrea

12、ted.");46. 47.48. Override49. publicvoidonResume()50. super.onResume();51.52. IntentFiltercounterActionFilter=newIntentFilter(CounterService.BROADCAST_COUNTER_ACTION);53. registerReceiver(counterActionReceiver,counterActionFilter);54. 55.56. Override57. publicvoidonPause()58. super.onPause();59

13、. unregisterReceiver(counterActionReceiver);60. 61.62. Override63. publicvoidonDestroy()64. super.onDestroyO;65. unbindService(serviceConnection);66. 67.68. Override69. publicvoidonClick(Viewv)70. if(v.equals(startButton)71. if(counterService!=null)72. counterService.startCounter(0);73.74. startButt

14、on.setEnabled(false);75. stopButton.setEnabled(true);1.92.)elseif(v.equals(stopButton)if(counterService!=null)counterService.stopCounter();startButton.setEnabled(true);stopButton.setEnabled(false);privateBroadcastReceivercounterActionReceiver=newBroadcas

15、tReceiver()publicvoidonReceive(Contextcontext,Intentintent)intcounter=intent.getIntExtra(CounterService.COUNTER_VALUE,0);Stringtext=String.valueOf(counter);counterText.setText(text);93. Log.i(LOG_TAG,"Receivecounterevent");94. 95. ;96.97. privateServiceConnectionserviceConnection=newServic

16、eConnection()98. publicvoidonServiceConnected(ComponentNameclassName,IBinderservice)99. counterService=(CounterService.CounterBinder)service).getService();100.101. Log.i(LOG_TAG,"CounterServiceConnected");102. 103. publicvoidonServiceDisconnected(ComponentNameclassName)104. counterService=

17、null;105. Log.i(LOG_TAG,"CounterServiceDisconnected");106. 107. ;108. MainActivity的實(shí)現(xiàn)也很簡(jiǎn)單,它在創(chuàng)建(onCreate)的時(shí)候,會(huì)調(diào)用bindService函數(shù)來(lái)把計(jì)數(shù)器服務(wù)(CounterService)啟動(dòng)起來(lái),它的第二個(gè)參數(shù)serviceConnection是一個(gè)ServiceConnection實(shí)例.計(jì)數(shù)器服務(wù)啟動(dòng)起來(lái)后,系統(tǒng)會(huì)調(diào)用這個(gè)實(shí)例的onServiceConnected函數(shù)將一個(gè)Binder對(duì)象傳回來(lái),通過(guò)調(diào)用這個(gè)Binder對(duì)象的getService函數(shù),就可以獲得計(jì)數(shù)

18、器服務(wù)接口。這里,把這個(gè)計(jì)數(shù)器服務(wù)接口保存在MainActivity的counterService成員變量中。同樣,當(dāng)我們調(diào)用unbindService停止計(jì)數(shù)器服務(wù)時(shí),系統(tǒng)會(huì)調(diào)用這個(gè)實(shí)例的onServiceDisconnected函數(shù)告訴MainActivity,它與計(jì)數(shù)器服務(wù)的連接斷開(kāi)了。注意,這里通過(guò)調(diào)用bindService函數(shù)來(lái)啟動(dòng)Service時(shí),這個(gè)Service與啟動(dòng)它的Activity是位于同一個(gè)進(jìn)程中,它不像我們?cè)谇懊嬉黄恼翧ndroid系統(tǒng)在新進(jìn)程中啟動(dòng)自定義服務(wù)過(guò)程(startService)bindService啟動(dòng)服務(wù)的的原理分析中所描述那樣在新的進(jìn)程中啟動(dòng)服務(wù),

19、后面我們?cè)賹懸黄恼聛?lái)分析過(guò)程。在MainActivity的onResume函數(shù)中,通過(guò)調(diào)用registerReceiver函數(shù)注冊(cè)了一個(gè)廣播接收器counterActionReceiver,它是一個(gè)BroadcastReceiver實(shí)例,并且指定了這個(gè)廣播接收器只對(duì)CounterService.BROADCAST_COUNTER_ACTION類型的廣播感興趣。當(dāng)CounterService發(fā)出一個(gè)CounterService.BROADCAST_COUNTER_ACTION類型的廣播時(shí),系統(tǒng)就會(huì)把這個(gè)廣播發(fā)送到counterActionReceiver實(shí)例的onReceiver函數(shù)中去。在o

20、nReceive函數(shù)中,從參數(shù)intent中取出計(jì)數(shù)器當(dāng)前的值,顯示在界面上。MainActivity界面上有兩個(gè)按鈕,分別是StartCounter和StopCounter按鈕,點(diǎn)擊前者開(kāi)始計(jì)數(shù),而點(diǎn)擊后者則停止計(jì)數(shù)。計(jì)數(shù)器服務(wù)CounterService實(shí)現(xiàn)在src/shy/luo/broadcast/CounterService.java文件中:viewplain1.packageshy.luo.broadcast;2.3.importandroid.app.Service;4.importandroid.content.Intent;5.importandroid.os.AsyncTa

21、sk;6.importandroid.os.Binder;7.importandroid.os.IBinder;8.importandroid.util.Log;9.10. publicclassCounterServiceextendsServiceimplementsICounterService11.privatefinalstaticStringLOG_TAG="shy.luo.broadcast.CounterService"12.13.publicfinalstaticStringBROADCAST_COUNTER_ACTION="shy.luo.br

22、oadcast.COUNTER_ACTION"14.publicfinalstaticStringCOUNTER_VALUE="shy.luo.broadcast.counter.value"15.16. privatebooleanstop=false;17.18. privatefinalIBinderbinder=newCounterBinder。;19.20. publicclassCounterBinderextendsBinder21. publicCounterServicegetService。22. returnCounterService.th

23、is;23. 24. 25.26. Override27. publicIBinderonBind(Intentintent)28. returnbinder;29. 30.31. Override32. publicvoidonCreate()33. super.onCreate();34.35. Log.i(LOG_TAG,"CounterServiceCreated.");36. 37.38. Override39. publicvoidonDestroyO40. Log.i(LOG_TAG,"CounterServiceDestroyed.");

24、41. 42.43. publicvoidstartCounter(intinitVal)44. AsyncTask<Integer,Integer,Integer>task=newAsyncTask<Integer,Integer,Integer>045. Override46. protectedIntegerdoInBackground(Integer.vals)47. IntegerinitCounter=vals0;48.49. stop=false;50. while(!stop)51. publishProgress(initCounter);52.53.

25、 try54. Thread.sleep(1000);55. catch(InterruptedExceptione)56. e.printStackTrace();57. 58.59. initCounter+;60. 61.62. returninitCounter;63. 64.65. Override66. protectedvoidonProgressUpdate(Integer.values)67. super.onProgressUpdate(values);68.69. intcounter=values0;70.71. Intentintent=newIntent(BROAD

26、CAST_COUNTER_ACTION);72. intent.putExtra(COUNTER_VALUE,counter);73.74. sendBroadcast(intent);75. 76.77. Override78. protectedvoidonPostExecute(Integerval)79. intcounter=val;80.81. Intentintent=newIntent(BROADCAST_COUNTER_ACTION);82. intent.putExtra(COUNTER_VALUE,counter);83.84. sendBroadcast(intent)

27、;85. 86.87. ;88.89. task.execute(0);90. 91.92. publicvoidstopCounter()93. stop=true;94. 95. 這個(gè)計(jì)數(shù)器服務(wù)實(shí)現(xiàn)了ICounterService接口。當(dāng)這個(gè)服務(wù)被binderService函數(shù)啟動(dòng)時(shí),系統(tǒng)會(huì)調(diào)用它的onBind函數(shù),這個(gè)函數(shù)返回一個(gè)Binder對(duì)象給系統(tǒng)。上面我們說(shuō)到,當(dāng)MainActivity調(diào)用bindService函數(shù)來(lái)啟動(dòng)計(jì)數(shù)器服務(wù)器時(shí),系統(tǒng)會(huì)調(diào)用MainActivity的ServiceConnection實(shí)例serviceConnection的onServiceConnected

28、函數(shù)通知MainActivity,這個(gè)服務(wù)已經(jīng)連接上了,并且會(huì)通過(guò)這個(gè)函數(shù)傳進(jìn)來(lái)一個(gè)Binder遠(yuǎn)程對(duì)象,這個(gè)Binder遠(yuǎn)程對(duì)象就是來(lái)源于這里的onBind的返回值了。函數(shù)onBind返回的Binder對(duì)象是一個(gè)自定義的CounterBinder實(shí)例,它實(shí)現(xiàn)了一個(gè)getService成員函數(shù)。當(dāng)系統(tǒng)通知MainActivity,計(jì)數(shù)器服務(wù)已經(jīng)啟動(dòng)起來(lái)并且連接成功后,并且將這個(gè)Binder對(duì)象傳給MainActivity時(shí),MainActivity就會(huì)把這個(gè)Binder對(duì)象強(qiáng)制轉(zhuǎn)換為CounterBinder實(shí)例,然后調(diào)用它的getService函數(shù)獲得服務(wù)接口。這本MainActivity就

29、通過(guò)這個(gè)Binder對(duì)象和CounterService關(guān)聯(lián)起來(lái)了。當(dāng)MainActivity調(diào)用計(jì)數(shù)器服務(wù)接口的startCounter函數(shù)時(shí),計(jì)數(shù)器服務(wù)并不是直接進(jìn)入計(jì)數(shù)狀態(tài),而是通過(guò)使用異步任務(wù)(AsyncTask)在后臺(tái)線程中進(jìn)行計(jì)數(shù)。這里為什么要使用異步任務(wù)來(lái)在后臺(tái)線程中進(jìn)行計(jì)數(shù)呢?前面我們說(shuō)過(guò),這個(gè)計(jì)數(shù)過(guò)程是一個(gè)耗時(shí)的計(jì)算型邏輯,不能把它放在界面線程中進(jìn)行,因?yàn)檫@里的CounterService啟動(dòng)時(shí),并沒(méi)有在新的進(jìn)程中啟動(dòng),它與MainActivity一樣,運(yùn)行在應(yīng)用程序的界面線程中,因此,這里需要使用異步任務(wù)在在后臺(tái)線程中進(jìn)行計(jì)數(shù)。異步任務(wù)AsyncTask的具體用法可以參考官方

30、文檔務(wù)實(shí)區(qū)J的execute(task.execute)方法時(shí),當(dāng)前調(diào)用線程就返回了,系統(tǒng)啟動(dòng)一個(gè)后臺(tái)線程來(lái)執(zhí)行這個(gè)異步任務(wù)實(shí)例的doInBackground函數(shù),這個(gè)函數(shù)就是我們用來(lái)執(zhí)行耗時(shí)計(jì)算的地方了,它會(huì)進(jìn)入到一個(gè)循環(huán)中,每隔1秒鐘就把計(jì)數(shù)器加1,然后進(jìn)入休眠(Thread.sleep),醒過(guò)來(lái),再重新這個(gè)計(jì)算過(guò)程。在計(jì)算的過(guò)程中,可以通過(guò)調(diào)用publishProgress函數(shù)來(lái)通知調(diào)用者當(dāng)前計(jì)算的進(jìn)度,好讓調(diào)用者來(lái)更新界面,調(diào)用publishProgress函數(shù)的效果最終就是直入到這個(gè)異步任務(wù)實(shí)例的onProgressUpdate函數(shù)中,這里就可以把這個(gè)進(jìn)度值以廣播的形式(sendBr

31、oadcast)發(fā)送出去了,這里的進(jìn)度值就定義為當(dāng)前計(jì)數(shù)服務(wù)的計(jì)數(shù)值。當(dāng)MainActivity調(diào)用計(jì)數(shù)器服務(wù)接口的stopCounter函數(shù)時(shí),會(huì)告訴函數(shù)doInBackground停止執(zhí)行計(jì)數(shù)(stop=true),于是,函數(shù)doInBackground就退出計(jì)數(shù)循環(huán),然后將最終計(jì)數(shù)結(jié)果返回了,返回的結(jié)果最后進(jìn)入到onPostExecute函數(shù)中,這個(gè)函數(shù)同樣通過(guò)廣播的形式(sendBroadcast)把這個(gè)計(jì)數(shù)結(jié)果廣播出去。計(jì)算器服務(wù)就介紹到這里了,下面我們看看應(yīng)用程序的配置文件AndroidManifest.xml:viewplain1. <?xmlversion="1

32、.0"encoding="utf-8"?>2. manifestxmlns:android="3. package="shy.luo.broadcast"4. android:versionCode="1"5. android:versionName="1.0">6. <applicationandroid:icon="drawable/icon"android:label="string/app_name">7. <acti

33、vityandroid:name=".MainActivity"8. android:label="string/app_name">9. <intent-filter>10. <actionandroid:name="ent.action.MAIN"/>11. <categoryandroid:name="ent.category.LAUNCHER"/>12. </intent-filter>13. </act

34、ivity>14. <serviceandroid:name=".CounterService"15. android:enabled="true">16. </service>17. </application>18. /manifest這個(gè)配置文件很簡(jiǎn)單,只是告訴系統(tǒng),它有一個(gè)Activity和一個(gè)Service。再來(lái)看MainActivity的界面文件,它定義在res/layout/main.xml文件中:viewplain1. <?xmlversion="1.0"encoding

35、="utf-8"?>2. <LinearLayoutxmlns:android="3. android:orientation="vertical"4. android:layout_width="fill_parent".5.46.47.android:layout_height=&q

36、uot;fill_parent”android:gravity="center"><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginBottom="10px"android:orientation="horizontal"android:gravity="center"><TextViewandr

37、oid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="4px"android:gravity="center"android:text="string/counter"></TextView><TextViewandroid:id="+id/textview_counter"android:layout_width=&

38、quot;wrap_content"android:layout_height="wrap_content"android:gravity="center"android:text="0"></TextView></LinearLayout><LinearLayoutandroid:layout_widthandroid:layout_heightandroid:orientation="fill_parent"="wrap_content"=&qu

39、ot;horizontal"android:gravity="center"><Buttonandroid:id="+id/button_start"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:text="string/start"></Button><Buttonand

40、roid:id="+id/button_stop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:text="string/stop"></Button></LinearLayout>48.</LinearLayout>這個(gè)界面配置文件也很簡(jiǎn)單,等一下我們?cè)谀M器把這個(gè)應(yīng)用程序啟動(dòng)起來(lái)后,就可以看到

41、它的截圖了。應(yīng)用程序用到的字符串資源文件位于res/values/strings.xml文件中:viewplain1.<?xmlversion="1.0"encoding="utf-8"?>2.<resources>3.<stringname="app_name">Broadcast</string>4.<stringname="counter">Counter:</string>5.<stringname="start&quo

42、t;>StartCounter</string>6.<stringname="stop">StopCounter</string>7.</resources>最后,我們還要在工程目錄下放置一個(gè)編譯腳本文件Android.mk:viewplain1. LOCAL_PATH尸$(callmy-dir)2. include$(CLEAR_VARS)3.4. LOCAL_MODULE_TAGS=optional5.6. LOCAL_SRC_FILES:=$(callall-subdir-java-files)7.8. LOCAL

43、_PACKAGE_NAME=Broadcast9.10. include$(BUILD_PACKAGE)接下來(lái)就要編譯了。有關(guān)如何單獨(dú)編譯Android源代碼工程的模塊,以及如何打包system.img,請(qǐng)參考如何單獨(dú)編譯Android源代碼中的模塊一文。執(zhí)行以下命令進(jìn)行編譯和打包:viewplain1. USER-NAMEMACHINE-NAME:/Android$mmmpackages/experimental/Broadcast2. USER-NAMEMACHINE-NAME:/Android$makesnod這樣,打包女?的Android系統(tǒng)鏡像文件system.img就包含我們前面創(chuàng)

44、建的Broadcast應(yīng)用程序了再接下來(lái),就是運(yùn)行模擬器來(lái)運(yùn)行我們的例子了。關(guān)于如何在Android源代碼工程中運(yùn)行模擬器,請(qǐng)參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文。執(zhí)行以下命令啟動(dòng)模擬器:viewplain1.USER-NAMEMACHINE-NAME:/Android$emulator模擬器啟動(dòng)起,就可以AppLauncher中找到Broadcast應(yīng)用程序圖標(biāo),接著把它啟動(dòng)起來(lái),然后點(diǎn)擊界面上的StartCounter按鈕,就可以把計(jì)數(shù)器服務(wù)啟動(dòng)起來(lái)了,計(jì)數(shù)器服務(wù)又通過(guò)廣播把計(jì)數(shù)值反饋給MainActivity,于是,我們就會(huì)在MainActivity界面看到計(jì)

45、數(shù)器的值不斷地增加了:5S54:<buitd>35ri4:26BroadcastCounter:26StopCounter崢這樣,使用廣播的例子就介紹完了?;仡櫼幌?,使用廣播的兩個(gè)步驟:1.廣播的接收者需要通過(guò)調(diào)用registerReceiver函數(shù)告訴系統(tǒng),它對(duì)什么樣的廣播有興趣,即指定IntentFilter,并且向系統(tǒng)注冊(cè)廣播接收器,即指定BroadcastReceiver:viewplain1. IntentFiltercounterActionFilter=newIntentFilter(CounterService.BROADCAST_COUNTER_ACTION);2. registerReceiver(counterAct

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論