2021電大《Android網(wǎng)絡(luò)開發(fā)技術(shù)》形考任務(wù)一、二、三、四、五、六答案_第1頁
2021電大《Android網(wǎng)絡(luò)開發(fā)技術(shù)》形考任務(wù)一、二、三、四、五、六答案_第2頁
2021電大《Android網(wǎng)絡(luò)開發(fā)技術(shù)》形考任務(wù)一、二、三、四、五、六答案_第3頁
2021電大《Android網(wǎng)絡(luò)開發(fā)技術(shù)》形考任務(wù)一、二、三、四、五、六答案_第4頁
2021電大《Android網(wǎng)絡(luò)開發(fā)技術(shù)》形考任務(wù)一、二、三、四、五、六答案_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2021國(guó)家開放大學(xué)電大Undroid網(wǎng)絡(luò)開發(fā)技術(shù)》

形考任務(wù)一、二、三、四、五、六答案

形考任務(wù)一教學(xué)實(shí)踐1

完成以下JSON的解析,完成主體代碼即可,解析方法及庫(kù)不限。

一、什么是JSON?

JSON是一種取代XML的數(shù)據(jù)結(jié)構(gòu),和xml相比,它更小巧但描述能力卻不差,由于它的小巧所以網(wǎng)絡(luò)傳輸數(shù)據(jù)將減少

更多流量從而加快速度。

JSON就是一串字符串只不過元素會(huì)使用特定的符號(hào)標(biāo)注。

{}雙括號(hào)表示對(duì)象

[]中括號(hào)表示數(shù)組

""雙引號(hào)內(nèi)是屬性或值

:冒號(hào)表示后者是前者的值(這個(gè)值可以是字符串、數(shù)字、也可以是另一個(gè)數(shù)組或?qū)ο?

所以{"name":"Michael")可以理解為是一個(gè)包含name為Michael的對(duì)象

而[{"name":"Michael"},{"name":"Jerry"}]就表示包含兩個(gè)對(duì)象的數(shù)組

當(dāng)然了,你也可以使用{"name":["Michael","Jerry"]}來簡(jiǎn)化上面一部,這是一個(gè)擁有?個(gè)name數(shù)組的對(duì)象

二、JSON解析之傳統(tǒng)的JSON解析

1、生成json字符串

publicstaticStringcreateJsonString(Stringkey,Objectvalue){

JSONObjectjsonObject=newJSONObject();

jsonObject.put(key,value);

returnjsonObject.toString();

}

2、解析JSON字符串

分為以下三種情況,一個(gè)JavaBean,一個(gè)List數(shù)組,一個(gè)嵌套Map的List數(shù)組:

importjava.util.ArrayList;

importjava.util.HashMap;

importjava.util.Iterator;

importjava.util.List;

importjava.util.Map;

importorg.json.JSONArray;

importorg.json.JSONObject;

importcom.android.myjson.domain.Person;

/**

*完成對(duì)json數(shù)據(jù)的解析

*

*/

publicclassJsonTdols{

publicstaticPersongetPerson(Stringkey,StringjsonString){

Personperson=newPerson();

try(

JSONObjectjsonObject=newJSONObject(jsonString);

JSONObjectpersonobject=jsonObject.getJSONObject(nperson");

person.setld(personObject.getlnt("id"));

person.setName(personObject.getString("name"));

person.setAddress(personObject.getString("address"));

}catch(Exceptione){

//TODO:handleexception

)

returnperson;

)

publicstaticListgetPersons(Stringkey,StringjsonString){

Listlist=newArrayList();

try(

JSONObjectjsonObject=newJSONObject(jsonString);

//返回json的數(shù)組

JSONArrayjsonArray=jsonObject.getJSONArray(key);

for(inti=0;i<jsonArray.length();i++){

JSONObjectjsonObject?=jsonArray.getJSONObject(i);

Personperson=newPerson();

person.setld(jsonObject2.getlnt("id"));

person.setName(jsonObject2.getString("name"));

person.setAddress(jsonObject2.getString("address"));

list.add(person);

)

}catch(Exceptione){

//TODO:handleexception

)

returnlist;

)

publicstaticListgetList(Stringkey,StringjsonString){

Listlist=newArrayList();

try(

JSONObjectjsonObject=newJSONObject(jsonString);

JSONArrayjsonArray=jsonObject.getJSONArray(key);

for(inti=0;i<jsonArray.length();i++){

Stringmsg=jsonArray.getString(i);

list.add(msg);

)

}catch(Exceptione){

//TODO:handleexception

)

returnlist;

)

publicstaticUst>listKeyMaps(Stringkey,

StringjsonString){

List>list=newArrayList>();

try{

JSONObjectjsonObject=newJSONObject(jsonString);

JSONArrayjsonArray=jsonObject.getJSONArray(key);

for(inti=0;i<jsonArray.length();i++){

JSONObjectjsonObject2=jsonArray.getJSONObject(i);

Mapmap=newHashMap();

Iteratoriterator=jsonObject2.keys();

while(iterator.hasNext()){

Stringjson_key=iterator.next();

Objectjson_value=jsonObject2.get(json_key);

if(json-value==null){

json_value=M";

)

map.put(json_key/json_value);

)

list.add(map);

)

}catch(Exceptione){

//TODO:handleexception

}

returnlist;

)

}

三、JSON解析之GSON

1、生成JSON字符串

importcom.google.gson.Gson;

publicclassJsonUtils{

publicstaticStringcreateJsonObject(Objectobj){

Gsongson=newGson();

Stringstr=gson.toJson(obj);

returnstr;

)

}

二、解析JSON

importjava.util.ArrayList;

importjava.util.List;

importjava.util.Map;

importcom.google.gson.Gson;

importcom.google.gson.reflect.TypeToken;

publicclassGsonTools{

publicGsonTools(){

〃TODOAuto-generatedconstructorstub

)

/**

*@param

*@paramjsonString

*@paramcis

*@return

*/

publicstaticTgetPerson(StringjsonString,Classcis){

Tt=null;

try(

Gsongson=newGson();

t=gson.fromJson(jsonString,cis);

}catch(Exceptione){

//TODO:handleexception

)

returnt;

)

/**

*使用Gson進(jìn)行解析List

*

*@param

*@paramjsonString

*@paramcis

*@return

*/

publicstaticListgetPersons(StringjsonString,Classcis){

Listlist=newArrayList();

try(

Gsongson=newGson();

list=gson.fromJson(jsonString,newTypeToken>(){

}.getType());

}catch(Exceptione){

)

returnlist;

)

/**

*@paramjsonString

*@return

*/

publicstaticListgetList(StringjsonString){

Listlist=newArrayList();

try{

Gsongson=newGson();

list=gson.fromJsonfjsonString,newTypeToken>(){

}.getType());

}catch(Exceptione){

//TODO:handleexception

}

returnlist;

}

publicstaticList>listKeyMaps(StringjsonString){

List>list=newArrayList>();

try(

Gsongson=newGson();

list=gson.fromJson(jsonStringz

newTypeToken?(){

}.getType());

}catch(Exceptione){

//TODO:handleexception

}

returnlist;

)

}

