Android中的Service组件详解

来源:互联网 发布:姑苏城外寒山寺 知乎 编辑:程序博客网 时间:2024/06/10 14:06

Service与Activity的区别在于:Service一直在后台运行,他没有用户界面,绝不会到前台来。

一,创建和配置Service

开发Service需要两个步骤:1,继承Service子类,2,在Manifest.xml文件中配置Service

Service中的方法:

public class FirstService extends Service{// 必须实现的方法,返回一个IBinder对象,应用程序可通过该对象与Service组件通信@Overridepublic IBinder onBind(Intent arg0){return null;}// Service被创建时回调该方法。@Overridepublic void onCreate(){super.onCreate();System.out.println("Service is Created");}// Service被启动时回调该方法@Overridepublic int onStartCommand(Intent intent, int flags, int startId){System.out.println("Service is Started");return START_STICKY;}// Service被关闭之前回调。@Overridepublic void onDestroy(){super.onDestroy();System.out.println("Service is Destroyed");}}
Manifest.xml中配置service

<!-- 配置一个Service组件 --><service android:name=".FirstService"><intent-filter><!-- 为该Service组件的intent-filter配置action --><action android:name="org.service.FIRST_SERVICE" /></intent-filter></service>


二,启动和停止Service

1,startService 启动的服务:主要用于启动一个服务执行后台任务,不进行通信,访问者与Service没有关联,即使访问者退出了,Service仍然运行。停止服务使用stopService
bindService 启动的服务:该方法启动的服务要进行通信。停止服务使用unbindService

public class StartServiceTest extends Activity{Button start, stop;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 获取程序界面中的start、stop两个按钮start = (Button) findViewById(R.id.start);stop = (Button) findViewById(R.id.stop);// 创建启动Service的Intentfinal Intent intent = new Intent();// 为Intent设置Action属性intent.setAction("org.service.FIRST_SERVICE");start.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0){// 启动指定SerivcestartService(intent);}});stop.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0){// 停止指定SerivcestopService(intent);}});}
2,绑定本地Service并与之通信

如果访问者和Service之间需要进行方法调用或者数据传递,则应该使用bindService和unbindService方法启动关闭Service

boolean bindService(Intent service, ServiceConnection conn,int flags)方法:

service:这个参数通过Intent指定要启动的Service

conn:ServiceConnection 对象,该对象用于监听访问者与Service之间的连接情况。当访问者与Service之间连接成功时将会回调ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service);当Service所在的宿主中止,导致Service与访问者之间断开时会回调ServiceConnection对象的onServiceDisconnected(ComponentName name)方法

flags:绑定时是否自动创建Service。0或BIND_AUTO_CREATE


ServiceConnection对象的onServiceConnected方法中有一个IBinder对象,该对象即可与被绑定Service之间的通信

  

通信原理:当开发Service是。该Service类必须提供一个IBinder onBind(Intent intent)方法,在绑定本地Service的情况下,onBind(Intent intent)方法所返回的IBinder对象会传给ServiceConnection对象的onServiceConnected的(ComponentName name, IBinder service)的service参数。这样访问者就可使用该IBinder对象与Service进行通信了


BindService.java

public class BindService extends Service//继承Service{private int count;private boolean quit;// 定义onBinder方法所返回的对象,此binder会传给访问者private MyBinder binder = new MyBinder();// 通过继承Binder来实现IBinder类public class MyBinder extends Binder //①{public int getCount(){// 获取Service的运行状态:countreturn count;}}// 必须实现的方法,绑定该Service时回调该方法@Overridepublic IBinder onBind(Intent intent){System.out.println("Service is Binded");// 返回IBinder对象return binder;}// Service被创建时回调该方法。@Overridepublic void onCreate(){super.onCreate();System.out.println("Service is Created");// 启动一条线程、动态地修改count状态值new Thread(){@Overridepublic void run(){while (!quit){try{Thread.sleep(1000);}catch (InterruptedException e){}count++;}}}.start();}// Service被断开连接时回调该方法@Overridepublic boolean onUnbind(Intent intent){System.out.println("Service is Unbinded");return true;}// Service被关闭之前回调该方法。@Overridepublic void onDestroy(){super.onDestroy();this.quit = true;System.out.println("Service is Destroyed");}}
配置Service组件:

<!-- 配置一个Service组件 --><service android:name=".BindService"><intent-filter><!-- 为该Service组件的intent-filter配置action --><action android:name="org.crazyit.service.BIND_SERVICE" /></intent-filter></service>

BindServiceTest.java

public class BindServiceTest extends Activity{Button bind, unbind, getServiceStatus;// 保持所启动的Service的IBinder对象BindService.MyBinder binder;// 定义一个ServiceConnection对象private ServiceConnection conn = new ServiceConnection(){// 当该Activity与Service连接成功时回调该方法@Overridepublic void onServiceConnected(ComponentName name, IBinder service){System.out.println("--Service Connected--");// 获取Service的onBind方法所返回的MyBinder对象binder = (BindService.MyBinder) service; //①}// 当该Activity与Service断开连接时回调该方法@Overridepublic void onServiceDisconnected(ComponentName name){System.out.println("--Service Disconnected--");}};@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 获取程序界面中的start、stop、getServiceStatus按钮bind = (Button) findViewById(R.id.bind);unbind = (Button) findViewById(R.id.unbind);getServiceStatus = (Button) findViewById(R.id.getServiceStatus);// 创建启动Service的Intentfinal Intent intent = new Intent();// 为Intent设置Action属性intent.setAction("org.crazyit.service.BIND_SERVICE");bind.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 绑定指定SerivcebindService(intent, conn, Service.BIND_AUTO_CREATE);}});unbind.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 解除绑定SerivceunbindService(conn);}});getServiceStatus.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 获取、并显示Service的count值Toast.makeText(BindServiceTest.this,"Serivce的count值为:" + binder.getCount(),Toast.LENGTH_SHORT).show(); //②}});}}

0 0
原创粉丝点击