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

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组件:


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(); //②}});}}

更多相关文章

  1. 【转】Android中保存Activity的状态
  2. 实例讲解Android中ContentProvider组件的使用方法
  3. Android(安卓)自定义 MarqueeView 实现跑马灯 —— 原理篇
  4. Android中,如何在其他类调用Activity的方法,适用于类似场景
  5. Android(安卓)5.1开机自启动示例程序(Activity,APP包启动)
  6. android 屏幕保持不锁屏
  7. Android4.0.3修改启动动画和开机声音
  8. Android(安卓)Butterknife(黄油刀) 使用方法总结
  9. Android(安卓)Studio NDK&Jni开发--MD5加密

随机推荐

  1. Android(安卓)Q Beta 更新内容介绍 [转载
  2. android 计算textView文本的高度
  3. Android(安卓)解决方案-6.0不提供org.apa
  4. Android实现SharePreferences和AutoCompl
  5. Android官方文档training中英文翻译目录
  6. [置顶] 自定义漂亮的Android(安卓)SeekBa
  7. Activity常见控件三——progressBar
  8. Android(安卓)Notification从notify到添
  9. AAPT err... ERROR: Unable to open PNG
  10. 装备选择