三、JSON解析之FastlSON

importjava.util.ArrayList;

importjava.util.List;

importjava.util.Map;

importcom.alibaba.fastjson.JSON;

importcom.alibaba.fastjson.TypeReference;

publicclassJsonTool{

publicstaticTgetPerson(Stringjsonstring,Classcis){

Tt=null;

try(

t=JSON.parseObject(jsonstring,cis);

}catch(Exceptione){

//TODO:handleexception

)

returnt;

)

publicstaticListgetPersonList(Stringjsonstring,Classcis){

Listlist=newArrayList();

try(

list=JSON.parseArray(jsonstring,cis);

}catch(Exceptione){

11TODO:handleexception

)

returnlist;

)

publicstaticList>getPersonListMapl(

Stringjsonstring){

List>list=newArrayList>();

try(

list=JSON.parseObject(jsonstring,

newTypeReference?(){

}.getType());

}catch(Exceptione){

//TODO:handleexception

)

returnlist;

)

總結(jié):

JSON對(duì)于移動(dòng)設(shè)備來說,尤其對(duì)于網(wǎng)絡(luò)環(huán)境較差和流量限制的情況下,相對(duì)于XML格式的數(shù)據(jù)傳輸會(huì)更節(jié)省流量,

傳輸效率更高。在這三種解析方式中FastJson是效率最高的,推薦使用

形考任務(wù)二教學(xué)實(shí)踐2

在AndroidManifest.xml中注冊(cè)廣播接收器BootBroadcastReceivero

BroadcastReceiver廣播接收器

用于監(jiān)聽/接受Android應(yīng)用分發(fā)的各類廣播并做出相應(yīng)的響應(yīng)

應(yīng)用場(chǎng)景:

?監(jiān)聽系統(tǒng)事件:如開機(jī)廣播,網(wǎng)絡(luò)鏈接與斷開,屏幕轉(zhuǎn)向燈

?不同組件間(Activity/Service,包括不同APP間)的通信

?多線程通信

先自定義一個(gè)廣播接收器,創(chuàng)建MyBroadcastReceiver類來繼承廣播接收器類,并實(shí)現(xiàn)它內(nèi)部的方法

publicclassMyBroadcastReceiverextendsBroadcastReceiver{

@Override

publicvoidonReceive(Contextcontext,Intentintent){

}

)

1

2

3

?4

?5

?6

廣播接收器的注冊(cè)方法分為靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)兩種方式

靜態(tài)注冊(cè)

在AndroidManifest.xml文件的〈application〉標(biāo)簽內(nèi)聲明

<!-靜態(tài)注冊(cè)廣播接收器

<receiverandroid:name=".MyBroadcastReceiver">

<!-接受哪些廣播f

<intent-filter>

<!-開機(jī)廣播->

octionandroid:name="ent.action.BOOT_COMPLETED'7>

v!--電量低廣播

<actionandroid:name="ent.action.BATTERY_LOW"/>

</intent-filter>

</receiver>

?1

?2

?3

?4

?5

?6

?7

?8

?9

?10

?11

?12

完成注冊(cè)后就可以在MyBroadcastReceiver類中接受廣播實(shí)現(xiàn)相關(guān)功能

