一、Service 概述
Service是在后台运行,不可见,没有用户界面的组件。通常用于播放音乐、记录地理位置的改变、监听某种动作等等。但优先级高于Activity。
Service运行在主线程,不能让它做耗时的请求或动作,可以在单独开一个线程,在线程中做耗时动作。
二、Service种类
1、本地服务(Local Service)
-用于应用程序内部
-startService启动
stopService结束
stopSelf 或stopSelfResult自己停止
-bindService绑定
unbindService解绑定
2、远程服务(Remote Service)
-Android系统内部的应用程序之间
-定义IBinder接口
三、Service使用方式
1、Start
-服务跟启动源没有任何联系
-无法得到服务对象
2、Bind
-通过Ibinder接口实例,返回一个ServiceConnection对象给启动源
-通过ServiceConnection对象的相关方法可以得到Service对象
四、Service生命周期
1、startService:onCreate() ->onStartCommand()(可多次调用) ->onDestroy()
2、bindService:onCreate() ->onBind()(不可多次绑定)->onUnbind() -> onDestroy()
3、生命周期图
@Override
public void onCreate() {
super.onCreate();
Log.i("info", "Android--onCreate");
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(){
@Override
public void run() {
super.run();
Log.i("info","Android--onStartCommand");
}
}.start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("info", "Android--onDestroy");
}
五、使用方法
-新建自定义Service继承自Service
-在AndroidManifest.xml中注册这个Service
android:enabled Service是否能被系统初始化,默认为true(
android:exported 标识该组件是否可以被其他应用程序调用,或者与其交互(该参数的默认值取决于
android:icon 进程菜单中显示该Service的Logo
android:label 进程菜单中显示该Service的Name
android:permission 标识此Service的调用权限,如果没有设置,则默认使用
1、Start启动
-在主线程Activity中通过startService(intent)方式启动
通过stopService(intent)方式停止
-启动方式是通过启动intent方式实现
启动后该Service和启动源没有关系,即使主线程退出,service仍会继续运行
2、Bind启动
-自定义类继承Binder类并实现方法getService(),该方法返回一个自定义BindService类的对象
public class MyBinder extends Binder{
public MyBindService getService(){
return MyBindService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
返回一个ServiceConnection对象给启动源,重写onServiceConnected()和onServiceDisconnected()
启动源通过调用其onServiceConnected()方法取得Service对象
bindService()中指定ServiceConnection参数
调用Service中定义的方法
private Intent intent;
MyBindService service;
ServiceConnection con = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
service = ((MyBindService.MyBinder)binder).getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(MainActivity.this,MyBindService.class);
findViewById(R.id.btn_start).setOnClickListener(this);
findViewById(R.id.btn_stop).setOnClickListener(this);
findViewById(R.id.btn_Bind).setOnClickListener(this);
findViewById(R.id.btn_UnBind).setOnClickListener(this);
findViewById(R.id.btn_play).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn_start:
startService(intent);
break;
case R.id.btn_stop:
stopService(intent);
break;
case R.id.btn_Bind:
bindService(intent,con,Context.BIND_AUTO_CREATE);
break;
case R.id.btn_UnBind:
unbindService(con);
break;
case R.id.btn_play:
service.play();
break;
}
}
三、常用系统服务