Service是服务,是后台运行的组件。比如一边刷朋友圈,一边听音乐,音乐的activity已不可见,但音乐一直播放着,这是服务起的作用。
接下来介绍服务的使用,在这里提几点。
1.Service中onStart()早在android 2.0时就已过时,使用onStartCommand()。
2.服务的启动,在android 5.0时,有了新的限制,service服务必须采用显示方式启动。
Intent intent = new Intent();
intent.setAction("csdn.u.server");
intent.setPackage(getPackageName());
startService(intent);
//startService(new Intent("csdn.u.server"));此方式在android 5.0后不可用。
使用方式一(startService、stopService):
MusicServer.java(继承Service的类)
public class MusicServer extends Service {
MediaPlayer m;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 播放音乐
m = MediaPlayer.create(this, R.raw.a);
m.start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
m.stop();
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
在AndroidManifest.xml注册Service组件。
<service android:name=".MusicServer" >
<intent-filter>
<action android:name="csdn.u.server" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
启动、关闭服务
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//启动服务
Intent intent = new Intent();
intent.setAction("csdn.u.server");
intent.setPackage(getPackageName());
startService(intent);
}
});
btn_stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//关闭服务
Intent intent = new Intent();
intent.setAction("csdn.u.server");
intent.setPackage(getPackageName());
stopService(intent);
}
});
使用方式二(bindService会将activity与service绑定,也就是说activity销毁,service也销毁,activity与service的共生与共死):
MusicServer.java(继承Service的类,与上面的不同。MyBind的创建是为了onBind()有返回值,即触发onServiceConnected()。onBind()的返回值使得可以在onServiceConnected()中对service进行操作)
public class MusicServer extends Service {
MediaPlayer m;
MyBind binder = new MyBind();
@Override
public void onCreate() {
super.onCreate();
Log.i("MusicServer", "onCreate");
m = MediaPlayer.create(this, R.raw.a);
m.start();
}
@Override
public IBinder onBind(Intent intent) {
Log.i("MusicServer", "onBind");
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("MusicServer", "onUnbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.i("MusicServer", "onDestroy");
m.stop();
super.onDestroy();
}
class MyBind extends Binder{
public MusicServer getbinder(){
return MusicServer.this;
}
}
}
在AndroidManifest.xml注册service
<service android:name=".MusicServer" ></service>
绑定服务,解除服务
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Log.i("service", "Disconnect");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Log.i("service", "Connect");
//可以操作service
}
};
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MusicServer.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
});
btn_stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
unbindService(connection);
}
});
startService的生命周期
onCreate() → onStartCommand() → onDestroy()
bindService()的生命周期
onCreate() → onBind() → onUnbind() → onDestroy()