publicclassMyBroadcastReceiverextendsBroadcastReceiver{

privatestaticfinalStringTAG="MyBroadcastReceiver";

(?Override

publicvoidonReceive(Contextcontext,Intentintent){

//接受廣播

if(intent!=null){

//接收到的什么廣播(廣播的名稱)

Stringaction=intent.getAction();

Log.d(7AGz"onReceive:"+action);

)

)

)

?1

?2

?3

?4

?5

?6

?7

?8

?9

?10

?11

?12

?13

?14

這里已經(jīng)可以通過意圖對(duì)象來接受廣播信息并進(jìn)行處理了

動(dòng)態(tài)注冊(cè)

動(dòng)態(tài)注冊(cè)在onCreate。方法里進(jìn)行注冊(cè)

(?Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedlnstanceState);

setContentView(R.layout.activity_main);

//新建一個(gè)廣播接收器

broadcastReceiver=newMyBroadcastReceiver();

//要接收哪些廣播

IntentFilterintentFilter=newlntentFilter();

III電量低廣播

intentFilter.addAction(lntent.ACTION_BATTERY_LOW);

//注冊(cè)廣播接收器

registerReceiver(broadcastReceivecintentFilter);

)

?1

?2

?3

?4

?5

?6

?7

?8

?9

?10

?11

?12

?13

?14

?15

?16

動(dòng)態(tài)注冊(cè)的廣播接收器必須要在onDestroy()方法里面取消注冊(cè)注冊(cè)和取消注冊(cè)要一一對(duì)應(yīng),不然會(huì)報(bào)錯(cuò),內(nèi)存會(huì)

泄漏

@Override

