首页 > 代码库 > 27、Service
27、Service
1服务可以通过startservice的方法 开启。通过stopservice的方法 停止。
服务有一个特点: 只会一次onCreate()方法一旦被创建出来,以后oncreate() 就不会再被执行了,
以后再去开启服务 只会执行onstart()方法,当服务被停止的时候 onDestroy();
2 服务通过bindservice的方法开启
首先 如果服务不存在 就会执行 oncreate() ->onbind()方法
一旦服务绑定成功 以后再去执行 bindsercie() 就不会在重新创建 或者绑定服务了();
如果我们现实的调用unbindservice()的方法 ,首先 on unbind()方法 -> ondestroy() ;
服务只能被解除绑定一次 多次解除绑定服务 程序会出异常.
开启服务 (startservice)
服务一旦开启与调用者没有任何的关系 , 调用着的activity 即便是退出了 也不会影响
后台的service的运行.
在activity里面 不能去调用服务里面的方法 (因为Service是框架new出来的,activity无法获取到该Service的引用).
通过绑定方式开启服务(bindservice)
服务跟调用者不求同生 ,但求同死.
如果调用者(activity)退出了 那他绑定的服务呢 也会跟着退出.
我们可以在activity里面调用服务里面的方法.
利用 serviceSonnection 接口 返回一个ibinder对象 , 拿着ibinder对象获取到服务里面方法的引用(自定义了一个接口信息) 调用服务里面的方法。
一个应用程序 一个进程里面 定义一个IService 的接口来描述方法
如果我们要调用另外一个进程 服务里面的方法 aidl(android interface defination language)
总结流程:
1.要想访问 一个服务里面的方法 我们需要用到 bindservice();
一 创建一个服务 这个服务里面有一个要被调用的方法.
二 定义一个接口IService , 接口里面的抽象方法 就是去调用service里面的方法。
三 定义一个mybinder对象 extends IBinder对象 实现 我们声明的接口IService, 在onbind
方法里面把mybinder返回回去。
四 在activity里面 通过bindservice的方法开启服务。
五 创建出来一个我们MyConn 实现 ServiceConnection接口 onserviceConnected的方法。
这个方法会有一个参数 这个参数就是 MyBinder的对象。
六 把mybinder强制类型转化成 IServcie。
七 调用IService里面的方法。
范例:开启、停止、绑定、解除绑定、调用服务里面的方法。
1 public interface IService {2 public void callMethodInService();3 }
1 import android.app.Activity; 2 import android.content.ComponentName; 3 import android.content.Context; 4 import android.content.Intent; 5 import android.content.ServiceConnection; 6 import android.os.Bundle; 7 import android.os.IBinder; 8 import android.view.View; 9 import android.view.View.OnClickListener;10 import android.widget.Button;11 12 /**13 * 通过startservice开启服务的生命周期。14 * 利用bindservice调用服务里面的方法。15 * @author dr16 */17 public class DemoActivity extends Activity implements OnClickListener {18 19 Button bt_start, bt_stop;20 // 绑定服务 解除绑定服务21 Button bt_bind_service, bt_unbind_service; 22 Button bt_call_service;23 Intent intent;24 MyConn conn;25 IService iService;26 27 @Override28 public void onCreate(Bundle savedInstanceState) {29 super.onCreate(savedInstanceState);30 setContentView(R.layout.main);31 32 bt_start = (Button) this.findViewById(R.id.button1);33 bt_stop = (Button) this.findViewById(R.id.button2);34 bt_bind_service = (Button) this.findViewById(R.id.button3);35 bt_unbind_service = (Button) this.findViewById(R.id.button4);36 bt_call_service = (Button) this.findViewById(R.id.button5);37 bt_start.setOnClickListener(this);38 bt_stop.setOnClickListener(this);39 bt_bind_service.setOnClickListener(this);40 bt_unbind_service.setOnClickListener(this);41 bt_call_service.setOnClickListener(this);42 intent = new Intent(this, MyService.class);43 conn = new MyConn();44 }45 46 @Override47 public void onClick(View v) {48 switch (v.getId()) {49 case R.id.button1: // 开启服务50 startService(intent);51 break;52 case R.id.button2: // 停止服务53 stopService(intent);54 break;55 case R.id.button3: // 绑定服务56 bindService(intent, conn, Context.BIND_AUTO_CREATE);57 break;58 case R.id.button4: // 解除绑定服务59 unbindService(conn);60 break;61 // 绑定开启62 case R.id.button5: // 调用服务里面的方法63 iService.callMethodInService();64 break;65 }66 }67 68 private class MyConn implements ServiceConnection {69 // 绑定一个服务成功的时候 调用 onServiceConnected70 @Override71 public void onServiceConnected(ComponentName name, IBinder service) {72 // 绑定成功后,会返回这个IBinder对象(MyService中的onBind返回的)。73 iService = (IService) service;74 }75 76 @Override77 public void onServiceDisconnected(ComponentName name) {78 79 }80 }81 82 @Override83 protected void onDestroy() {84 unbindService(conn);85 super.onDestroy();86 }87 88 }
1 import android.app.Service; 2 import android.content.Intent; 3 import android.os.Binder; 4 import android.os.IBinder; 5 6 public class MyService extends Service { 7 8 @Override 9 public IBinder onBind(Intent intent) {10 System.out.println("on bind");11 return new MyBinder();12 }13 14 public class MyBinder extends Binder implements IService {15 @Override16 public void callMethodInService() {17 sayHelloInService();18 }19 }20 21 /**22 * 服务里面的一个方法23 */24 public void sayHelloInService() {25 System.out.println("hello in service");26 }27 28 @Override29 public boolean onUnbind(Intent intent) {30 System.out.println("on unbind");31 return super.onUnbind(intent);32 }33 34 @Override35 public void onCreate() {36 System.out.println("oncreate");37 super.onCreate();38 }39 40 @Override41 public void onStart(Intent intent, int startId) {42 System.out.println("onstart");43 44 super.onStart(intent, startId);45 }46 47 @Override48 public void onDestroy() {49 System.out.println("ondestroy");50 super.onDestroy();51 }52 }
2.要想访问一个远程服务里的方法 需要用到aidl;
一 创建一个服务 这个服务里面有一个要被调用的方法.
二 定义一个接口IService , 接口里面的抽象方法 就是去调用service里面的方法。
把.java的后缀名改成aidl 把接口里面定义的访问权限的修饰符都给删除。
三 定义一个mybinder对象 extends IService.Stub, 在onbind方法里面把mybinder返回回去。
四 在activity里面 通过bindservice的方法开启服务。
五 创建出来一个我们MyConn 实现 ServiceConnection接口 onserviceConnected的方法,这个方法会有一个参数 这个参数就是MyBinder的对象。
六 IService = IService.Stub.asInterface(myBinder)。
七 调用IService的方法。
范例:
范例:
27、Service