版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2021国家开放大学电大Undroid网络开发技术》
形考任务一、二、三、四、五、六答案
形考任务一教学实践1
完成以下JSON的解析,完成主体代码即可,解析方法及库不限。
一、什么是JSON?
JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少
更多流量从而加快速度。
JSON就是一串字符串只不过元素会使用特定的符号标注。
{}双括号表示对象
[]中括号表示数组
""双引号内是属性或值
:冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
所以{"name":"Michael")可以理解为是一个包含name为Michael的对象
而[{"name":"Michael"},{"name":"Jerry"}]就表示包含两个对象的数组
当然了,你也可以使用{"name":["Michael","Jerry"]}来简化上面一部,这是一个拥有•个name数组的对象
二、JSON解析之传统的JSON解析
1、生成json字符串
publicstaticStringcreateJsonString(Stringkey,Objectvalue){
JSONObjectjsonObject=newJSONObject();
jsonObject.put(key,value);
returnjsonObject.toString();
}
2、解析JSON字符串
分为以下三种情况,一个JavaBean,一个List数组,一个嵌套Map的List数组:
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;
/**
*完成对json数据的解析
*
*/
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的数组
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进行解析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;
)
总结:
JSON对于移动设备来说,尤其对于网络环境较差和流量限制的情况下,相对于XML格式的数据传输会更节省流量,
传输效率更高。在这三种解析方式中FastJson是效率最高的,推荐使用
形考任务二教学实践2
在AndroidManifest.xml中注册广播接收器BootBroadcastReceivero
BroadcastReceiver广播接收器
用于监听/接受Android应用分发的各类广播并做出相应的响应
应用场景:
•监听系统事件:如开机广播,网络链接与断开,屏幕转向灯
•不同组件间(Activity/Service,包括不同APP间)的通信
•多线程通信
先自定义一个广播接收器,创建MyBroadcastReceiver类来继承广播接收器类,并实现它内部的方法
publicclassMyBroadcastReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
}
)
1
2
3
・4
•5
•6
广播接收器的注册方法分为静态注册和动态注册两种方式
静态注册
在AndroidManifest.xml文件的〈application〉标签内声明
<!-静态注册广播接收器
<receiverandroid:name=".MyBroadcastReceiver">
<!-接受哪些广播f
<intent-filter>
<!-开机广播->
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
完成注册后就可以在MyBroadcastReceiver类中接受广播实现相关功能
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
这里已经可以通过意图对象来接受广播信息并进行处理了
动态注册
动态注册在onCreate。方法里进行注册
(©Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedlnstanceState);
setContentView(R.layout.activity_main);
//新建一个广播接收器
broadcastReceiver=newMyBroadcastReceiver();
//要接收哪些广播
IntentFilterintentFilter=newlntentFilter();
III电量低广播
intentFilter.addAction(lntent.ACTION_BATTERY_LOW);
//注册广播接收器
registerReceiver(broadcastReceivecintentFilter);
)
・1
•2
•3
•4
•5
•6
・7
•8
•9
•10
・11
•12
•13
•14
•15
•16
动态注册的广播接收器必须要在onDestroy()方法里面取消注册注册和取消注册要一一对应,不然会报错,内存会
泄漏
@Override
protectedvoidonDestroy(){
super.onDestroy();
//取消注册广播接收器
if(broadcastReceiver!=null){
unregisterReceiver(broadcastReceiver);
1
2
3
4
5
6
7
8
动态注册不需要在AndroidManifest.xml文件里声明,直接通过代码进行注册。对于接收广播进行处理也是在创建的
MyBroadcastReceiver类里面,这点跟静态注册一样
广播生命周期
BroadcastReceiver的生命周期很短暂,该类的onReceive()方法是运行在主线程中,如果在该方法里的操作超过了10s,
会阻塞主线程,出现ANR程序无响应情况如果需要进行耗时操作,可以通过Intent传递给Service进行处理,尽量
不要在该方法中开启线程进行处理,否则10s后,该线程有可能会变陈空线程,导致任务丢失。
形考任务三阶段性测试1
Android中保存某个运行状态和用户信息,最好使用()o
正确答案是:SharedPreferences存储
SharedPreference存储数据,最后提交数据时,推荐使用()。
正确答案是:commitO
使用SQLite读取数据内容时,用到的核心类是()。
正确答案是:Contentvalues
自定义Service时,必须实现的方法是()。
正确答案是:onCreate()
使用Mediaplayer开始播放音视频的方法是()。
正确答案是:prepare()
自定义View时必须实现的方法是()o
正确答案是:onMeasure()
AndroidAsyncTask异步任务中,哪个方法是运行在主线程中()
正确答案是:dolnBackground()
Android中开启事务的方法正确的是()o
正确答案是:db.beginTransaction()
HTTP是万维网实现数据通信的基石。它基于()来传递数据。
正确答案是:TCP/IP
HTTP是()o
正确答案是:不保存状态的协议
URL的一般格式为()
正确答案是:<协议>:〃<主机端口>/<路径>
URL(uniformresourcelocator,统一资源定位符)是互联网标准资源的地址。通过一个URL,能找到()资源。
正确答案是:一个
下列说法错误的是()
正确答案是:获取HttpCIient实例可以直接newHttpClient()»
以下是Android中用于xml解析方式的是()
正确答案是:XmlPullParser
做网络图片查看器的时候,需要把获取的流信息转换为()
正确答案是:Bitmap
关于Android中消息机制说法正确的是()
正确答案是:Handler是用来发送消息和处理消息的。
利用内容解析者查询短信数据时uri怎么写()
正确答案是:Uriuri=Uri.parse("content:〃sms")
可以在Activity中得到ContentResolver实例对象的方法是()
正确答案是:getContentResolver()
可以在Activity中得到ContentResolver实例对象的方法是()
正确答案是:getContentResolver()
在下列选项中,关于内容提供者的说法错误的是()
正确答案是:内容提供者只有在AndroidManifest.xml文件中注册后才能运行。
在下列选项中,用于查询数据的方法是()
正确答案是:query
对于Android开发来说,()是网络开发中使用最多、最重要的网络通信方式。
正确答案是:HTTP
自定义一个数据适配器MyAdatper,需要让它继承的类是()
正确答案是:BaseAdapter
下列方法中,()执行时释放了锁。
正确答案是:wait()
AsyncTask中的()方法在子线程中执行。
正确答案是:onPostExecute。
一个AsyncTask对象可以执行多次。()
正确答案是:“错”。
Glide可以设置缓存模式。()
正确答案是:“错”。
在Service中可以直接进行耗时操作。()
正确答案是:“错”。
Service可以使用Serviceconnection实现与Activity的交互。()
正确答案是:“错”。
较长时间的定时任务可以使用Alarm来实现。()
正确答案是:“错”。
Android中使用openFileOutput(Stringnamejntmode)方法获取到文件输出流时,第二个参数mode常用模式有4
种。()
正确答案是:“对”。
Android中创建内容提供者要继承Contentobserver。()
正确答案是:“错”。
Contentprovider在实际的开发中不需要注册,可以直接使用。()
正确答案是:“错”。
Android中数据只能存储到sd卡上。()
正确答案是:“错”。
Android对.png格式的位图支持最好。()
正确答案是:“对”。
Android提供的用于媒体播放的类,可播放音频和视频,但是仅仅限于MP3和MP4等有限的格式。()
正确答案是:“对”。
Bitmap包含的图片可以来自文件,也可以由程序创建。()
正确答案是:“对”。
Bitmap可以理解为一种为存储图形像素而设计的数据结构。()
正确答案是:“对”。
Canvas是一个操作绘图的平台。()
正确答案是:“对二
DOM解析使用的是W3c规范。()
正确答案是:“对”。
File适用于存储文本类型数据或者二进制数据。()
正确答案是:“对”。
JSON中数据全部以键值对的方式表示。()
正确答案是:“对”。
onStartCommand()方法在Service的一个完整生命周期内可能会被调用多次。()
正确答案是:“对”。
onStartCommand。方法在每次启动Service时都会被调用。()
正确答案是:“对”。
Paint主要的绘图工具类。()
正确答案是:“对”。
PULL解析也是一种基于事件流驱动的XML解析方式。()
正确答案是:“对”。
SharedPreferences所有的信息都是按照key-value的形式保存的。()
正确答案是:“对”。
在/data/data/包名/cache目录下可以cache软件的缓存数据,当清除缓存时数据就会删除。()
正确答案是:“对”。
在Android6.0之后,读写文件权限属于危险权限,需要运行动态申请。()
正确答案是:“对”。
在Android中,如果要实现配置信息的保存,需要使用SharedPreferences存储技术。()
正确答案是:“对”。
形考任务四专题讨论1
Android系统提供了两种方式来识别一个NFCTag是否为Activity需要处理的内容,对这两种进行讨论。
1.NFC是什么
近距离无线通信技术(NearFieldCommunication,NFC),是由飞利浦公司和索尼公司共同开发的一种非接触式识别和
互联技术,可以在移动设备、消费类电子产品、PC和智能设备间进行近距离无线通信。NFC提供了一种简单的、非
触控式的解决方案,可以让消费者简单直观地交换信息、访问内容与服务。NFC整合了非接触式读卡器、非接触式
智能卡和点对点(Peer-to-Peer)通信功能,为消费者开创了全新的便捷生活方式。手机和NFC技术的结合,将会给
消费者提供极大的生活便利,例如移动支付、位置服务信息、身份识别、公共交通卡等应用,在医疗保健、优惠券、
智能海报等许多领域有也有巨大的应用潜力。
2.NFC的三种工作方式
1.读卡器模式
数据在NFC芯片中,可以简单理解成“刷标签"。本质上就是通过支持NFC的手机或其它电子设备从带有NFC芯片的
标签、贴纸、名片等媒介中读写信息。通常NFC标签是不需要外部供电的。当支持NFC的外设向NFC读写数据时,
它会发送某种磁场,而这个磁场会自动的向NFC标签供电。
2.仿真卡模式
数据在支持NFC的手机或其它电子设备中,可以简单理解成"刷手机"。本质上就是将支持NFC的手机或其它电子设
备当成借记卡、公交卡、门禁卡等IC卡使用。基本原理是将相应IC卡中的信息凭证封装成数据包存储在支持NFC
的外设中。
在使用时还需要一个NFC射频器(相当于刷卡器)。将手机靠近NFC射频器,手机就会接收到NFC射频器发过来的
信号,在通过一系列复杂的验证后,将IC卡的相应信息传入NFC射频器,最后这些IC卡数据会传入NFC射频器连
接的电脑,并进行相应的处理(如电子转帐、开门等操作)。
3.点对点模式
该模式与蓝牙、红外差不多,用于不同NFC设备之间进行数据交换,不过这个模式已经没有有"刷"的感觉了。其有
效距离一般不能超过4厘米,但传输建立速度要比红外和蓝牙技术快很多,传输速度比红外块得多,如过双方都使
用Android4.2,NFC会直接利用蓝牙传输。这种技术被称为AndroidBeam。所以使用AndroidBeam传输数据的两部
设备不再限于4厘米之内。
点对点模式的典型应用是两部支持NFC的手机或平板电脑实现数据的点对点传输,例如,交换图片或同步设备联系
人。因此,通过NFC,多个设备如数字相机,计算机,手机之间,都可以快速连接,并交换资料或者服务。
3.NDEF是什么?
不同的NFC标签之间差异很大,有的只支持简单的读写操作,有时还会采用支持一次性写入的芯片,将NFC标签设
计成只读的。当然,也存在一些复杂的NFC标签,例如,有一些NFC标签可以通过硬件加密的方式限制对某一区域
的访问。还有一些标签自带操作环境,允许NFC设备与这些标签进行更复杂的交互。这些标签中的数据也会采用不
同的格式。但AndroidSDKAPI主要支持NFC论坛标准(ForumStandard),这种标准被称为NDEF(NFCDataExchange
Format,NFC数据交换格式)。
ClassDescription
一个NFCadapter的管理器,可以列出所有此android设备支持的NFCadapter.只不过大部分android
NfcManager设备只有一个NFCadapter,所以你大部分情况下可以直接用静态方法getDefauItAdapter(context)
来取适配器。
表示本设备的NFCadapter,可以定义Intent来请求将系统检测到tags的提醒发送到你的Activity.并
NfcAdapter提供方法去注册前台tag提醒发布和前台NDEF推送。前台NDEF推送是当前android版本唯一支
持的p2pNFC通信方式。
NDEF是NFC论坛定义的数据结构,用来有效的存数据到NFCtags.比如文本,URL,和其他MIME
类型。一个NdefMessage扮演一个容器,这个容器存哪些发送和读到的数据。一个NdefMessage
NdefMessage
'对象包含0或多个NdefRecord,每个NDEFrecord有一个类型,比如文本,URL,智慧型海报/广告,
NdefRecord
或其他MIME数据。在NDEFMessage里的第一个NfcRecord的类型用来发送tag到一个android设
备上的activity.
标示一个被动的NFC目标,比如tag,card,钥匙挂扣,甚至是一个电话模拟的的NFC卡.当一个
tag被检测到,一个tag对象将被创建并且封装到一个Intent里,然后NFC发布系统将这个Intent
Tag
用startActivity发送到注册了接受这种Intent的activity里。你可以用getTechList。方法来得到这个
tag支持的技术细节和创建一个android.nfc.tech提供的相应的TagTechnology对象。
4.Tag支持的技术标准
ClassDescription
TagTechnology这个接口是下面所有tagtechnology类必须实现的。
NfcA支持ISO14443-3A标准的操作。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.
提供对那些被格式化为NDEF的tag的数据的访问和其他操作。ProvidesaccesstoNDEFdataand
Ndef
operationsonNFCtagsthathavebeenformattedasNDEF.
NdefFormatable对那些可以被格式化成NDEF格式的tag提供一个格式化的操作
MifareClassic如果android设备支持MIFARE,提供对MIFAREClassic目标的属性和I/O操作。
MifareUltralight如果android设备支持MIFARE,提供对MIFAREUltralight目标的属性和I/O操作。
5.Tag发布系统
当android设备扫描到一个NFCtag,通用的行为是自动找最合适的Activity会处理这个tagIntent而不需要用户来选
择哪个Activity来处理。因为设备扫描NFCtags是在很短的范围和时间,如果让用户选择的话,那就有可能需要移
动设备,这样将会打断这个扫描过程。你应该开发你只处理需要处理的tags的Activity,以防止让用户选择使用哪
个Activity来处理的情况。Android提供两个系统来帮助你正确的识别一个NFCtag是否是你的Activity想要处理的:
Intent发布系统和前台Activity发布系统。
Intent发布系统检查所有Activities的intentfilters,找出那些定义了可以处理此tag的Activity,如果有多个Activity
都配置了处理同一个tagIntent,那么将使用Activity选择器来让用户选择使用哪个Activity。用户选择之后,将使用
选择的Activity来处理此Intent.
前台发布系统允许一个Activity覆盖掉Intent发布系统而首先处理此tagIntent,这要求你将要处理TagIntent的
Activity运行在前台,这样当一个NFCtag被扫描到,系统先检测前台的Activity是否支持处理此Intent,如果支持,
即将此Intent传给此Activity,如果不支持,则转到Intent发布系统。
6.使用Intent发布系统
Intent发布系统指定了3个intent有不同的优先级。通常当一个tag被检测到之后,Intent就被启动(start)了,这
个启动遵循以下行为:
android.nfc.action.NDEF_DISCOVERED:这个intent是在一个包含NDEF负载的tag被检测到时启动,这是最高优先级
的intent,android系统不会让你指定一个Intent能处理所有的NFC数据类型,你必须在AndroidManifest.xml中指定
与NFCtag对应的元素,这样当扫描到的tag传过来的数据类型与你定义的相匹配时,你的Activity就会被调用。
<activityandroid:name=".NFCapActivity"
android:launchMode="singleTop">
<intent-filter>
<actionandroid:name="android.nfc.action.NDEF_DISCOVERED"/>
<categoryandroid:name="ent.category.DEFAULT"/>
</intent-filter>
</activity>
说明:这里launchMode设为singleTop,这样无论NFC标签靠近手机多少次,保障只有一个Activity实例。(除一次
靠近调用OnCreate。方法外,标签每一次靠近都会调用OnNewlntent()方法。)
如果NDEF_DISCOVEREDintent已经被启动,TECH_DISCOVERED和TAG_DISCOVEREDintents将不会被启动。假如一
个未知的tag或者不包含NDEF负载的tag被检测到,此Intent就不会被启动。
android.nfc.action.TECH_DISCOVERED:如果NDEF_DISCOVEREDintent没启动或者没有一个Activity的filter检测
NDEF_DISCOVERED,并且此tag是已知的,那么此TECH_DISCOVEREDIntent将会启动.TECH_DISCOVEREDintent要求
你在一个资源文件里(xml)里指定你要支持technologies列表。
android.nfc.action.TAG_DISCOVERED:如果没有一个activity处理.DISCOVEREDandTECH_DISCOVEREDintents或者tag
被检测为未知的,那么此Intent将会被启动。
假如你的Activity在AndroidManifest.xml文件里声明了处理android.nfc.action.TECH_DISCOVEREDintent,你必须创
建一个Xml格式的资源文件,并加上你的activity支持的technologies到tech-list集合里。这样你的activity将被认作
能处理这些tech-list的处理者,如果tag使用的technology属于你的定义的list里,你的Activity将接收此Intento
你可以用getTechList。来获得tag支持的technologieso
例如:如果一个tag被检测到支持MifareClassic,NdefFormatable,和NfcA,你的tech-list集合必须指定了其中的一
项或者多项来保证你的Activity能处理此Intento
你也可以指定多个tech-list集合,每个集合都认做独立的。如果任何单个tech-list集合是getTechList。返回的
technologies集合的子集,那么你的Activity将被认为匹配了。这个还提供‘与'和'或'操作。
7.前台发布系统
前台发布系统允许一个Activity拦截一个tagIntent获得最高优先级的处理,这种方式很容易使用和实现:L在
OnCreate。方法中创建一个Pendingintent对象,这样Android系统就能在一个tag被检测到时定位到这个对象
Pendingintentpendingintent=Pendinglntent.getActivity(
this,0,newlntent(this,getClass()).addFlags(lntent.FLAG_ACTIVITY_SINGLE_TOP),0);
launchMode设为singleTop,这样无论NFC标签靠近手机多少次,保障只有一个Activity实例。(除一次靠近调用
OnCreate。方法外,标签每一次靠近都会调用OnNewlntent()方法。)
2.在主线程里调用enableForegroundDispatch(Activity,Pendingintent,lntentFilter[],String口口)而且Activity在前台
(可以在onResume()里调用来保证这点)。
〃页面获取到焦点
(©Override
protectedvoidonResume(){
super.onResume();
if(mNfcAdapter!=null){
〃打开前台发布系统,使页面优于其它nfc处理
mNfcAdapter.enableForegroundDispatch(this,mPendinglntent,null,null);
)
)
〃页面失去焦点
(©Override
protectedvoidonPause(){
super.onPause();
if(mNfcAdapter!=null){
〃关闭前台发布系统
mNfcAdapter.disableForegroundDispatch(this);
)
)
3.在OnNewIntent中获取Tag对象
@Override
protectedvoidonNewlntent(lntentintent){
super.onNewlntent(intent);
mTag=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String[]techList=mTag.getTechList();
System.out.println("标签支持的tachnology类型:");
for(Stringtech:techList){
System.out.println(tech);
)
)
形考任务五教学实践3
使用JNI调用Java类中方法getTest()o
JNI调用Java方法的流程
JNI调用Java方法的流程是先通过类名找到类,然后在根据方法名找到方法的id,最后就可以调用这个方法了.如果
是调用Java的非静态方法,那么需要构造出类的对象后才可以调用它,下面通过例子来演示一下如何在川I中调用
Java的静态方法.
首先在java中定义一个静态方法供JNI调用.
static{
System.loadLibrary("jni-testH);
)
(©Override
protectedvoidonCreate(BundlesavedlnstanceState){
super.onCreate(savedlnstanceState);
setContentView(R.layout.activity__main);
get();
}
//定义一个静态方法,提供给JNI调用
publicstaticvoidmethodCalledByJni(StringmsgFromJni){
Log.i(TAG,"methodCalledByJni,msg:"+msgFromJni);
)
//定义调用本地方法,好让本地方法回调java中的方法
publicnativevoidget();
•1
・2
•3
・4
•5
•6
•7
•8
•9
•10
•11
・12
•13
・14
•15
•16
•17
•18
•19
然后在川I中调用上面定义的静态方法:
//定义调用java中的方法的函数
voidcallJavaMethod(JNIEnv*env,jobjectthiz){
//先找到要调用的类
jclassclazz=env->FindClass("com/gavinandre/jnitestapp/MainActivity");
if(clazz==NULL){
printf("findclassMainActivityerror!");
return;
)
//获取java方法id
//参数二是调用的方法名,参数三是方法的签名
jmethodIDid=env->GetStaticMethodlD(clazz,"methodCalledByJni","(Ljava/lang/String;)V");
if(id==NULL){
printf("findmethodmethodCalledByJnierror!");
return;
)
jstringmsg=env->NewStringUTF("msgsendbycallJavaMethodintest.cpp.");
//开始调用java中的静态方法
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的实现可以看出,程序首先根据类名com/gavinandre/jnitestapp/MainActivity找到类,然后再根据
方法名methodCalledByJni找至lj方法,其中(Ljava/lang/String;)V是methodCalledByJni方法的签名,接着再通过JNIEnv
对象的CallStaticVoidMethod方法来完成最终的调用过程.
最后在Java_com_gavinandreJnitestapp_MainActivity_get方法中调用callJavaMethod方法.
jstringJava__com_gavinandreJnitestapp_MainActivity_get(JNIEnv*env,jobjectthiz){
printf("invokegetinc++\n");
callJavaMethodfenv,thiz);
retrurnenv->NewStringUTF(HHellofromJNIinlibjni-test.so!");
)
•1
・2
•3
•4
•5
整个实现流程就是->onCreate中调用JNI的get()->JNI的get()方法内部会调用具体实现回调Java中的方法
callJavaMethod()->方法最终通过CallStaticVoidMethod。调用了Java中的methodCalledByJni()来接收一个参数并打印
一个log.
1/MainAvtivity:methodCalledByJni,msg:msgsendbycallJavaMethodintest.cpp.
・1
我们可以发现,JNI调用Java的过程和Java中方法的定义有很大关联,针对不同类型的Java方法,JNIEnv提供了不同
的接口去调用.
形考任务六作业
【简答题】简述Service原理
Service原理及例子
一.原理简介:主要任务在后台运行,执行一些耗时操作,网络连接,播放MP3,往服务器发送心跳,可以使
用service更新Contentprovider,发送intent以及启动系统的通知等等,
如果service中的代码阻塞住了,应该另外启动一个线程,否则会导致anr
二.生命周期
OnCreate方法,启动创建对象时会调用这个方法
OnStartCommand启动或者重新启动,startservice通过intent传递的对象来决定service需要做什么
OnDestroy销毁时调用,释放资源等
三.启动的两种方式以及差别:
l.startService和组件的生命周期没有关系
2.bindService和组件的生命周期绑定
启动service有致命的弱点:startservice无法将service计算的数据返回给activity的,bindService正是来解决这个问
题的,bindService提供了客户端,服务器端的接口,允许应用程序组件与service进行交互,sendquest,getresult,
acrossprocesses,bindService是充当服务器端的,其他的组件是充当客户端的
四.绑定过程
1.创建一个Binder对象,复写onBinder方法返回这个对象
2.Activity中实现Serviceconnection类,调用bindService传入Serviceconnection对象,当绑定成功后,响应里
面的方法,
3.Activity调用Binder里面的方法,可以获取当前service的状态
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等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年环保公益活动策划执行合同
- 2024年物流人才培养与交流合同
- 系统开发课程设计日志
- 托班喂饭课程设计
- 苏教版小学数学课程设计
- 艺术治疗绘画课程设计
- 广东电网公司110kV车载移动式变电站技术规范书
- 洗涤废水处理课程设计
- 编辑文章课程设计意图
- 网页设计课程设计总结
- 2024中国近海生态分区
- 山东省济南市2023-2024学年高一上学期1月期末考试化学试题(解析版)
- 企业节能奖惩管理制度(3篇)
- 统编版2024-2025学年三年级上册语文期末情景试卷 (无答案)
- 2024年时事政治试题【有答案】
- 造价咨询部组织架构及基本工作流程
- 2024年认证行业法律法规及认证基础知识
- MT 285-1992缝管锚杆
- GB 18613-2020 电动机能效限定值及能效等级
- 水稻幼穗分化八个时期的划分表
- 卡特彼勒生产体系手册(PDF62页)
评论
0/150
提交评论