前言:说白了,其实就3步走。
1、创建service(和Activity绑定启动时,需要创建Binder内部类);
2、注册service;
3,intent启动或绑定;
具体代码如下:
一、Service的基本启动
1、新建一个MyService继承自Service,并重写父类的onCreate()、onStartCommand()和onDestroy()方法,如下所示:
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");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() executed");
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
2、在AndroidManifest.xml中注册
……
3、开启、关闭一个服务
//开启
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent);
//关闭
Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent);
由于onCreate()方法只会在Service第一次被创建的时候调用,如果当前Service已经被创建过了,不管怎样调用startService()方法,onCreate()方法都不会再执行,只会有onStartCommand()方法中的打印日志。
二、Service和Activity通信,绑定启动
1、有一个onBind()方法一直都没有使用到,这个方法其实就是用于和Activity建立关联的。修改MyService中的代码,如下所示:
public class MyService extends Service {
public static final String TAG = "MyService";
private MyBinder mBinder = new MyBinder();
/**
* 首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用
* onStartCommand() 或 onBind() 之前)。
* 如果服务已在运行,则不会调用此方法。该方法只被调用一次
*/
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() executed");
}
/**
* 每次通过startService()方法启动Service时都会被回调。
* @param intent
* @param flags
* @param startId
* @return
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand() executed");
return super.onStartCommand(intent, flags, startId);
}
/**
* 服务销毁时的回调
*/
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() executed");
}
/**
* 绑定服务时才会调用
* 必须要实现的方法
* @param intent
* @return
*/
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/**
* 内部binder类
*/
class MyBinder extends Binder {
public void startDownload() {
Log.d("TAG", "startDownload() executed");
// 执行具体的下载任务
}
}
}
2、在Activity中创建ServiceConnection;
private MyService.MyBinder myBinder;
/**
* ServiceConnection代表与服务的连接,它只有两个方法,
* onServiceConnected和onServiceDisconnected,
* 前者是在操作者在连接一个服务成功时被调用,而后者是在服务崩溃或被杀死导致的连接中断时被调用
*/
private ServiceConnection connection = new ServiceConnection() {
/**
* 当取消绑定的时候被回调。但正常情况下是不被调用的,它的调
* 用时机是当Service服务被意外销毁时,
* 例如内存的资源不足时这个方法才被自动调用。
*/
@Override
public void onServiceDisconnected(ComponentName name) {
}
/**
* 与服务器端交互的接口方法 绑定服务的时候被回调,在这个方
* 法获取绑定Service传递过来的IBinder对象,
* 通过这个IBinder对象,实现宿主和Service的交互。
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
myBinder.startDownload();
}
};
3、绑定、解绑服务
//绑定
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
//解绑
unbindService(connection);
感谢:
Android Service完全解析,关于服务你所需知道的一切
关于Android Service真正的完全详解,你需要知道的一切