国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Android應(yīng)用中消息傳遞方法分析

2014-07-18 18:46:13史書明
電腦知識(shí)與技術(shù) 2014年13期
關(guān)鍵詞:主線線程調(diào)用

摘要:一個(gè)Android應(yīng)用中存在各種消息,這些消息在不同組件中生成,在Activity界面之間,F(xiàn)ragment之間以及多個(gè)線程間傳遞。程序員需要深入了解Android應(yīng)用中消息產(chǎn)生的原理,并熟練掌握消息傳遞的不同方法,才能合理控制程序運(yùn)行的方向,創(chuàng)作正確的Android手機(jī)端軟件。

關(guān)鍵詞:Android消息傳遞方法;Fragment;Intent;Handler

中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)13-2984-03

Analysis of Messaging Methods in Android

SHI Shu-ming

(School of Computer Information & Engineering, Changzhou Institute of Technology, Changzhou 213002, China)

Abstract: There are lots of message in a Android application, these message are generated in different components, delivered between activities, fragments or threads. A programmer need to understand the principle of product message deeply, and become familiar with different messaging methods, in order to control direction of program running and create correct Android mobile software.

Key words: Messaging methods; Fragment; Intent; Handler

在移動(dòng)互聯(lián)網(wǎng)時(shí)代,移動(dòng)終端的地位變得越來越重要,智能手機(jī)已成為人們?nèi)粘I钪械谋匦杵罚谝苿?dòng)設(shè)備操作系統(tǒng)的開發(fā)是現(xiàn)在程序開發(fā)的新方向。

根據(jù)Nielsen公司2013年6月的調(diào)查,智能機(jī)中53%為Android操作系統(tǒng),領(lǐng)先于Apple IOS, BlackBerry以及Windows Phone等其他手機(jī)操作系統(tǒng)。作為程序開發(fā)人員,掌握Android平臺(tái)下手機(jī)軟件的開發(fā)技術(shù)是勢(shì)在必行的。在Android開發(fā)中,掌握Android消息的處理方法,是從事Android開發(fā)的必備條件。

1 Android應(yīng)用中的消息

一個(gè)Android應(yīng)用中,在不同時(shí)機(jī)都會(huì)有大量的消息生成和傳遞,如圖1所示。①父Activity界面可以向子Activity界面?zhèn)魉徒Y(jié)果,同樣子Activity也可以向父Activity傳遞用戶的選擇。②一個(gè)Activity中可以嵌入多個(gè)Fragment片斷,F(xiàn)ragment接收用戶的操作,并將操作結(jié)果在另一個(gè)Fragment中顯示時(shí),同樣存在著數(shù)據(jù)的傳換。③UI主線程在需要執(zhí)行耗時(shí)任務(wù)時(shí),通常會(huì)啟動(dòng)子線程完成工作,因此子線程與UI主線程之間必然需要信息的互通。

下文,將根據(jù)產(chǎn)生消息組件的類型不同,來說明組件間消息傳遞的方法。

圖1 Android應(yīng)用中消息的傳遞

2 消息傳遞方法

2.1 Activity間消息傳遞方法

一個(gè)Android應(yīng)用,通常會(huì)有多個(gè)界面組成,這些界面即為Activity。在一個(gè)界面中調(diào)用另一個(gè)界面,這兩個(gè)界面即存在父子關(guān)系。父界面要向子界面?zhèn)鬟f結(jié)果信息,或者子界面要向父界面反饋用戶選擇結(jié)果,這時(shí)在兩個(gè)Activity之間負(fù)責(zé)傳遞消息的中介為Intent對(duì)象,如圖2所示。

圖2 Activity消息傳遞

父Activity中通過startActivity(Intent)方法通知Android操作系統(tǒng)要調(diào)用子Activity,并在Intent對(duì)象中放入要傳遞的數(shù)據(jù)。子Activity通常在其onCreate()方法中,獲取Intent對(duì)象,并提取傳遞來的數(shù)據(jù)。

根據(jù)Android 參考文檔(API level 19)中的解釋,Intent類是將要執(zhí)行動(dòng)作的抽象描述,可以用其啟動(dòng)Activity,或與Service交互,或是向BroadcastReceiver組件發(fā)送消息。

