服务可以看成是没有界面的 Activity,运行在后台,不可交互,不可以自己启动,要其它 的Context执行
startService() 开始服务or 执行bindService()进行绑定服务 。
一. 新建 一个服务
服务类似一个没有界面的Activity。steps:
(1)新建 一个类,extends service
(2)重写 Service的几个重要的方法。共6个,分别是
onCreate() ,onDestroy() onRebind() onStart() onUnbind().其中 的onBind返回的是Ibinder类型的,作用是负责
Service与Activity的通信。
public class MyBinder extends Binder{
MySerivce getService(){
return MySerivce.this;
}
}
private final IBinder binder =new MyBinder();
@Override
public IBinder onBind(Intent intent ) {
// TODO Auto-generated method stub
Log.i(TAG, "------->onBind");
Toast.makeText(getBaseContext(), "onBind", Toast.LENGTH_SHORT).show();
return binder;
}
getSerivce()方法的作用是在Activity中得到Service的对象,这样 就可以操作Serivce 了。
二。使用Service
要使用Serivce还要在Manifest中注册,否则 系统 找不到service。如下,
Service与Activity平级。
<service
android:enabled="true"
android:name=".MySerivce" >
</service>
启动Service 有两种方法
1.ContextWrapper.startService (Intent service)
启动后Service会运行在后台 ,不受Activity生命周期的影响 ,也就是说,即使所有 的Activity都退出 了,Service也
还在运行。例子:
btn1.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent (getBaseContext(),MySerivce.class);
startService(i); //start
}
});
btn2.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent (getBaseContext(),MySerivce.class);
stopService(i); //stop
}
});
2. ContextWrapper.bindService (Intent intent ,ServiceConnection conn, int flags)
就是将Service 与 Activity结合 起来,我们还要一个ServiceConnection对象 ,作用是实现 Activity与Service的
绑定。如下
MySerivce mService; //for what
ServiceConnection mConnection = new ServiceConnection(){
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mService = ((MySerivce.MyBinder)service).getService();
}
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
mService = null;
}
}
事实 上,在连接Service时,会调用 Bind方法,这个 方法会返回一个IBinder对象 ,这个对象 就是onServiceConnected中的第二个参数 ,我们将IBinder类的 service转化为MyService中的内部 类MyBinder内部类对象 ,再用这个 对象 的getService()得到Service的操作对象 。
绑定的实现如下:
btn1.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent (getBaseContext(),MySerivce.class);
//startService(i); //start
bindService(i, mConnection ,Context.BIND_AUTO_CREATE);
}
});
btn2.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
//Intent i = new Intent (getBaseContext(),MySerivce.class);
//stopService(i); //stop
unbindService(mConnection);
}
});
Service的生命周期
1,startService的生命周期
onCreate() ->onStart()->onDestroy() .
如果 重复startService(),则不会进入onCreate(),而是直接 进入 onStart()方法。Service有个原则,只执行一次
onCreate()。
2. bindService的生命周期
onCreate() -> onBind() -> onUnbind() -> onDestroy()
服务 被 绑定后不能直接Destroy() ,要先onUnbind()。
1.ContextWrapper.startService (Intent service)
启动后Service会运行在后台 ,不受Activity生命周期的影响 ,也就是说,即使所有 的Activity都退出 了,Service也
还在运行。例子:
btn1.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent (getBaseContext(),MySerivce.class);
startService(i); //start
}
});
btn2.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent (getBaseContext(),MySerivce.class);
stopService(i); //stop
}
});
2. ContextWrapper.bindService (Intent intent ,ServiceConnection conn, int flags)
就是将Service 与 Activity结合 起来,我们还要一个ServiceConnection对象 ,作用是实现 Activity与Service的
绑定。如下
MySerivce mService; //for what
ServiceConnection mConnection = new ServiceConnection(){
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mService = ((MySerivce.MyBinder)service).getService();
}
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
mService = null;
}
}
事实 上,在连接Service时,会调用 Bind方法,这个 方法会返回一个IBinder对象 ,这个对象 就是onServiceConnected中的第二个参数 ,我们将IBinder类的 service转化为MyService中的内部 类MyBinder内部类对象 ,再用这个 对象 的getService()得到Service的操作对象 。
绑定的实现如下:
btn1.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent (getBaseContext(),MySerivce.class);
//startService(i); //start
bindService(i, mConnection ,Context.BIND_AUTO_CREATE);
}
});
btn2.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
//Intent i = new Intent (getBaseContext(),MySerivce.class);
//stopService(i); //stop
unbindService(mConnection);
}
});
Service的生命周期
1,startService的生命周期
onCreate() ->onStart()->onDestroy() .
如果 重复startService(),则不会进入onCreate(),而是直接 进入 onStart()方法。Service有个原则,只执行一次
onCreate()。
2. bindService的生命周期
onCreate() -> onBind() -> onUnbind() -> onDestroy()
服务 被 绑定后不能直接Destroy() ,要先onUnbind()。