protectedvoidonDestroy(){

super.onDestroy();

//取消注冊(cè)廣播接收器

if(broadcastReceiver!=null){

unregisterReceiver(broadcastReceiver);

1

2

3

4

5

6

7

8

動(dòng)態(tài)注冊(cè)不需要在AndroidManifest.xml文件里聲明,直接通過代碼進(jìn)行注冊(cè)。對(duì)于接收廣播進(jìn)行處理也是在創(chuàng)建的

MyBroadcastReceiver類里面,這點(diǎn)跟靜態(tài)注冊(cè)一樣

廣播生命周期

BroadcastReceiver的生命周期很短暫,該類的onReceive()方法是運(yùn)行在主線程中,如果在該方法里的操作超過了10s,

會(huì)阻塞主線程,出現(xiàn)ANR程序無響應(yīng)情況如果需要進(jìn)行耗時(shí)操作,可以通過Intent傳遞給Service進(jìn)行處理,盡量

不要在該方法中開啟線程進(jìn)行處理,否則10s后,該線程有可能會(huì)變陳空線程,導(dǎo)致任務(wù)丟失。

形考任務(wù)三階段性測(cè)試1

Android中保存某個(gè)運(yùn)行狀態(tài)和用戶信息,最好使用()o

正確答案是:SharedPreferences存儲(chǔ)

SharedPreference存儲(chǔ)數(shù)據(jù),最后提交數(shù)據(jù)時(shí),推薦使用()。

正確答案是:commitO

使用SQLite讀取數(shù)據(jù)內(nèi)容時(shí),用到的核心類是()。

正確答案是:Contentvalues

自定義Service時(shí),必須實(shí)現(xiàn)的方法是()。

正確答案是:onCreate()

使用Mediaplayer開始播放音視頻的方法是()。

正確答案是:prepare()

自定義View時(shí)必須實(shí)現(xiàn)的方法是()o

正確答案是:onMeasure()

AndroidAsyncTask異步任務(wù)中,哪個(gè)方法是運(yùn)行在主線程中()

正確答案是:dolnBackground()

Android中開啟事務(wù)的方法正確的是()o

正確答案是:db.beginTransaction()

HTTP是萬維網(wǎng)實(shí)現(xiàn)數(shù)據(jù)通信的基石。它基于()來傳遞數(shù)據(jù)。

正確答案是:TCP/IP

HTTP是()o

正確答案是:不保存狀態(tài)的協(xié)議

URL的一般格式為()

正確答案是:<協(xié)議>:〃<主機(jī)端口>/<路徑>

URL(uniformresourcelocator,統(tǒng)一資源定位符)是互聯(lián)網(wǎng)標(biāo)準(zhǔn)資源的地址。通過一個(gè)URL,能找到()資源。

正確答案是:一個(gè)

下列說法錯(cuò)誤的是()

正確答案是:獲取HttpCIient實(shí)例可以直接newHttpClient()?

以下是Android中用于xml解析方式的是()

正確答案是:XmlPullParser

做網(wǎng)絡(luò)圖片查看器的時(shí)候,需要把獲取的流信息轉(zhuǎn)換為()

正確答案是:Bitmap

關(guān)于Android中消息機(jī)制說法正確的是()

正確答案是:Handler是用來發(fā)送消息和處理消息的。

利用內(nèi)容解析者查詢短信數(shù)據(jù)時(shí)uri怎么寫()

正確答案是:Uriuri=Uri.parse("content:〃sms")

可以在Activity中得到ContentResolver實(shí)例對(duì)象的方法是()

正確答案是:getContentResolver()

可以在Activity中得到ContentResolver實(shí)例對(duì)象的方法是()

正確答案是:getContentResolver()

在下列選項(xiàng)中,關(guān)于內(nèi)容提供者的說法錯(cuò)誤的是()

正確答案是:內(nèi)容提供者只有在AndroidManifest.xml文件中注冊(cè)后才能運(yùn)行。

在下列選項(xiàng)中,用于查詢數(shù)據(jù)的方法是()

正確答案是:query

對(duì)于Android開發(fā)來說,()是網(wǎng)絡(luò)開發(fā)中使用最多、最重要的網(wǎng)絡(luò)通信方式。

正確答案是:HTTP

自定義一個(gè)數(shù)據(jù)適配器MyAdatper,需要讓它繼承的類是()

正確答案是:BaseAdapter

下列方法中,()執(zhí)行時(shí)釋放了鎖。

正確答案是:wait()

AsyncTask中的()方法在子線程中執(zhí)行。

正確答案是:onPostExecute。

一個(gè)AsyncTask對(duì)象可以執(zhí)行多次。()

正確答案是:“錯(cuò)”。

Glide可以設(shè)置緩存模式。()

正確答案是:“錯(cuò)”。

在Service中可以直接進(jìn)行耗時(shí)操作。()

正確答案是:“錯(cuò)”。

Service可以使用Serviceconnection實(shí)現(xiàn)與Activity的交互。()

正確答案是:“錯(cuò)”。

較長(zhǎng)時(shí)間的定時(shí)任務(wù)可以使用Alarm來實(shí)現(xiàn)。()

正確答案是:“錯(cuò)”。

Android中使用openFileOutput(Stringnamejntmode)方法獲取到文件輸出流時(shí),第二個(gè)參數(shù)mode常用模式有4

種。()

正確答案是:“對(duì)”。

Android中創(chuàng)建內(nèi)容提供者要繼承Contentobserver。()

正確答案是:“錯(cuò)”。

Contentprovider在實(shí)際的開發(fā)中不需要注冊(cè),可以直接使用。()

正確答案是:“錯(cuò)”。

Android中數(shù)據(jù)只能存儲(chǔ)到sd卡上。()

正確答案是:“錯(cuò)”。

Android對(duì).png格式的位圖支持最好。()

正確答案是:“對(duì)”。

Android提供的用于媒體播放的類,可播放音頻和視頻,但是僅僅限于MP3和MP4等有限的格式。()

正確答案是:“對(duì)”。

Bitmap包含的圖片可以來自文件,也可以由程序創(chuàng)建。()

正確答案是:“對(duì)”。

Bitmap可以理解為一種為存儲(chǔ)圖形像素而設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)。()

正確答案是:“對(duì)”。

Canvas是一個(gè)操作繪圖的平臺(tái)。()

正確答案是:“對(duì)二

DOM解析使用的是W3c規(guī)范。()

正確答案是:“對(duì)”。

File適用于存儲(chǔ)文本類型數(shù)據(jù)或者二進(jìn)制數(shù)據(jù)。()

正確答案是:“對(duì)”。

JSON中數(shù)據(jù)全部以鍵值對(duì)的方式表示。()

正確答案是:“對(duì)”。

onStartCommand()方法在Service的一個(gè)完整生命周期內(nèi)可能會(huì)被調(diào)用多次。()

正確答案是:“對(duì)”。

onStartCommand。方法在每次啟動(dòng)Service時(shí)都會(huì)被調(diào)用。()

正確答案是:“對(duì)”。

Paint主要的繪圖工具類。()

正確答案是:“對(duì)”。

PULL解析也是一種基于事件流驅(qū)動(dòng)的XML解析方式。()

正確答案是:“對(duì)”。

SharedPreferences所有的信息都是按照key-value的形式保存的。()

正確答案是:“對(duì)”。

在/data/data/包名/cache目錄下可以cache軟件的緩存數(shù)據(jù),當(dāng)清除緩存時(shí)數(shù)據(jù)就會(huì)刪除。()

正確答案是:“對(duì)”。

在Android6.0之后,讀寫文件權(quán)限屬于危險(xiǎn)權(quán)限,需要運(yùn)行動(dòng)態(tài)申請(qǐng)。()

正確答案是:“對(duì)”。

在Android中,如果要實(shí)現(xiàn)配置信息的保存,需要使用SharedPreferences存儲(chǔ)技術(shù)。()

正確答案是:“對(duì)”。

形考任務(wù)四專題討論1

Android系統(tǒng)提供了兩種方式來識(shí)別一個(gè)NFCTag是否為Activity需要處理的內(nèi)容,對(duì)這兩種進(jìn)行討論。

1.NFC是什么

近距離無線通信技術(shù)(NearFieldCommunication,NFC),是由飛利浦公司和索尼公司共同開發(fā)的一種非接觸式識(shí)別和

互聯(lián)技術(shù),可以在移動(dòng)設(shè)備、消費(fèi)類電子產(chǎn)品、PC和智能設(shè)備間進(jìn)行近距離無線通信。NFC提供了一種簡(jiǎn)單的、非

觸控式的解決方案,可以讓消費(fèi)者簡(jiǎn)單直觀地交換信息、訪問內(nèi)容與服務(wù)。NFC整合了非接觸式讀卡器、非接觸式

智能卡和點(diǎn)對(duì)點(diǎn)(Peer-to-Peer)通信功能,為消費(fèi)者開創(chuàng)了全新的便捷生活方式。手機(jī)和NFC技術(shù)的結(jié)合,將會(huì)給

消費(fèi)者提供極大的生活便利,例如移動(dòng)支付、位置服務(wù)信息、身份識(shí)別、公共交通卡等應(yīng)用,在醫(yī)療保健、優(yōu)惠券、

智能海報(bào)等許多領(lǐng)域有也有巨大的應(yīng)用潛力。

2.NFC的三種工作方式

1.讀卡器模式

數(shù)據(jù)在NFC芯片中,可以簡(jiǎn)單理解成“刷標(biāo)簽"。本質(zhì)上就是通過支持NFC的手機(jī)或其它電子設(shè)備從帶有NFC芯片的

標(biāo)簽、貼紙、名片等媒介中讀寫信息。通常NFC標(biāo)簽是不需要外部供電的。當(dāng)支持NFC的外設(shè)向NFC讀寫數(shù)據(jù)時(shí),

它會(huì)發(fā)送某種磁場(chǎng),而這個(gè)磁場(chǎng)會(huì)自動(dòng)的向NFC標(biāo)簽供電。

2.仿真卡模式

數(shù)據(jù)在支持NFC的手機(jī)或其它電子設(shè)備中,可以簡(jiǎn)單理解成"刷手機(jī)"。本質(zhì)上就是將支持NFC的手機(jī)或其它電子設(shè)

備當(dāng)成借記卡、公交卡、門禁卡等IC卡使用。基本原理是將相應(yīng)IC卡中的信息憑證封裝成數(shù)據(jù)包存儲(chǔ)在支持NFC

的外設(shè)中。

在使用時(shí)還需要一個(gè)NFC射頻器(相當(dāng)于刷卡器)。將手機(jī)靠近NFC射頻器,手機(jī)就會(huì)接收到NFC射頻器發(fā)過來的

信號(hào),在通過一系列復(fù)雜的驗(yàn)證后,將IC卡的相應(yīng)信息傳入NFC射頻器,最后這些IC卡數(shù)據(jù)會(huì)傳入NFC射頻器連

接的電腦,并進(jìn)行相應(yīng)的處理(如電子轉(zhuǎn)帳、開門等操作)。

3.點(diǎn)對(duì)點(diǎn)模式

該模式與藍(lán)牙、紅外差不多,用于不同NFC設(shè)備之間進(jìn)行數(shù)據(jù)交換,不過這個(gè)模式已經(jīng)沒有有"刷"的感覺了。其有

效距離一般不能超過4厘米,但傳輸建立速度要比紅外和藍(lán)牙技術(shù)快很多,傳輸速度比紅外塊得多,如過雙方都使

用Android4.2,NFC會(huì)直接利用藍(lán)牙傳輸。這種技術(shù)被稱為AndroidBeam。所以使用AndroidBeam傳輸數(shù)據(jù)的兩部

設(shè)備不再限于4厘米之內(nèi)。

點(diǎn)對(duì)點(diǎn)模式的典型應(yīng)用是兩部支持NFC的手機(jī)或平板電腦實(shí)現(xiàn)數(shù)據(jù)的點(diǎn)對(duì)點(diǎn)傳輸,例如,交換圖片或同步設(shè)備聯(lián)系

人。因此,通過NFC,多個(gè)設(shè)備如數(shù)字相機(jī),計(jì)算機(jī),手機(jī)之間,都可以快速連接,并交換資料或者服務(wù)。

3.NDEF是什么?

不同的NFC標(biāo)簽之間差異很大,有的只支持簡(jiǎn)單的讀寫操作,有時(shí)還會(huì)采用支持一次性寫入的芯片,將NFC標(biāo)簽設(shè)

計(jì)成只讀的。當(dāng)然,也存在一些復(fù)雜的NFC標(biāo)簽,例如,有一些NFC標(biāo)簽可以通過硬件加密的方式限制對(duì)某一區(qū)域

的訪問。還有一些標(biāo)簽自帶操作環(huán)境,允許NFC設(shè)備與這些標(biāo)簽進(jìn)行更復(fù)雜的交互。這些標(biāo)簽中的數(shù)據(jù)也會(huì)采用不

同的格式。但AndroidSDKAPI主要支持NFC論壇標(biāo)準(zhǔn)(ForumStandard),這種標(biāo)準(zhǔn)被稱為NDEF(NFCDataExchange

Format,NFC數(shù)據(jù)交換格式)。

ClassDescription

一個(gè)NFCadapter的管理器,可以列出所有此android設(shè)備支持的NFCadapter.只不過大部分android

NfcManager設(shè)備只有一個(gè)NFCadapter,所以你大部分情況下可以直接用靜態(tài)方法getDefauItAdapter(context)

來取適配器。

表示本設(shè)備的NFCadapter,可以定義Intent來請(qǐng)求將系統(tǒng)檢測(cè)到tags的提醒發(fā)送到你的Activity.并

NfcAdapter提供方法去注冊(cè)前臺(tái)tag提醒發(fā)布和前臺(tái)NDEF推送。前臺(tái)NDEF推送是當(dāng)前android版本唯一支

持的p2pNFC通信方式。

NDEF是NFC論壇定義的數(shù)據(jù)結(jié)構(gòu),用來有效的存數(shù)據(jù)到NFCtags.比如文本,URL,和其他MIME

類型。一個(gè)NdefMessage扮演一個(gè)容器,這個(gè)容器存哪些發(fā)送和讀到的數(shù)據(jù)。一個(gè)NdefMessage

NdefMessage

'對(duì)象包含0或多個(gè)NdefRecord,每個(gè)NDEFrecord有一個(gè)類型,比如文本,URL,智慧型海報(bào)/廣告,

NdefRecord

或其他MIME數(shù)據(jù)。在NDEFMessage里的第一個(gè)NfcRecord的類型用來發(fā)送tag到一個(gè)android設(shè)

備上的activity.

標(biāo)示一個(gè)被動(dòng)的NFC目標(biāo),比如tag,card,鑰匙掛扣,甚至是一個(gè)電話模擬的的NFC卡.當(dāng)一個(gè)

tag被檢測(cè)到,一個(gè)tag對(duì)象將被創(chuàng)建并且封裝到一個(gè)Intent里,然后NFC發(fā)布系統(tǒng)將這個(gè)Intent

Tag

用startActivity發(fā)送到注冊(cè)了接受這種Intent的activity里。你可以用getTechList。方法來得到這個(gè)

tag支持的技術(shù)細(xì)節(jié)和創(chuàng)建一個(gè)android.nfc.tech提供的相應(yīng)的TagTechnology對(duì)象。

4.Tag支持的技術(shù)標(biāo)準(zhǔn)

ClassDescription

TagTechnology這個(gè)接口是下面所有tagtechnology類必須實(shí)現(xiàn)的。

NfcA支持ISO14443-3A標(biāo)準(zhǔn)的操作。ProvidesaccesstoNFC-A(ISO14443-3A)propertiesandI/Ooperations.

NfcBProvidesaccesstoNFC-B(ISO14443-3B)propertiesandI/Ooperations.

NfcFProvidesaccesstoNFC-F(JIS6319-4)propertiesandI/Ooperations.

NfcVProvidesaccesstoNFC-V(ISO15693)propertiesandI/Ooperations.

IsoDepProvidesaccesstoISO-DEP(ISO14443-4)propertiesandI/Ooperations.

提供對(duì)那些被格式化為NDEF的tag的數(shù)據(jù)的訪問和其他操作。ProvidesaccesstoNDEFdataand

Ndef

operationsonNFCtagsthathavebeenformattedasNDEF.

NdefFormatable對(duì)那些可以被格式化成NDEF格式的tag提供一個(gè)格式化的操作

MifareClassic如果android設(shè)備支持MIFARE,提供對(duì)MIFAREClassic目標(biāo)的屬性和I/O操作。

MifareUltralight如果android設(shè)備支持MIFARE,提供對(duì)MIFAREUltralight目標(biāo)的屬性和I/O操作。

5.Tag發(fā)布系統(tǒng)

當(dāng)android設(shè)備掃描到一個(gè)NFCtag,通用的行為是自動(dòng)找最合適的Activity會(huì)處理這個(gè)tagIntent而不需要用戶來選

擇哪個(gè)Activity來處理。因?yàn)樵O(shè)備掃描NFCtags是在很短的范圍和時(shí)間,如果讓用戶選擇的話,那就有可能需要移

