版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《綿陽求職招聘技巧》課件
- 2020-2021學(xué)年遼寧省沈陽市郊聯(lián)體高一下學(xué)期期末考試歷史試題
- 小學(xué)一年級(jí)10以內(nèi)數(shù)字的分與合
- 小學(xué)數(shù)學(xué)新人教版一年級(jí)下冊(cè)20以內(nèi)口算練習(xí)題大全
- 小學(xué)三年級(jí)數(shù)學(xué)三位數(shù)加減法口算題
- 《汽車行業(yè)概述》課件
- 《運(yùn)輸與包裝》課件
- 吉他行業(yè)客服工作總結(jié)用心服務(wù)打造音樂快樂
- 《光纖通信基礎(chǔ)知識(shí)》課件
- 酒店招聘與人才引進(jìn)策略
- 監(jiān)事會(huì)年度工作計(jì)劃
- 2024中國(guó)近海生態(tài)分區(qū)
- 山東省濟(jì)南市2023-2024學(xué)年高一上學(xué)期1月期末考試化學(xué)試題(解析版)
- 企業(yè)節(jié)能獎(jiǎng)懲管理制度(3篇)
- 統(tǒng)編版2024-2025學(xué)年三年級(jí)上冊(cè)語文期末情景試卷 (無答案)
- 2024年時(shí)事政治試題【有答案】
- 造價(jià)咨詢部組織架構(gòu)及基本工作流程
- 新媒體代運(yùn)營(yíng)協(xié)議合同書
- 2024年1月國(guó)家開放大學(xué)法律事務(wù)??啤睹穹▽W(xué)(1)》期末紙質(zhì)考試試題及答案
- 智研咨詢發(fā)布:中國(guó)種豬行業(yè)市場(chǎng)現(xiàn)狀、發(fā)展概況、未來前景分析報(bào)告
- 2024年信息系統(tǒng)項(xiàng)目管理師(綜合知識(shí)、案例分析、論文)合卷軟件資格考試(高級(jí))試題與參考答案
評(píng)論
0/150
提交評(píng)論