service是Android的四大组件之一,是一个可以在后台长时间运行而不使用用户界面的应用组件。服务能够被其他组件启动、绑定、交互、通信。service本身不会创建子线程,而是运行在UI线程中,所以大多时候我们都需要在service中开辟一个子线程去执行任务。
service的典型应用场景是:音乐播放器的后台播放,进程的保活,和服务器保持心跳连接等。
Service的两种启动方式
- startService(): 通常用以执行单一的操作并且不会向调用者返回结果。
- bindService(): 绑定service。实现与调用者的交互和通信。绑定服务的生存期和被绑定的应用程序组件一致。多个组件同时与一个服务绑定时,当所有的组件都解除绑定后,服务才会被销毁。
Service的生命周期
- onCreat():首次创建服务时被调用,再次调用服务时不会被被调用。
- onstartCommand():当调用startService()请求启动服务时,系统调用此方法。一旦执行此方法,服务即会在后台无限期运行。可以通过stopSelf()来停止服务。
- onBind():在使用bindService与服务绑定的时候调用(如果之前Service没有被创建,会先执行OnCreate()方法)。
- onUnbind():当所有的组件都解除绑定时候会调用这个方法。
- onDestroy():当服务不再使用被销毁时调用。
Activity和Service的通信实例
activity代码如下:
package com.example.zhangchao.test;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
private Button mBtStart;
private Button mBtStop;
private Button mBtBind;
private Button mBtUnbind;
private MyService.MyBind myBind;
//与Service绑定的连接
private final ServiceConnection serviceConnection = new ServiceConnection() {
//当service被绑定时调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBind = (MyService.MyBind)service;
myBind.download();
}
@Override
public void onServiceDisconnected(ComponentName name) {
myBind = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
//启动service
mBtStart = findViewById(R.id.start);
mBtStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent startIntent = new Intent(MainActivity.this, MyService.class);
startService(startIntent);
}
});
//停止service
mBtStop = findViewById(R.id.stop);
mBtStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent stopIntent = new Intent(MainActivity.this, MyService.class);
stopService(stopIntent);
}
});
//绑定service
mBtBind = findViewById(R.id.bind);
mBtBind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent startIntent = new Intent(MainActivity.this, MyService.class);
bindService(startIntent,serviceConnection,BIND_AUTO_CREATE);
}
});
//解除与service的绑定
mBtUnbind = findViewById(R.id.unbind);
mBtUnbind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(serviceConnection);
}
});
//调用service的方法
findViewById(R.id.download).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myBind.download();
}
});
}
}
service代码如下:
package com.example.zhangchao.test;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
/**
* 创建时间:2019/3/7
* 作者:zhangchao
* 描述:
*/
public class MyService extends Service{
public static final String TAG = "MyService";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() executed");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand() executed");
//Log.d(TAG,intent.getStringExtra("num"));
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() executed");
}
private void function(){
}
@Override
public IBinder onBind(Intent intent) {
return new MyBind();//返回一个实例
}
//用来提供和其他组件绑定的内部类,继承自Binder
class MyBind extends Binder{
public void download(){
Log.d(TAG,"start download");
function();
}
}
}
IntentService的使用
特点:
- InteniService自带一个工作线程,不需要自己创建
- 将要做的工作放到onHandleIntent()方法中。
- 当有多个任务传入IntentService中的时候,IntentService也只会维护一个线程,每个任务会采用先来先处理的方法进行执行,当认为所有任务被执行完,会执行onDestroy()回掉方法。
import android.app.IntentService;
import android.content.Intent;
/**
* 创建时间:2019/3/7
* 作者:zhangchao
* 描述:
*/
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
public void onCreate() {
super.onCreate();
}
@Override
public void onStart( Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public int onStartCommand( Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
protected void onHandleIntent( Intent intent) {
/**
* 在这里处理操作
* 不需要自己创建新的线程
*/
}
}











网友评论