Service没有用户界面,系统资源要求更低
Service比Activity具有更高的优先级,在系统资源紧张时,Service不会被Android系统优先终止,即使Service被系统终止,在系统资源恢复后Service也可以自动恢复运行状态
Service除了实现后台服务功能,还可以用于进程间通信,解决不用Android应用程序进程之间的调用和通信问题。
通过调用startService()启动Service,通过调用stopService()或stopSelf()停止Service。
绑定方式通过服务链接来使用Service,服务链接能够获取Service的对象实例,因此绑定方式下可以调用Service中实现的函数,获取Service中的状态和数据信息使用Service的组件通过bindService()建立服务链接,通过unbindService()停止服务链接如果在绑定过程中Service没有启动,bindService()会自动启动Service,而且同一个Service可以绑定多个服务链接,这样可以同时为多个不同的组件提供服务
本地服务的调用者和服务都在同一个程序中,是不需要跨进程就可以实现服务的调用
服务管理主要指服务的建立、启动和停止创建服务需要继承Service类,还需要在AndroidManifest.xml文件中进行注册。
还需要三个生命周期函数,分别是onCreate()、onStartCommand()和onDestroy()。
服务生命周期流程:
首先调用startService启动Service,再进入onCreate创建Service时会被调用,用于初始化工作。然后调用onStartCommand()启动Service时被调用,运行Service,当Service被停止时,需要关闭Service,先要调用onDestory()方法释放所占用的资源。
其中onStartCommand的四种返回值,分别是:
START_STICKY:函数执行完后,服务被异常杀掉,系统会自动重启该服务,传入的第一个参数是null。START_NOT_STICKY:函数执行完后,服务被异常杀掉,系统不会自动重启该服务。 START_REDELIVER_INTENT:重传Intent,函数执行完后,服务被异常杀掉,系统会自动重启该服务,并传入Intent的值。START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被杀掉后一定能重启。
有两种方法启动Service,显式启动和隐式启动
显式启动需要在Intent中指明Service所在的类,并调用startService(Intent)启动Service
隐式启动需要在注册Service时,声明Intent-filter的action属性,还要设置Intent的action属性
如果Service和调用服务的组件在同一个应用程序中,可以使用显式启动或隐式启动,但如果服务和调用服务的组件在不同的应用程序中,则只能使用隐式启动,无论是显式启动还是隐式启动,停止Service的方法都是相同的,将启动Service的Intent传递给stopService(Intent)函数
创建一个Service组件,代码如下
@Override
public IBinder onBind(Intent intent) { //绑定方式使用服务
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() { //创建服务
super.onCreate();
Toast.makeText(this,"onCreate",Toast.LENGTH_SHORT).show(); //显示消息
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this,"onStartCommand",Toast.LENGTH_SHORT).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this,"onDestroy",Toast.LENGTH_SHORT).show();
}
final Intent intent = new Intent(MainActivity.this,MyService.class); //显示启动
在按钮一监听器中调用开启服务startService(intent);
在按钮二监听器中调用 stopService(intent);结束服务
final Intent intent = new Intent("www.com.service"); //隐式启动
intent.setPackage("com.example.myapplication01"); //设置包名
隐式启动需要在AndroidManifest中注册service,
//名称需要一致
以绑定方式使用Service,能够获取Service实例,不仅能够正常启动Servie,还能调用Service中的方法与属性。
为了使用Service支持绑定,需要在Service类中重写onBind()方法,并在onBind()方法中返回Service的实例。
绑定方式中,当调用者通过bindService()绑定Service时,onCreate()和onBind()先后被调用当调用者通过unbindService()取消绑定Servcie时,onUnbind()被调用。如果onUnbind()返回true,则表示重新绑定服务时,onRebind()将被调用。
通过bindService()绑定服务
final Intent serIntent = new Intent(this,MyService.class); bindService(serIntent,mConnection,BIND_AUTO);
第1个参数中将Intent传递给bindService()函数,声明需要启动的Service第3个参数BIND_AUTO_CREATE表明只要绑定存在,就自动建立Service,同时也告知Android系统,这个Service的重要程度与调用者相同,除非考虑终止调用者,否则不要关闭这个Service。
第2个参数是ServiceConnnection,由调用者声明,并重写内部的onServiceConnected()方法和onServiceDisconnected()方法绑定成功,系统调用onServiceConnected()方法绑定意外断开,系统调用onServiceDisconnected()方法
使用unbindService()方法进行取消绑定,并将ServiceConnnection传递给unbindService()方法
private MyService myService = null; //创建服务对线
private boolean isBind = false; //标记绑定状态
private static TextView textView;
private ServiceConnection myConnection = new ServiceConnection() { //服务连接
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myService = ((MyService.LocalBinder) service).getService(); //获取服务实例
isBind = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
isBind = false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.ResultTextView);
final Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
bindService(intent,myConnection,BIND_AUTO_CREATE);//绑定服务
}
});
final Button StopButton = findViewById(R.id.StopServiceBTN); //解除绑定
StopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent);
if (isBind){
unbindService(myConnection); //接触绑定的链接
isBind = false;
}
}
});
final Button AddButton = findViewById(R.id.AddBtn);
AddButton.setOnClickListener(new View.OnClickListener(){
@Override //使用加减操作查看服务状态
public void onClick(View v) {
if(isBind){
long a = Math.round(Math.random()*100);
long b = Math.round(Math.random()*100);
long r = myService.Add(a,b);
textView.setText(a +"+"+ b + "=" + r);
}else {
textView.setText("unbind");
}
}
});
}