Service简介
Service 是Android中四大组件之一,能够长时间的在后台(不和用户交互)运行,能够给当前App或者其他App的组件提供服务。创建一个Service和创建一个Activity很相似,但是我们需要继承Service这个类。
Service生命周期
Service的启动有两种方式startService()和bindService().
startService(): 启动服务,当一个Android组件(如一个Activity)调用startService()的时候,启动一个服务。服务一旦启动,就可以一直在后台运行下去,即使这个启动它的组件被摧毁。这样的服务模式,通常用于执行一个操作而不需要返回结果给调用者。
bindService(): 绑定服务,当一个Android组件(如一个Activity)调用bindService()。一个绑定服务提供了一个客户端到服务端的接口,允许组件与服务之间进行交互,这样可以实现跨进程的通信。绑定服务的生命周期默认是跟随它的绑定组件的,但是一个绑定服务可以绑定多个Android组件,如果这些Android组件都被销毁,那么这个绑定服务也将被销毁。
这是Service的生命周期示意图
下面是运用StartService实例
Service代码
public class MyService extends Service {
public String TAG = "MyService";
@Override
public void onCreate() {
super.onCreate();
//定义log方法在后台打印
Log.e(TAG, "onCreate() ++++++++++++++++++++++++++++++++++++++++++"+Thread.currentThread().getName());
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy() ++++++++++++++++++++++++++++++++++++++++++++");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand() ++++++++++++++++++++++++++++++++++++++++");
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
Activity代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
//定义两个按钮来向Service发信息
private Button startBtn;
private Button stopBtn;
public String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定id与监听事件
startBtn = findViewById(R.id.start_service);
stopBtn = findViewById(R.id.stop_service);
startBtn.setOnClickListener(this);
stopBtn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.start_service:
//和Activity一样都用Intent传值
Intent startIntent = new Intent(this, MyService.class);
//启动service用startService方法
startService(startIntent);
break;
case R.id.stop_service:
Intent stopIntent = new Intent(this, MyService.class);
//停止service用stopService方法
stopService(stopIntent);
break;
default:
break;
}
}
}
bindService绑定Service的步骤
- 新建类继承Service
- 实现onBind抽象方法(需要在此方法中返回一个Binder子类对象)
- 重写onCreate方法
- 重写onUnbind方法
- 重写onDestory方法
- 在AndroidManifest中注册Service
- 在有Context环境中实现ServiceConnection接口
- 在有Context环境中通过bindService绑定Service
- 在有Context环境中通过unbindService解绑Service
在onBind方法中返回Binder子类对象,通过此对象获得Service对象
示例代码
Service代码
public class MyService2 extends Service {
private String TAG="MyService2";
private int count;
private MyBinder binder = new MyBinder();
private boolean stopFlag;
public class MyBinder extends Binder {
public int getCount(){
return count;//返回子类对象
}
}
@Override
public IBinder onBind(Intent intent) {
System.out.println("执行onBind方法...");
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("执行onUnBind方法...");
return true;
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("执行onCreate方法");
Log.e(TAG, "onCreate: +++++++++++++++++++++++++++++++++++++++++++++++" );
// new Thread(new MyThread()).start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("执行onStartCommand方法");
//三种返回值(仅限使用startService方法启动时有效果)
//START_STICKY,服务被异常杀掉后,会重启服务
//START_NOT_STICKY,服务被异常杀掉后,不会重启服务
//START_REDELIVER_INTENT,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
System.out.println("rebind");
}
@Override
public void onDestroy() {
super.onDestroy();
stopFlag = true;
System.out.println("执行onDestroy方法");
Log.e(TAG, "onDestroy: +++++++++++++++++++++++++++++++++++++++++++++++" );
}
class MyThread extends Thread{
@Override
public void run() {
while(!stopFlag){
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"---"+Thread.currentThread().getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
System.out.println(count);
}
}
}
}
Activity代码
public class ServiceActivity extends AppCompatActivity implements View.OnClickListener {
//在xml中定义三个按钮
private Button btn1;
private Button btn2;
private Button btn3;
//定义Service子类对象,返回获得Service对象
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println("onDisConnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("connected");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service);
//绑定id
btn1 = findViewById(R.id.service_btn1);
btn2 = findViewById(R.id.service_btn2);
btn3 = findViewById(R.id.service_btn3);
//设置监听事件
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.service_btn1:
//传值启动绑定Service
Intent intent=new Intent(this,MyIntentService.class);
startService(intent);
break;
case R.id.service_btn2:
//传值解绑Service
unbindService(conn);
break;
case R.id.service_btn3:
Intent intent1=new Intent(ServiceActivity.this,Service2Activity.class);
startActivity(intent1);
break;
}
}
}
startService与bindService
startService
优点:使用简单,和Activity一样,只要几行代码即可启动Service
缺点:使用startService无法获得Service对象,不能直接操作Service中的属性和方法,只能通过Intent传递不同参数,重复调用startService,触发onStartCommandbindService
优点:可以得到Service对象,灵活控制Service内部的属性和方法
缺点:使用较为复杂