定义一个Service与定义Activity类似:
①定义一个类继承Service。
②在AndroidManifest.xml文件中配置该Service。
Service也有自已的生命周期
IBinder onBind(Intent intent)
子类必须实现的方法,IBinder可实现与Service的通信。void onCreate()
该Service第一次创建时回调。void onStartCommand(Intent intent, int flags, int startId)
每次程序调用startService(intent)的被调用。void onDestroy()
销毁该Service时被调用。boolean onUnbind(Intent intent)
当该Service上所有绑定的程序都断开连接时回调。
启动Service有2种方式
Context的startService()
该方法启动Service,启动者与Service没有什么关联,即使启动者退出,Service依然运行Context的bindService()
该方法启动Service,启动者与Service关联,启动者退出,Service也就终止了
下面给出两种启动方式实例:
1.startService()
这边只是简单的打印一句话,真正的是写上业务所需代码即可。
public class TestServiceActivity extends BaseActivity {
@Bind(R.id.startService)
private Button startService;
@Bind(R.id.stopService)
private Button stopService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_service_activity);
startService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(TestServiceActivity.this, MySerivce.class);
startService(intent);
}
});
stopService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(TestServiceActivity.this, MySerivce.class);
stopService(intent);
}
});
}
}
MyService:
public class MySerivce extends Service{
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Log.e("e","onCreate");
super.onCreate();
}
@Override
public void onDestroy() {
Log.e("e","onDestroy");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("e","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
}
2.bindService()
bindService较复杂,因为调用方需要与Service建立通信;
关键在于IBinder这个类,所有对Service的操作,状态都可以通过该类返回;
而在调用方可以通过ServiceConnection这个类与Service进行通信,ServiceConnection实例化必须实现的连个方法,如下:
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("e", "onServiceConnected");
//这边service对象便是Service中onBind()返回的IBinder
myBinder = (MySerivce.MyBinder)service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
//发生异常中断时会被调用
Log.e("e", "onServiceDisconnected");
}
public class TestServiceActivity extends BaseActivity {
@Bind(R.id.startService)
private Button startService;
@Bind(R.id.stopService)
private Button stopService;
@Bind(R.id.getCount)
private Button getCount;
private MySerivce.MyBinder myBinder;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("e", "onServiceConnected");
//这边service对象便是Service中onBind()返回的IBinder
myBinder = (MySerivce.MyBinder)service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
//发生异常中断时会被调用
Log.e("e", "onServiceDisconnected");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_service_activity);
startService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(TestServiceActivity.this, MySerivce.class);
bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
}
});
stopService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//解绑
unbindService(serviceConnection);
}
});
getCount.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(TestServiceActivity.this, String.valueOf(myBinder.getCount()), Toast.LENGTH_SHORT).show();
}
});
}
}
MyService:
public class MySerivce extends Service{
private int count = 0;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
@Override
public void onCreate() {
Log.e("e","onCreate");
new Thread(){
@Override
public void run() {
while (true){
try {
Thread.sleep(1000);
count ++;
Log.e("e",""+count);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
super.onCreate();
}
@Override
public void onDestroy() {
Log.e("e","onDestroy");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("e","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
public class MyBinder extends Binder{
public int getCount(){
return count;
}
}
@Override
public boolean onUnbind(Intent intent) {
Log.e("e","onUnbind");
return super.onUnbind(intent);
}
}