動(dòng)設(shè)備,這樣將會(huì)打斷這個(gè)掃描過程。你應(yīng)該開發(fā)你只處理需要處理的tags的Activity,以防止讓用戶選擇使用哪

個(gè)Activity來處理的情況。Android提供兩個(gè)系統(tǒng)來幫助你正確的識(shí)別一個(gè)NFCtag是否是你的Activity想要處理的:

Intent發(fā)布系統(tǒng)和前臺(tái)Activity發(fā)布系統(tǒng)。

Intent發(fā)布系統(tǒng)檢查所有Activities的intentfilters,找出那些定義了可以處理此tag的Activity,如果有多個(gè)Activity

都配置了處理同一個(gè)tagIntent,那么將使用Activity選擇器來讓用戶選擇使用哪個(gè)Activity。用戶選擇之后,將使用

選擇的Activity來處理此Intent.

前臺(tái)發(fā)布系統(tǒng)允許一個(gè)Activity覆蓋掉Intent發(fā)布系統(tǒng)而首先處理此tagIntent,這要求你將要處理TagIntent的

Activity運(yùn)行在前臺(tái),這樣當(dāng)一個(gè)NFCtag被掃描到,系統(tǒng)先檢測(cè)前臺(tái)的Activity是否支持處理此Intent,如果支持,

