android-Service-<十一>
1.Service
它是android的四大组件之一,也需要在xml里注册。它可以长时间运行于后台,但是没有用户界面。
即使用户切换不同应用程序,它还可以保持它的运作。比如后台开音乐播放等。
常用于耗时较长的操作,如更新ContentProvider,发送Intent以及启动系统的通知等等
注意:Service不是一个单独的进程,或线程。
2.Service调用形式(可以同时采取两者形式)
Started: 调用Activity的startService方法启动。它独立操作,可以调用stopService方法销毁它。
坏处,无法Activity无法获取Service里信息。
Bound: 调用bindService方法。它绑定了调用它的Activity,采用client-server形式与 Activity交流。
主要是通过一个IBinder对象实现,多个组件可以同时绑定同一个Service,这时Service相当
于服务器,其他的组件(即使在其他应用程序)都可以发信息给Service与它联系,直到所有的
组件解除绑定,它才死亡。
注意:不管你的调用形式是怎样,其他组件(甚至是在其他应用里的)可以使用该Service,不过你可以在xml里私有化Service,
让其他组件无法访问。Service不是一个线程或进程,它是在主线程中运行的,除非你另开一个线程给Service,让它专注它的事情。
3.绑定
a.Activity类
通过intent指定对应的Service类,调用bindService(intent, sc, BIND_AUTO_CREATE)方法
绑定该Service,sc为ServiceConnection类,
b.ServiceConnection类
onServiceConnected(ComponentName name, IBinder service)方法:与Service绑定时调用
在与Service绑定时,接受Service发过来的binder。 onServiceDisconnected(ComponentName name) 方法:解除绑定时调用
在与Service解除绑定时,处理相应情况
c.Service(抽象类)
onCreate()方法: //创建该对象时调用,该对象一直运行直到销毁!
onDestroy()方法://销毁时调用,如stopService
onStartCommand方法://启动Service时调用,如startService
IBinder onBind(Intent intent)方法(必须覆盖重写):
该方法是用于,当用户bindservice绑定该Service时调用,并返回该IBinder主要是
通过IBinder对象进行通信交流,帮助文档说最好继承Binder(类)的一个类来返回。
4.Demo
两个Button,”完成绑定”:实现bindService操作。”获取服务信息”:获取返回IBinder里的信息
Activity类
package hq.bindService; import hq.bindService.FirstService.CIBinder; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class BindServiceActivity extends Activity { /** Called when the activity is first created. */ private Button b=null; private Button b2=null; private CIBinder cb=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); b=(Button)findViewById(R.id.b); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //绑定Service,任何的联系通过intent意图实现,所以立刻创建intent Intent intent=new Intent(); //马上显示指定启动哪个Service intent.setClass(BindServiceActivity.this, FirstService.class); //第二个参数为ServiceConnection,这里用来处理 //在与Service绑定时,接受Service发过来的binder。 //在与Service解除绑定时,处理相应情况 bindService(intent, sc, BIND_AUTO_CREATE); } }); b2=(Button)findViewById(R.id.b2); b2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 通过binder获取它的Service FirstService s=cb.getService(); //调用绑定Service的成员方法 System.out.println("cb-get-service-mes"+s.getServiceMess()); } }); } //写一个实现ServiceConnection接口的对象。 ServiceConnection sc=new ServiceConnection(){ //当bindService时调用,即与Service建立联系时,接受发过来的IBinder @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub System.out.println("onServiceConnected:name="+name); cb=(CIBinder)service; String s=cb.getExtra(); System.out.println("onServiceConnected:"+s); } //解除绑定时调用 @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub System.out.println("onServiceDisconnected:name="+name); } }; }
继承Service的子类
1 package hq.bindService; 2 import java.io.FileDescriptor; 3 import android.app.Service; 4 import android.content.Intent; 5 import android.os.Binder; 6 import android.os.IBinder; 7 import android.os.IInterface; 8 import android.os.Parcel; 9 import android.os.RemoteException; 10 11 public class FirstService extends Service 12 { 13 private final CIBinder cb=new CIBinder(); 14 //该方法是用于,当用户bindservice绑定该Service时调用,并返回该IBinder 15 //主要是通过IBinder对象进行通信交流 16 @Override 17 public IBinder onBind(Intent intent) { 18 // TODO Auto-generated method stub 19 //帮助文档说最好继承Binder(类) 20 return cb; 21 } 22 //创建一个IBinder 23 class CIBinder extends Binder 24 { 25 public FirstService getService() 26 { 27 return FirstService.this; 28 } 29 public String getExtra() 30 { 31 return "cbinder:getextra"; 32 } 33 34 } 35 public String getServiceMess() 36 { 37 return "getServiceMess"; 38 } 39 40 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。