Service与Activity的区别在于:Service一直在后台运行,他没有用户界面,绝不会到前台来。
一,创建和配置Service
开发Service需要两个步骤:1,继承Service子类,2,在Manifest.xml文件中配置Service
Service中的方法:
public class FirstService extends Service { // 必须实现的方法,返回一个IBinder对象,应用程序可通过该对象与Service组件通信 @Override public IBinder onBind(Intent arg0) { return null; } // Service被创建时回调该方法。 @Override public void onCreate() { super.onCreate(); System.out.println("Service is Created"); } // Service被启动时回调该方法 @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("Service is Started"); return START_STICKY; } // Service被关闭之前回调。 @Override public 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>
1,startService 启动的服务:主要用于启动一个服务执行后台任务,不进行通信,访问者与Service没有关联,即使访问者退出了,Service仍然运行。停止服务使用stopService
bindService 启动的服务:该方法启动的服务要进行通信。停止服务使用unbindService
public class StartServiceTest extends Activity { Button start, stop; @Override public 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的Intent final Intent intent = new Intent(); // 为Intent设置Action属性 intent.setAction("org.service.FIRST_SERVICE"); start.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 启动指定Serivce startService(intent); } }); stop.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 停止指定Serivce stopService(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的运行状态:count return count; } } // 必须实现的方法,绑定该Service时回调该方法 @Override public IBinder onBind(Intent intent) { System.out.println("Service is Binded"); // 返回IBinder对象 return binder; } // Service被创建时回调该方法。 @Override public void onCreate() { super.onCreate(); System.out.println("Service is Created"); // 启动一条线程、动态地修改count状态值 new Thread() { @Override public void run() { while (!quit) { try { Thread.sleep(1000); } catch (InterruptedException e) { } count++; } } }.start(); } // Service被断开连接时回调该方法 @Override public boolean onUnbind(Intent intent) { System.out.println("Service is Unbinded"); return true; } // Service被关闭之前回调该方法。 @Override public 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>
public class BindServiceTest extends Activity { Button bind, unbind, getServiceStatus; // 保持所启动的Service的IBinder对象 BindService.MyBinder binder; // 定义一个ServiceConnection对象 private ServiceConnection conn = new ServiceConnection() { // 当该Activity与Service连接成功时回调该方法 @Override public void onServiceConnected(ComponentName name , IBinder service) { System.out.println("--Service Connected--"); // 获取Service的onBind方法所返回的MyBinder对象 binder = (BindService.MyBinder) service; //① } // 当该Activity与Service断开连接时回调该方法 @Override public void onServiceDisconnected(ComponentName name) { System.out.println("--Service Disconnected--"); } }; @Override public 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的Intent final Intent intent = new Intent(); // 为Intent设置Action属性 intent.setAction("org.crazyit.service.BIND_SERVICE"); bind.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { // 绑定指定Serivce bindService(intent, conn, Service.BIND_AUTO_CREATE); } }); unbind.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { // 解除绑定Serivce unbindService(conn); } }); getServiceStatus.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { // 获取、并显示Service的count值 Toast.makeText(BindServiceTest.this, "Serivce的count值为:" + binder.getCount(), Toast.LENGTH_SHORT).show(); //② } }); } }