即將此Intent傳給此Activity,如果不支持,則轉(zhuǎn)到Intent發(fā)布系統(tǒng)。

6.使用Intent發(fā)布系統(tǒng)

Intent發(fā)布系統(tǒng)指定了3個(gè)intent有不同的優(yōu)先級(jí)。通常當(dāng)一個(gè)tag被檢測(cè)到之后,Intent就被啟動(dòng)(start)了,這

個(gè)啟動(dòng)遵循以下行為:

android.nfc.action.NDEF_DISCOVERED:這個(gè)intent是在一個(gè)包含NDEF負(fù)載的tag被檢測(cè)到時(shí)啟動(dòng),這是最高優(yōu)先級(jí)

的intent,android系統(tǒng)不會(huì)讓你指定一個(gè)Intent能處理所有的NFC數(shù)據(jù)類型,你必須在AndroidManifest.xml中指定

與NFCtag對(duì)應(yīng)的元素,這樣當(dāng)掃描到的tag傳過來的數(shù)據(jù)類型與你定義的相匹配時(shí),你的Activity就會(huì)被調(diào)用。

<activityandroid:name=".NFCapActivity"

android:launchMode="singleTop">

<intent-filter>

<actionandroid:name="android.nfc.action.NDEF_DISCOVERED"/>

<categoryandroid:name="ent.category.DEFAULT"/>

</intent-filter>

</activity>

說明:這里launchMode設(shè)為singleTop,這樣無論NFC標(biāo)簽靠近手機(jī)多少次,保障只有一個(gè)Activity實(shí)例。(除一次

靠近調(diào)用OnCreate。方法外,標(biāo)簽每一次靠近都會(huì)調(diào)用OnNewlntent()方法。)