Intent最重要的用途是啟動(dòng)Activities,一個(gè)Intent包含的重要信息有兩塊,即action和data。action是指動(dòng)作的簡(jiǎn)要描述,如系統(tǒng)定義的“VIEW_ACTION”為查看;data用Uri的形式表示,描述要action要操作的數(shù)據(jù),如“tel:123”,該Uri數(shù)據(jù)表示電話號(hào)碼123。

Intent除了action和data這兩個(gè)重要屬性外,還有一個(gè)extras屬性,可用于攜帶Bundle類型的額外數(shù)據(jù),我們?cè)贏ctivity間傳遞的數(shù)據(jù)就是通過調(diào)用Intent對(duì)象的putExtras(Bundle)方法,放入這個(gè)屬性中。下面的示例,將顯示啟動(dòng)一個(gè)子Activity,并將當(dāng)前的時(shí)間作為消息進(jìn)行傳送。

Intent intent=new Intent(FatherActivity.this, SonActivity.class);

/*準(zhǔn)備Bundle數(shù)據(jù)*/

Bundle extras=new Bundle();

extras.putLong("date", SystemClock. elapsedRealtime());

/*向Intent的extras屬性放入傳遞數(shù)據(jù)*/

intent.putExtras(extras);

startActivity(intent);//啟動(dòng)子Activity

子Activity可以onCreate()方法中,通過getInent()獲得傳遞來的Intent對(duì)象,再通過Intent對(duì)象的getExtras()方法把Bundle數(shù)據(jù)取出。具體代碼如下所示:

Intent intent=getIntent();

Bundle data=intent.getExtras();//獲得Intent的extras屬性

long date=data.getLong("date");//取出數(shù)據(jù)

若子Activity需要反饋用戶結(jié)果給父Activity,則需要按以下步驟進(jìn)行:

1) 父Activity以StartActivityForResult(Intent,int requestCode)的方法啟動(dòng)子Activity。

2) 子Activity在合適時(shí)機(jī),通過setResult(int resultCode,Intent),設(shè)置結(jié)果狀態(tài),返回結(jié)果。

3) 父Activity覆寫protected void onActivityResult(int requestCode, int resultCode, Intent data)方法,對(duì)子Activity返回結(jié)果進(jìn)行處理。

父Activity可以啟動(dòng)多個(gè)子Activity,并要求這些子界面返回用戶操作結(jié)果,不同子Activity以用戶自定義的requestCode進(jìn)行區(qū)分。子Activity使用setResult()設(shè)置結(jié)果,這會(huì)激活父界面使用onActivityResult()進(jìn)行事件處理,父界面在使用requestCode區(qū)分子Activity后,就可以用同樣的方法處理Intent中的extras屬性攜帶的數(shù)據(jù)。

2.2 Fragment間消息的傳遞

Fragment是Android3.0新增加的特征,是可以被嵌入在Activity中,響應(yīng)用戶操作的UI組件。一個(gè)Activity界面中可以被嵌入一個(gè)或多個(gè)Fragment。如多標(biāo)簽頁面,或者平板電腦中大用戶界面的分塊顯示都需要用到Fragment。當(dāng)在多個(gè)Fragment之間切換,并進(jìn)行數(shù)據(jù)交換時(shí),可以直接調(diào)用Fragment對(duì)象上setArguments(Bundle)方法設(shè)置數(shù)據(jù),在目標(biāo)Fragment中使用getArguments()來獲取數(shù)據(jù)。

下面的例子假設(shè)Activity上有兩個(gè)Fragment。當(dāng)前顯示的是Fragment1,當(dāng)界面組件從Fragment1切換至Fragment2時(shí),數(shù)據(jù)會(huì)需要從Fragment1傳送到Fragment2。

/*在Fragment1的相應(yīng)方法中*/

FragmentTransaction tra = getFragmentManager().beginTransaction();

Fragment fragment=new Fragment2();//初始化Fragment對(duì)象為Fragement2

Bundle args=new Bundle();

args.putLong("date", SystemClock.elapsedRealtime());

/*向Fragment2設(shè)置傳遞數(shù)據(jù)*/

fragment.setArguments(args);

tra.replace(R.id.fragment, fragment);//替換當(dāng)前Fragment

tra.commit();

Activity中要進(jìn)行Fragment的各項(xiàng)操作,要先獲取FragmentTransaction對(duì)象,并使用它的add(),replace()或remove()方法對(duì)界面組件進(jìn)行添加,替換或刪除操作,并在最后使用FragmentTransaction對(duì)象的commit()方法讓Fragment操作執(zhí)行。從以上代碼可知,F(xiàn)ragment2即將要顯示在界面上。

