Service 是 android的一个重要组建,用到的地方也比较多。
service 和 Thread是两个不同的概念,初学者很容易把两者搞混,其实两者之间半毛钱关系都没有。
service是独立于activity存在的,有两种类型,一种是本地类型,一种是远程类型。先说本地的
本地service的运行是在主进程中main线程上,也就是UI线程上,不能直接做耗时操作,否则就造成UI线程卡顿了。
service的启动方式有两种,直接startService(intent); 或者绑定service,启动服务。
方式一:
有service类 class MyService extends Service{}
Intent intent = new Intent(this, MyService.class);
直接执行startService(intent)方法,对应的service的生命周期,执行 onCreate() 和 onStartCommand(Intent intent, int flags, int startId)方法
此时再次或多次点击开启服务方法,即 startService(intent)方法,对应的service的生命周期,只会执行 onStartCommand(Intent intent, int flags, int startId)方法
点击停止服务按钮,即stopService(intent); 对应的service的生命周期,执行onDestroy()方法。
方式二
有service类 class MyService extends Service{
private MyBinder mBinder ;
@Override
public void onCreate() {
super.onCreate();
mBinder = new MyBinder();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
class MyBinder extends Binder {
public void startDownload() {
Log.d("TAG", "startDownload");
}
}
}
Intent intent = new Intent(this, MyService.class);
activity中 {
private MyService.MyBinder myBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
myBinder.startDownload();
}
};
}
绑定service方式启动一个服务,
bindService(intent, connection, BIND_AUTO_CREATE); ,此时,会发现service的生命周期为 onCreate()和activity中connection 的 onServiceConnected(ComponentName name, IBinder service)方法,不会执行 onStartCommand(Intent intent, int flags, int startId)方法。
解除绑定
unbindService(connection); 对应service生命周期为 onDestroy()。
bindService(intent, connection, BIND_AUTO_CREATE)方法中的常量 BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service
这是两种的服务启动方式,但有时候会有一种另类的混合方式,
如果点击了startService(intent); 又点击了bindService(intent, connection, BIND_AUTO_CREATE);当要停止service时会惊奇的发现,不管是单独执行stopService(intent);或者unbindService(connection);都不起作用,必须两个方法都执行才能是service销毁,执行onDestroy()方法。 这种情况,unbindService(connection);是让service和activity解除关联,stopService(intent)是让service停止。service销毁必须是解除关联状态且处于停止状态。
本地service是处于主线程中,经常用到的是和Notification一块使用,或者是和广播使用,有一种功能,估计大部分app都用到了,就是版本升级,下载apk时,在通知栏显示出一个进度条,动态显示下载的进度。这方面网上很多例子,可以搜搜。
service 和 Thread是两个不同的概念,初学者很容易把两者搞混,其实两者之间半毛钱关系都没有。
service是独立于activity存在的,有两种类型,一种是本地类型,一种是远程类型。先说本地的
本地service的运行是在主进程中main线程上,也就是UI线程上,不能直接做耗时操作,否则就造成UI线程卡顿了。
service的启动方式有两种,直接startService(intent); 或者绑定service,启动服务。
方式一:
有service类 class MyService extends Service{}
Intent intent = new Intent(this, MyService.class);
直接执行startService(intent)方法,对应的service的生命周期,执行 onCreate() 和 onStartCommand(Intent intent, int flags, int startId)方法
此时再次或多次点击开启服务方法,即 startService(intent)方法,对应的service的生命周期,只会执行 onStartCommand(Intent intent, int flags, int startId)方法
点击停止服务按钮,即stopService(intent); 对应的service的生命周期,执行onDestroy()方法。
方式二
有service类 class MyService extends Service{
private MyBinder mBinder ;
@Override
public void onCreate() {
super.onCreate();
mBinder = new MyBinder();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
class MyBinder extends Binder {
public void startDownload() {
Log.d("TAG", "startDownload");
}
}
}
Intent intent = new Intent(this, MyService.class);
activity中 {
private MyService.MyBinder myBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
myBinder.startDownload();
}
};
}
绑定service方式启动一个服务,
bindService(intent, connection, BIND_AUTO_CREATE); ,此时,会发现service的生命周期为 onCreate()和activity中connection 的 onServiceConnected(ComponentName name, IBinder service)方法,不会执行 onStartCommand(Intent intent, int flags, int startId)方法。
解除绑定
unbindService(connection); 对应service生命周期为 onDestroy()。
bindService(intent, connection, BIND_AUTO_CREATE)方法中的常量 BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service
这是两种的服务启动方式,但有时候会有一种另类的混合方式,
如果点击了startService(intent); 又点击了bindService(intent, connection, BIND_AUTO_CREATE);当要停止service时会惊奇的发现,不管是单独执行stopService(intent);或者unbindService(connection);都不起作用,必须两个方法都执行才能是service销毁,执行onDestroy()方法。 这种情况,unbindService(connection);是让service和activity解除关联,stopService(intent)是让service停止。service销毁必须是解除关联状态且处于停止状态。
本地service是处于主线程中,经常用到的是和Notification一块使用,或者是和广播使用,有一种功能,估计大部分app都用到了,就是版本升级,下载apk时,在通知栏显示出一个进度条,动态显示下载的进度。这方面网上很多例子,可以搜搜。