如果NDEF_DISCOVEREDintent已經(jīng)被啟動(dòng),TECH_DISCOVERED和TAG_DISCOVEREDintents將不會(huì)被啟動(dòng)。假如一

個(gè)未知的tag或者不包含NDEF負(fù)載的tag被檢測(cè)到,此Intent就不會(huì)被啟動(dòng)。

android.nfc.action.TECH_DISCOVERED:如果NDEF_DISCOVEREDintent沒啟動(dòng)或者沒有一個(gè)Activity的filter檢測(cè)

NDEF_DISCOVERED,并且此tag是已知的,那么此TECH_DISCOVEREDIntent將會(huì)啟動(dòng).TECH_DISCOVEREDintent要求

你在一個(gè)資源文件里(xml)里指定你要支持technologies列表。

android.nfc.action.TAG_DISCOVERED:如果沒有一個(gè)activity處理.DISCOVEREDandTECH_DISCOVEREDintents或者tag

被檢測(cè)為未知的,那么此Intent將會(huì)被啟動(dòng)。

假如你的Activity在AndroidManifest.xml文件里聲明了處理android.nfc.action.TECH_DISCOVEREDintent,你必須創(chuàng)

建一個(gè)Xml格式的資源文件,并加上你的activity支持的technologies到tech-list集合里。這樣你的activity將被認(rèn)作

能處理這些tech-list的處理者,如果tag使用的technology屬于你的定義的list里,你的Activity將接收此Intento

你可以用getTechList。來獲得tag支持的technologieso

例如:如果一個(gè)tag被檢測(cè)到支持MifareClassic,NdefFormatable,和NfcA,你的tech-list集合必須指定了其中的一

項(xiàng)或者多項(xiàng)來保證你的Activity能處理此Intento

你也可以指定多個(gè)tech-list集合,每個(gè)集合都認(rèn)做獨(dú)立的。如果任何單個(gè)tech-list集合是getTechList。返回的

technologies集合的子集,那么你的Activity將被認(rèn)為匹配了。這個(gè)還提供‘與'和'或'操作。

7.前臺(tái)發(fā)布系統(tǒng)

前臺(tái)發(fā)布系統(tǒng)允許一個(gè)Activity攔截一個(gè)tagIntent獲得最高優(yōu)先級(jí)的處理,這種方式很容易使用和實(shí)現(xiàn):L在

OnCreate。方法中創(chuàng)建一個(gè)Pendingintent對(duì)象,這樣Android系統(tǒng)就能在一個(gè)tag被檢測(cè)到時(shí)定位到這個(gè)對(duì)象

Pendingintentpendingintent=Pendinglntent.getActivity(

this,0,newlntent(this,getClass()).addFlags(lntent.FLAG_ACTIVITY_SINGLE_TOP),0);

launchMode設(shè)為singleTop,這樣無論NFC標(biāo)簽靠近手機(jī)多少次,保障只有一個(gè)Activity實(shí)例。(除一次靠近調(diào)用

OnCreate。方法外,標(biāo)簽每一次靠近都會(huì)調(diào)用OnNewlntent()方法。)

2.在主線程里調(diào)用enableForegroundDispatch(Activity,Pendingintent,lntentFilter[],String口口)而且Activity在前臺(tái)

(可以在onResume()里調(diào)用來保證這點(diǎn))。

〃頁面獲取到焦點(diǎn)

