简介:
Service是和Activity相类似的应用组件,他们都是一个可以自行的程序,最大的区别就在于Activity是有界面显示的,而Service是不需要界面显示的,其是运行在后台的服务。所以Service常用于处理不需要交互界面的一些任务,例如后台播放器播音乐等任务。
基本用法:
实现一个自定义的Service类,继承自系统的Service类,并实现其中的方法
在AndroidManifest.xml文件中注册自定义的Service
通过两种方式来启动Service
由于Service有着两种不同的启动方式,随着启动方式的不同,其生命周期和使用特性也有所不一样,所以我们分别来看这两种启动方式的Service。
通过startService()启动Service
1. 自定义一个Service类,并实现其中需要的的方法
public class MyService extends Service {
//在Service创建时调用
@Override
public void onCreate() {
super.onCreate();
}
//使用stratService()启动时调用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
//销毁时调用
@Override
public void onDestroy() {
super.onDestroy();
}
//在startService()这种启动方式中没有用
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
2. 在AndroidManifest.xml文件中注册Service
<!----注册一个Service>
<service android:name=".MyService">
<!----配置相应的intent过滤器>
<intent-filter >
<action android:name="com.wei.review_service.START_SERVICE" />
</intent-filter>
3. 通过startService()来启动
//声明intent
Intent intent = new Intent();
//为intent指定action
intent.setAction("com.wei.review_service.START_SERVICE");
//启动Service
startService(intent);
//停止Service
stopService(intent);
通过bindService()启动Service
1. 自定义一个Service,并实现其中的方法
public class MyService extends Service {
private int count;
private MyBinder binder = new MyBinder();
//当Service创建时调用
@Override
public void onCreate() {
super.onCreate();
}
//当Service被绑定时调用(必须实现)
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
//当Service解除绑定时调用
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
//当Service销毁时调用
@Override
public void onDestroy() {
super.onDestroy();
}
/**
* 通过继承Binder类来实现IBinder
*/
public class MyBinder extends Binder{
public int getCount(){
return count;
}
}
}
2. 在AndroidManifest.xml文件中注册Service
<service android:name=".MyService">
<intent-filter >
<action android:name="com.wei.review_service.START_SERVICE" />
</intent-filter>
</service>
通过bindService()方法来启动Service
//声明一个Binder引用
MyService.MyBinder myBinder;
//声明一个ServiceConnection实例
ServiceConnection serviceConnection = new ServiceConnection() {
//当Service被绑定时调用,并返回Service中的Binder实例
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
}
//当Service解除绑定时调用
@Override
public void onServiceDisconnected(ComponentName name) {
//实现当service断开连接时需要处理的业务
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定Service
bindService(new Intent("com.wei.review_service.START_SERVICE"), serviceConnection, BIND_AUTO_CREATE);
//解除绑定
unbindService(serviceConnection);
}
两种启动方式的异同:
通过startService()来启动Service,Service和启动它的Activity之间没有关联,只有当调用stopService()或者是被系统清理掉时才会停止,不会因为Activity的退出而结束生命周期。缺点是无法和Service进行交互,当启动一个Service后就只能让Service自己运行。
通过bindService()方法启动Service,其生命周期是和启动它的Activity绑定在一起的,当Activity退出时Service也会自动的结束生命周期。优点是可以通过Binder来实现和Service的交互,可以控制Service的运行情况。
两中启动方式的生命周期图:
两种启动方式混合使用:
之前被人问到说要是两种启动方式混合使用Service生命周期怎么表示,当是简直是一脸懵逼。。
同时使用两种方式来启动同一个Service,我们可以分情况来看一下:
首先不论启动多少次Service,其都只会调用一次onCreate方法,在调用完onCreate方法之后就需要分情况来讨论:
若是先startService,再bindService
- 首先调用onCreate,然后是onStartCommand ,在点击bindService之后会调用onBind()。
- 若是要停止Service时,先点击stopService已经没有效果了,无法停止Service,要先unbindService,然后会调用unbind方法,最后onDestyoy
若是先bindService,然后在startService
- 首先调用onCreate,然后是onBind,在点击startService之后调用onStartCommand 。
- 若是要停止Service时,同样的stopService无法起作用,要先unbindService之后,才会调用onUnBind和onDestroy
结论:
在启动时: Service的onCreate方法只会执行一次,只要service已经启动了,那么就不会再次执行onCreate方法,两种启动方式会调用其专有的生命周期函数。
在停止时: 无论两种启动方式谁先谁后,只要service被bind过,那么在结束时就需要先把service解除绑定,完了之后才会调用结束的方法。
IntentService:
因为Service并不是一条专门的线程,而且他还和他所在的应用在同一进程内,所以不宜在Service中做太多耗时的任务,会阻塞主线程,容易引起ANR(若Service在20s内无反应就会报ANR)。IntentService是Service的一个子类,其被设计用于处理这些问题。
IntentService会单独的创建worker线程来处理所有的Intent请求,而且会创建单独的worker线程来处理onHandleIntent()方法实现的代码,在处理完成请求之后会自动停止,同时对onBind()和onStartCommand()方法提供了默认实现,,只需要实现其处理业务的onHandleIntent()方法即可。
public class MyIntentService extends IntentService {
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public MyIntentService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
//实现需要处理的业务,IntentService已经完成了对于多线程的支持,所以不会阻塞主线程
}
}
系统中的Service:
我们可以通过getSystemService()在Activity中获取有用的系统服务。
1. TelephonyManager:
电话管理器可以用于管理手机通话状态,电话网络信息的服务类。他提供了众多的方法可以对手机的状态进行查看。
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
2. SmsManager:
短信管理器可以用于管理短信的发送和接收。
SmsManager smsManager = SmsManager.getDefault();
3. AudioManager:
音频管理器可以用于处理系统的音量等事物。
AudioManager audioManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);
4. Vibrator:
振动器管理器可以管理手机振动的相关功能,实现对振动器的处理。
Vibrator vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
5. AlarmManager:
闹钟管理器可以管理手机的闹钟服务,或者是一个全局的定时器。
AlarmManager alarmManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);