Fragment要獲取其他片斷傳遞來的數(shù)據(jù),通常在onCreateView()方法中實(shí)現(xiàn)代碼,通過調(diào)用繼承的getArguments()方法就能獲得Bundle數(shù)據(jù)。

2.3 線程Thread間消息的傳遞

Android支持多線程編程,即一個(gè)應(yīng)用程序中可以創(chuàng)建多個(gè)線程,同時(shí)執(zhí)行多個(gè)任務(wù)。我們經(jīng)常會(huì)把耗時(shí)的工作放在子線程中執(zhí)行,避免UI界面延遲對(duì)用戶操作的響應(yīng),當(dāng)子線程執(zhí)行完畢后,可能有結(jié)果需要反饋給UI線程進(jìn)行界面的更新。當(dāng)然除了子線程需要返回?cái)?shù)據(jù)給UI線程,多個(gè)子線程之間可能也需要數(shù)據(jù)的交換,線程間消息傳遞的橋梁,是名為Handler的類。

Handler類的主要作用有兩個(gè),一個(gè)是向Handler類所在線程發(fā)送消息,另一個(gè)是幫助所在線程獲取和處理消息,如圖3所示。

圖3 Handler工作原理

為了更好的理解Handler工作原理,需要了解與Handler一起工作的三個(gè)組件,分別是Message,Looper以及MessageQueue。

1) Message:是Handler接收和處理的消息對(duì)象。

2) MessageQueue:是消息隊(duì)列,存放Message,并由Looper不斷進(jìn)行讀取。

3) Looper:Looper類有一個(gè)loop()方法,用一個(gè)死循環(huán)不斷取出MessageQueue中的消息,并將取出的消息分給該消息對(duì)應(yīng)的Handler進(jìn)行處理。每個(gè)線程都只能有一個(gè)Looper對(duì)象。

如果線程需要獲取其他線程的消息,就需要在線程中創(chuàng)建Looper對(duì)象以及Handler對(duì)象,Looper對(duì)象,需要使用Looper.prepare()方法創(chuàng)建,一旦Looper對(duì)象初始化成功,系統(tǒng)會(huì)同時(shí)創(chuàng)建為線程創(chuàng)建MessageQueue對(duì)象。唯一例外的線程是UI主線程,Android系統(tǒng)在UI主線程中已經(jīng)初始化了一個(gè)Looper對(duì)象,因此當(dāng)UI主線程需要獲取其他線程消息時(shí),只要?jiǎng)?chuàng)建Handler對(duì)象即可。

下面的示例代碼,用于非UI線程接受其他子線程的消息。需要提醒的是Looper對(duì)象的創(chuàng)建不能放在子線程的構(gòu)造方法中,必須放在run()方法內(nèi)。

public class MyThread implements Runnable {

public Handler threadHandler;//定義Handler對(duì)象為public的訪問級(jí)別

@Override

public void run() {

Looper.prepare();//創(chuàng)建Looper對(duì)象

threadHandler=new Handler(){//創(chuàng)建Handler對(duì)象

@Override

public void handleMessage(Message getmsg) {

//消息的處理

}};

Looper.loop();//啟動(dòng)Looper對(duì)象進(jìn)行消息檢查

}}

若其他線程向示例中的MyThread線程發(fā)送消息,則要調(diào)用MyThread對(duì)象.threadHandler. sendMessage(Message)方法,因此子線程的Handler對(duì)象的訪問級(jí)別最好設(shè)置為public,對(duì)便其他子線程方便調(diào)用。子線程中的Looper對(duì)象在MessageQueue 發(fā)現(xiàn)新消息后,會(huì)通知Handler對(duì)象調(diào)用 handleMessage()方法進(jìn)行處理。

3 結(jié)束語

在我們實(shí)際的手機(jī)應(yīng)用編程中,消息的處理非常廣泛,比如用戶配置界面向主界面返回配置數(shù)據(jù),游戲程序中游戲狀態(tài)需要周期性地更新UI,又如網(wǎng)絡(luò)數(shù)據(jù)的獲取反饋等。該文詳細(xì)介紹并分析了Activity界面、Fragment片斷以及線程Thread之間信息傳遞的原理和方法,對(duì)提升程序員的Android手機(jī)程序編制水平是非常有幫助的。 (下轉(zhuǎn)第3008頁)

