概述:
Service即服务,与Activity,ContentProvider,BroadcastReceiver并称Android程序的四大组件。
在程序后台运行,不可见,难以被Android系统自动杀死。
服务分为本地服务和远程服务,本地服务即为在程序内部使用的服务,而远程服务是在Android系统内的程序与程序之间使用。
用途举例:
后台保持播放音乐、记录地理位置变动、监听部分动作等等。
注意事项:
运行在主线程,所以不能用来做耗时操作,可以在服务中开子线程来做耗时操作。
本地服务的启动与停止:
有两种启动方式,分别是start和bind。
start方式是由startService方法启动,stopService方法,stopSelf方法,stopSelfResult方法停止。
bind方式则是bindService方法,要停止则要先unbindService。
远程服务:
远程服务用于系统内的程序和程序之间,需要定义IBinder接口。
生命周期:
根据服务的启动方式,服务的生命周期由两部分组成。
start方式启动的服务的生命周期:onCreate()->onStartCommand()->running->onDestroy()->结束。
bind方式启动的服务的生命周期:onCreate()->onBind()->服务和启动源绑定->onUnbind()->onDestroy()->结束。
running时,可以自行停止或通过启动源停止,当执行了stopService方法,会调用onDestroy()。
当执行了unbindService(),会调用onUnbind()。
特点:
Start方式特点:
服务跟启动源无联系,也无法得到服务对象。
Bind方式特点:
通过Ibinder接口实例,返回ServiceConnection对象给启动源,通过ServiceConnection对象的相关方法能得到Service对象。
Start方式启动(例):
//先要在记录文件中进行记录:
<service android:name="所写的Service类">
</service>
服务类:
public class Startservice extends Service
{
@Override
public IBinder onBind(Intent intent) //这里要重写onBind方法
{
return null;
}
}
Activity中:
Intent intent=new Intent(当前Activity对象,服务类的class);
startService(intent);
...
stopService(intent);
Bind方式启动(例):
依旧是先在Android程序的记录文件中进行记录。
服务类:
public class MyBind extends Service
{
public class MyBinder extends Binder //定义MyBinder内部类。
{
public MyBind getit()
{
return MyBind.this;
}
}
public IBinder onBind(Intent intent)
{
return new MyBinder();
}
public void unbindService(ServiceConnection conn)
{
super.unbindService(conn);
}
}
Activity中:
MyBind mb;
......
ServiceConnection con=new ServiceConnection()
{
public void onServiceDisconnected(ComponentName name) //Service的启动源与Service的连接丢失时,该方法会被调用。
{
}
public void onServiceConnected(ComponentName name,IBinder service) //Service的启动源与Service连接成功后,该方法会被调用。
{
mb=((MyBinder)service).getit(); //然后后面就可以用这个mb来调用这个服务类里定义的部分方法。
}
};
......
Intent intent2=new Intent(当前Activity对象,MyBind.class);
bindService(intent2,con,Service.BIND_AUTO_CREATE);
......
unbindService(con);
注:如果start和bind方式一起使用,要注意先stopService,再unbindService。