(?Override

protectedvoidonResume(){

super.onResume();

if(mNfcAdapter!=null){

〃打開前臺(tái)發(fā)布系統(tǒng),使頁面優(yōu)于其它nfc處理

mNfcAdapter.enableForegroundDispatch(this,mPendinglntent,null,null);

)

)

〃頁面失去焦點(diǎn)

(?Override

protectedvoidonPause(){

super.onPause();

if(mNfcAdapter!=null){

〃關(guān)閉前臺(tái)發(fā)布系統(tǒng)

mNfcAdapter.disableForegroundDispatch(this);

)

)

3.在OnNewIntent中獲取Tag對(duì)象

@Override

protectedvoidonNewlntent(lntentintent){

super.onNewlntent(intent);

mTag=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

String[]techList=mTag.getTechList();

System.out.println("標(biāo)簽支持的tachnology類型:");

for(Stringtech:techList){

System.out.println(tech);

)

)

形考任務(wù)五教學(xué)實(shí)踐3

使用JNI調(diào)用Java類中方法getTest()o

JNI調(diào)用Java方法的流程

JNI調(diào)用Java方法的流程是先通過類名找到類,然后在根據(jù)方法名找到方法的id,最后就可以調(diào)用這個(gè)方法了.如果

是調(diào)用Java的非靜態(tài)方法,那么需要構(gòu)造出類的對(duì)象后才可以調(diào)用它,下面通過例子來演示一下如何在川I中調(diào)用

Java的靜態(tài)方法.

首先在java中定義一個(gè)靜態(tài)方法供JNI調(diào)用.

static{

System.loadLibrary("jni-testH);

)

(?Override

protectedvoidonCreate(BundlesavedlnstanceState){

super.onCreate(savedlnstanceState);

setContentView(R.layout.activity__main);

get();

}

//定義一個(gè)靜態(tài)方法,提供給JNI調(diào)用

publicstaticvoidmethodCalledByJni(StringmsgFromJni){

Log.i(TAG,"methodCalledByJni,msg:"+msgFromJni);

)

//定義調(diào)用本地方法,好讓本地方法回調(diào)java中的方法

publicnativevoidget();

?1

?2

?3

?4

?5

?6

?7

?8

?9

?10

?11

?12

?13

?14

?15

?16

?17

?18

?19

然后在川I中調(diào)用上面定義的靜態(tài)方法:

//定義調(diào)用java中的方法的函數(shù)

voidcallJavaMethod(JNIEnv*env,jobjectthiz){

//先找到要調(diào)用的類

jclassclazz=env->FindClass("com/gavinandre/jnitestapp/MainActivity");

if(clazz==NULL){

printf("findclassMainActivityerror!");

return;

)

//獲取java方法id

//參數(shù)二是調(diào)用的方法名,參數(shù)三是方法的簽名

jmethodIDid=env->GetStaticMethodlD(clazz,"methodCalledByJni","(Ljava/lang/String;)V");

if(id==NULL){

printf("findmethodmethodCalledByJnierror!");

return;

)

jstringmsg=env->NewStringUTF("msgsendbycallJavaMethodintest.cpp.");

//開始調(diào)用java中的靜態(tài)方法

env->CallStaticVoidMethod(clazz,id,msg);

)

?1

?2

?3

?4

?5

?6

?7

?8

?9

?10

?11

?12

?13

?14

?15

?16

?17

?18

?19

從callJavaMethod的實(shí)現(xiàn)可以看出,程序首先根據(jù)類名com/gavinandre/jnitestapp/MainActivity找到類,然后再根據(jù)

方法名methodCalledByJni找至lj方法,其中(Ljava/lang/String;)V是methodCalledByJni方法的簽名,接著再通過JNIEnv

對(duì)象的CallStaticVoidMethod方法來完成最終的調(diào)用過程.

最后在Java_com_gavinandreJnitestapp_MainActivity_get方法中調(diào)用callJavaMethod方法.

jstringJava__com_gavinandreJnitestapp_MainActivity_get(JNIEnv*env,jobjectthiz){

printf("invokegetinc++\n");

callJavaMethodfenv,thiz);

retrurnenv->NewStringUTF(HHellofromJNIinlibjni-test.so!");

)

?1

?2

?3

?4

?5

整個(gè)實(shí)現(xiàn)流程就是->onCreate中調(diào)用JNI的get()->JNI的get()方法內(nèi)部會(huì)調(diào)用具體實(shí)現(xiàn)回調(diào)Java中的方法

callJavaMethod()->方法最終通過CallStaticVoidMethod。調(diào)用了Java中的methodCalledByJni()來接收一個(gè)參數(shù)并打印

一個(gè)log.

1/MainAvtivity:methodCalledByJni,msg:msgsendbycallJavaMethodintest.cpp.

?1

我們可以發(fā)現(xiàn),JNI調(diào)用Java的過程和Java中方法的定義有很大關(guān)聯(lián),針對(duì)不同類型的Java方法,JNIEnv提供了不同

的接口去調(diào)用.

形考任務(wù)六作業(yè)

【簡(jiǎn)答題】簡(jiǎn)述Service原理

Service原理及例子

一.原理簡(jiǎn)介:主要任務(wù)在后臺(tái)運(yùn)行,執(zhí)行一些耗時(shí)操作,網(wǎng)絡(luò)連接,播放MP3,往服務(wù)器發(fā)送心跳,可以使

用service更新Contentprovider,發(fā)送intent以及啟動(dòng)系統(tǒng)的通知等等,

如果service中的代碼阻塞住了,應(yīng)該另外啟動(dòng)一個(gè)線程,否則會(huì)導(dǎo)致anr

二.生命周期

OnCreate方法,啟動(dòng)創(chuàng)建對(duì)象時(shí)會(huì)調(diào)用這個(gè)方法

OnStartCommand啟動(dòng)或者重新啟動(dòng),startservice通過intent傳遞的對(duì)象來決定service需要做什么

OnDestroy銷毀時(shí)調(diào)用,釋放資源等

三.啟動(dòng)的兩種方式以及差別:

l.startService和組件的生命周期沒有關(guān)系

2.bindService和組件的生命周期綁定

啟動(dòng)service有致命的弱點(diǎn):startservice無法將service計(jì)算的數(shù)據(jù)返回給activity的,bindService正是來解決這個(gè)問

題的,bindService提供了客戶端,服務(wù)器端的接口,允許應(yīng)用程序組件與service進(jìn)行交互,sendquest,getresult,

acrossprocesses,bindService是充當(dāng)服務(wù)器端的,其他的組件是充當(dāng)客戶端的

四.綁定過程

1.創(chuàng)建一個(gè)Binder對(duì)象,復(fù)寫onBinder方法返回這個(gè)對(duì)象

2.Activity中實(shí)現(xiàn)Serviceconnection類,調(diào)用bindService傳入Serviceconnection對(duì)象,當(dāng)綁定成功后,響應(yīng)里

面的方法,

3.Activity調(diào)用Binder里面的方法,可以獲取當(dāng)前service的狀態(tài)

publicclassMainActivityextendsActivity{

privateButtonbuttonl;privateButtonbutton2;privateBinderbinder;@Overrideprotected

voidonCreate(BundlesavedInstanceState){super.onCreate(savedlnstanceState);

setContentView(R.layout.activity_main);buttonl=(Button)findViewByld(R.id.buttonl);button2=

(Button)findViewByld(R.id.button?);button

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論