(上接第2986頁)

參考文獻(xiàn):

[1] 紀(jì)曉陽.線程在Android開發(fā)中的應(yīng)用[J].軟件,2013,34(8):24-26.

[2] 解志群.Android多線程與消息循環(huán)[J].電子世界,2013(19):87-88.

[3] 李剛.瘋狂Android講義[M].北京:電子工業(yè)出版社,2013.

[4] 楊豐盛.Android 技術(shù)內(nèi)幕[M].北京:機(jī)械工業(yè)出版社,2011.endprint

1) Message:是Handler接收和處理的消息對(duì)象。

2) MessageQueue:是消息隊(duì)列,存放Message,并由Looper不斷進(jìn)行讀取。

3) Looper:Looper類有一個(gè)loop()方法,用一個(gè)死循環(huán)不斷取出MessageQueue中的消息,并將取出的消息分給該消息對(duì)應(yīng)的Handler進(jìn)行處理。每個(gè)線程都只能有一個(gè)Looper對(duì)象。

如果線程需要獲取其他線程的消息,就需要在線程中創(chuàng)建Looper對(duì)象以及Handler對(duì)象,Looper對(duì)象,需要使用Looper.prepare()方法創(chuàng)建,一旦Looper對(duì)象初始化成功,系統(tǒng)會(huì)同時(shí)創(chuàng)建為線程創(chuàng)建MessageQueue對(duì)象。唯一例外的線程是UI主線程,Android系統(tǒng)在UI主線程中已經(jīng)初始化了一個(gè)Looper對(duì)象,因此當(dāng)UI主線程需要獲取其他線程消息時(shí),只要?jiǎng)?chuàng)建Handler對(duì)象即可。

下面的示例代碼,用于非UI線程接受其他子線程的消息。需要提醒的是Looper對(duì)象的創(chuàng)建不能放在子線程的構(gòu)造方法中,必須放在run()方法內(nèi)。

public class MyThread implements Runnable {

public Handler threadHandler;//定義Handler對(duì)象為public的訪問級(jí)別

@Override

public void run() {

Looper.prepare();//創(chuàng)建Looper對(duì)象

threadHandler=new Handler(){//創(chuàng)建Handler對(duì)象

@Override

public void handleMessage(Message getmsg) {

//消息的處理

}};

Looper.loop();//啟動(dòng)Looper對(duì)象進(jìn)行消息檢查

}}

若其他線程向示例中的MyThread線程發(fā)送消息,則要調(diào)用MyThread對(duì)象.threadHandler. sendMessage(Message)方法,因此子線程的Handler對(duì)象的訪問級(jí)別最好設(shè)置為public,對(duì)便其他子線程方便調(diào)用。子線程中的Looper對(duì)象在MessageQueue 發(fā)現(xiàn)新消息后,會(huì)通知Handler對(duì)象調(diào)用 handleMessage()方法進(jìn)行處理。

3 結(jié)束語

在我們實(shí)際的手機(jī)應(yīng)用編程中,消息的處理非常廣泛,比如用戶配置界面向主界面返回配置數(shù)據(jù),游戲程序中游戲狀態(tài)需要周期性地更新UI,又如網(wǎng)絡(luò)數(shù)據(jù)的獲取反饋等。該文詳細(xì)介紹并分析了Activity界面、Fragment片斷以及線程Thread之間信息傳遞的原理和方法,對(duì)提升程序員的Android手機(jī)程序編制水平是非常有幫助的。 (下轉(zhuǎn)第3008頁)

(上接第2986頁)

參考文獻(xiàn):

[1] 紀(jì)曉陽.線程在Android開發(fā)中的應(yīng)用[J].軟件,2013,34(8):24-26.

[2] 解志群.Android多線程與消息循環(huán)[J].電子世界,2013(19):87-88.

[3] 李剛.瘋狂Android講義[M].北京:電子工業(yè)出版社,2013.

[4] 楊豐盛.Android 技術(shù)內(nèi)幕[M].北京:機(jī)械工業(yè)出版社,2011.endprint

1) Message:是Handler接收和處理的消息對(duì)象。

2) MessageQueue:是消息隊(duì)列,存放Message,并由Looper不斷進(jìn)行讀取。

3) Looper:Looper類有一個(gè)loop()方法,用一個(gè)死循環(huán)不斷取出MessageQueue中的消息,并將取出的消息分給該消息對(duì)應(yīng)的Handler進(jìn)行處理。每個(gè)線程都只能有一個(gè)Looper對(duì)象。

