Android提高第四篇之Service.docx
- 文档编号:24117730
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:11
- 大小:17.15KB
Android提高第四篇之Service.docx
《Android提高第四篇之Service.docx》由会员分享,可在线阅读,更多相关《Android提高第四篇之Service.docx(11页珍藏版)》请在冰豆网上搜索。
Android提高第四篇之Service
Android提高第四篇之Service——维信科技
如果把Activity比喻为前台程序,那么Service就是后台程序,Service的整个生命周期都只会在后台执行(维信科技提供)。
Service跟Activity一样也由Intent调用。
在工程里想要添加一个Service,先新建继承Service的类,然后到AndroidManifest.xml->Application->ApplicationNodes中的Service标签中添加。
Service要由Activity通过startService或者bindService来启动,Intent负责传递参数(维信科技提供)。
startService与bindService都可以启动Service,那么它们之间有什么区别呢?
它们两者的区别就是使Service的周期改变。
由startService启动的Service必须要有stopService来结束Service,不调用stopService则会造成Activity结束了而Service还运行着。
bindService启动的Service可以由unbindService来结束,也可以在Activity结束之后(onDestroy)自动结束。
android=" android: orientation="vertical"android: layout_width="fill_parent" android: layout_height="fill_parent"> layout_width="wrap_content" android: layout_height="wrap_content"android: id="@+id/btnStartMyService" android: text="StartMyService"> layout_width="wrap_content" android: layout_height="wrap_content"android: id="@+id/btnStopMyService" android: text="StopMyService"> layout_width="wrap_content" android: layout_height="wrap_content"android: id="@+id/btnBindMyService" android: text="BindMyService"> layout_width="wrap_content" android: layout_height="wrap_content"android: id="@+id/btnUnbindMyService" android: text="UnbindMyService"> layout_width="wrap_content" android: layout_height="wrap_content"android: id="@+id/btnExit" android: text="退出程序"> packagecom.testService; importandroid.app.Activity; importandroid.app.Service; importandroid.content.ComponentName; importandroid.content.Intent; importandroid.content.ServiceConnection; importandroid.os.Bundle; importandroid.os.IBinder; importandroid.util.Log; importandroid.view.View; importandroid.widget.Button; publicclasstestServiceextendsActivity{ ButtonbtnStartMyService,btnStopMyService,btnBindMyService,btnUnbindMyService,btnExit; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); btnStartMyService=(Button)this.findViewById(R.id.btnStartMyService); btnStartMyService.setOnClickListener(newClickEvent()); btnStopMyService=(Button)this.findViewById(R.id.btnStopMyService); btnStopMyService.setOnClickListener(newClickEvent()); btnBindMyService=(Button)this.findViewById(R.id.btnBindMyService); btnBindMyService.setOnClickListener(newClickEvent()); btnUnbindMyService=(Button)this.findViewById(R.id.btnUnbindMyService); btnUnbindMyService.setOnClickListener(newClickEvent()); btnExit=(Button)this.findViewById(R.id.btnExit); btnExit.setOnClickListener(newClickEvent()); } @Override publicvoidonDestroy() { super.onDestroy(); Log.e("Activity","onDestroy"); } privateServiceConnection_connection=newServiceConnection(){ @Override publicvoidonServiceConnected(ComponentNamearg0,IBinderarg1){ //TODOAuto-generatedmethodstub } @Override publicvoidonServiceDisconnected(ComponentNamename){ //TODOAuto-generatedmethodstub } }; classClickEventimplementsView.OnClickListener{ @Override publicvoidonClick(Viewv){ Intentintent=newIntent(testService.this,MyService.class); if(v==btnStartMyService){ testService.this.startService(intent); } elseif(v==btnStopMyService){ testService.this.stopService(intent); } elseif(v==btnBindMyService){ testService.this.bindService(intent,_connection,Service.BIND_AUTO_CREATE); } elseif(v==btnUnbindMyService){ if(MyService.ServiceState=="onBind")//Service绑定了之后才能解绑 testService.this.unbindService(_connection); } elseif(v==btnExit) { testService.this.finish(); } } } } packagecom.testService; importandroid.app.Service; importandroid.content.Intent; importandroid.os.IBinder; importandroid.util.Log; publicclassMyServiceextendsService{ staticpublicStringServiceState=""; @Override publicIBinderonBind(Intentarg0){ Log.e("Service","onBind"); ServiceState="onBind"; returnnull; } @Override publicbooleanonUnbind(Intentintent){ super.onUnbind(intent); Log.e("Service","onUnbind"); ServiceState="onUnbind"; returnfalse; } @Override publicvoidonCreate(){ super.onCreate(); Log.e("Service","onCreate"); ServiceState="onCreate"; } @Override publicvoidonDestroy(){ super.onDestroy(); Log.e("Service","onDestroy"); ServiceState="onDestroy"; } @Override publicvoidonStart(Intentintent,intstartid){ super.onStart(intent,startid); Log.e("Service","onStart"); ServiceState="onStart"; } } 在Android里面可以使用SAX和DOM,DOM需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文档在后期的节点深度处理会有点麻烦(维信科技提供)。 xmlversion="1.0"encoding="utf-8"? > 使用SAX解析,需要定义SAXParserFactory(使应用程序能够配置和获取基于SAX的解析器以解析XML文档),SAXParser(从各种输入源解析XML),XMLReader(使用回调函数读取XML文档),其中XMLReader是个关键(维信科技提供)。 XMLReader可以为解析XML定义各种回调函数,“条件符合”的时候触发这些回调函数。 SAXParserFactoryfactory=SAXParserFactory.newInstance(); SAXParserparser=factory.newSAXParser(); XMLReaderreader=parser.getXMLReader(); reader.setContentHandler(handler); reader.parse(newInputSource(testSAX.this.getResources() .openRawResource(R.raw.test))); 在这段代码里,XMLReader就调用继承DefaultHandler的SAXHandler。 DefaultHandler已实现ContentHandler,DTDHandler,EntityResolver,ErrorHandler等接口,包含常见读取XML的操作,具体请看下面的SAXHandler.java源码(维信科技提供)。 生成XML的结果如下 android=" android: orientation="vertical"android: layout_width="fill_parent" android: layout_height="fill_parent"> layout_height="wrap_content" android: layout_width="fill_parent"android: id="@+id/btnSAX" android: text="使用SAX解析XML"> layout_height="wrap_content" android: layout_width="fill_parent"android: text="生成XML"android: id="@+id/btnOutput"> text="@+id/EditText01"android: id="@+id/EditText01" android: layout_width="fill_parent"android: layout_height="fill_parent"> packagecom.testSAX; importjava.io.StringWriter; importjavax.xml.parsers.SAXParser; importjavax.xml.parsers.SAXParserFactory; importorg.xml.sax.InputSource; importorg.xml.sax.XMLReader; importorg.xmlpull.v1.XmlSerializer; importandroid.app.Activity; importandroid.os.Bundle; importandroid.util.Xml; importandroid.view.View; importandroid.widget.Button; importandroid.widget.EditText; publicclasstestSAXextendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ ButtonbtnSAX,btnOutput; EditTextmemo; SAXHandlerhandler=newSAXHandler(); @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); btnSAX=(Button)this.findViewById(R.id.btnSAX); btnSAX.setOnClickListener(newClickEvent()); btnOutput=(Button)this.findViewById(R.id.btnOutput); btnOutput.setOnClickListener(newClickEvent()); memo=(EditText)this.findViewById(R.id.EditText01); } classClickEventimplementsView.OnClickListener{ @Override publicvoidonClick(Viewv){ if(v==btnSAX){//解析XML,并保存标记,属性等值 try{ SAXParserFactoryfactory=SAXParserFactory.newInstance(); SAXParserparser=factory.newSAXParser(); XMLReaderreader=parser.getXMLReader(); reader.setContentHandler(handler); reader.parse(newInputSource(testSAX.this.getResources() .openRawResource(R.raw.test))); }catch(Exceptionee){} } elseif(v==btnOutput){//生成XML try{ XmlSerializerserializer=Xml.newSerializer(); StringWriterwriter=newStringWriter(); try{ serializer.setOutput(writer); serializer.startDocument("UTF-8",true); for(inti=0;i { if(handler.GetKeys().get(i).equals("startTag")) { serializer.startTag("",(String)handler.GetValues().get(i)); } elseif(handler.GetKeys().get(i).equals("Attr")){ String[]str=(String[])handler.GetValues().get(i); serializer.attribute("",str[0],str[1]); } elseif(handler.GetKeys().get(i).equals("text")) serializer.text((String)handler.GetValues().get(i)); elseif(handler.GetKeys().get(i).equals("endTag")) { serializer.endTag("",(String)handler.GetValues().get(i)); } } serializer.endDocument(); Stringtext=writer.toString(); text=text.replace("><",">/r/n<"); memo.setText(text);//输出到文本框 }catch(Exceptione){ thrownewRuntimeException(e); } }catch(Exceptione){} } } } } (维信科技提供)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 提高 第四 Service