如果線程需要獲取其他線程的消息,就需要在線程中創(chuàng)建Looper對(duì)象以及Handler對(duì)象,Looper對(duì)象,需要使用Looper.prepare()方法創(chuàng)建,一旦Looper對(duì)象初始化成功,系統(tǒng)會(huì)同時(shí)創(chuàng)建為線程創(chuàng)建MessageQueue對(duì)象。唯一例外的線程是UI主線程,Android系統(tǒng)在UI主線程中已經(jīng)初始化了一個(gè)Looper對(duì)象,因此當(dāng)UI主線程需要獲取其他線程消息時(shí),只要?jiǎng)?chuàng)建Handler對(duì)象即可。

下面的示例代碼,用于非UI線程接受其他子線程的消息。需要提醒的是Looper對(duì)象的創(chuàng)建不能放在子線程的構(gòu)造方法中,必須放在run()方法內(nèi)。

public class MyThread implements Runnable {

public Handler threadHandler;//定義Handler對(duì)象為public的訪問級(jí)別

@Override

public void run() {

Looper.prepare();//創(chuàng)建Looper對(duì)象

threadHandler=new Handler(){//創(chuàng)建Handler對(duì)象

@Override

public void handleMessage(Message getmsg) {

//消息的處理

}};

Looper.loop();//啟動(dòng)Looper對(duì)象進(jìn)行消息檢查

}}

若其他線程向示例中的MyThread線程發(fā)送消息,則要調(diào)用MyThread對(duì)象.threadHandler. sendMessage(Message)方法,因此子線程的Handler對(duì)象的訪問級(jí)別最好設(shè)置為public,對(duì)便其他子線程方便調(diào)用。子線程中的Looper對(duì)象在MessageQueue 發(fā)現(xiàn)新消息后,會(huì)通知Handler對(duì)象調(diào)用 handleMessage()方法進(jìn)行處理。

3 結(jié)束語

在我們實(shí)際的手機(jī)應(yīng)用編程中,消息的處理非常廣泛,比如用戶配置界面向主界面返回配置數(shù)據(jù),游戲程序中游戲狀態(tài)需要周期性地更新UI,又如網(wǎng)絡(luò)數(shù)據(jù)的獲取反饋等。該文詳細(xì)介紹并分析了Activity界面、Fragment片斷以及線程Thread之間信息傳遞的原理和方法,對(duì)提升程序員的Android手機(jī)程序編制水平是非常有幫助的。 (下轉(zhuǎn)第3008頁)

(上接第2986頁)

參考文獻(xiàn):

[1] 紀(jì)曉陽.線程在Android開發(fā)中的應(yīng)用[J].軟件,2013,34(8):24-26.

[2] 解志群.Android多線程與消息循環(huán)[J].電子世界,2013(19):87-88.

[3] 李剛.瘋狂Android講義[M].北京:電子工業(yè)出版社,2013.

[4] 楊豐盛.Android 技術(shù)內(nèi)幕[M].北京:機(jī)械工業(yè)出版社,2011.endprint

猜你喜歡
主線線程調(diào)用
核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
人物報(bào)道的多維思考、主線聚焦與故事呈現(xiàn)
活力(2019年17期)2019-11-26 00:42:32
更加突出主線 落實(shí)四個(gè)到位 推動(dòng)主題教育取得實(shí)實(shí)在在成效
LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
數(shù)字主線
淺談linux多線程協(xié)作
基于系統(tǒng)調(diào)用的惡意軟件檢測(cè)技術(shù)研究
下沉和整合 遼寧醫(yī)改主線
利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
Linux線程實(shí)現(xiàn)技術(shù)研究
梅河口市| 轮台县| 石楼县| 卓资县| 余姚市| 油尖旺区| 雷波县| 策勒县| 宁陕县| 平武县| 托克托县| 将乐县| 嘉鱼县| 浑源县| 盐源县| 鄂温| 旬阳县| 中西区| 无极县| 贵南县| 库伦旗| 乌鲁木齐市| 镇江市| 中西区| 广安市| 瑞昌市| 申扎县| 万荣县| 平乐县| 嫩江县| 枝江市| 乐陵市| 汶上县| 平凉市| 扬中市| 广饶县| 丹棱县| 华亭县| 雅安市| 肇庆市| 南丰县|