Android服务(Service)是一种在后台运行的组件,它可以在不与用户交互的情况下执行长时间运行的操作。服务通常用于在后台播放音乐、下载数据、执行网络操作等。
服务的特点如下:
1. 服务是一种后台运行的组件,可以在不与用户交互的情况下执行长时间运行的操作。
2. 服务可以在应用程序的不同组件之间共享数据和状态。
3. 服务可以通过Intent机制与其他组件进行通信,例如启动服务、停止服务、绑定服务等。
4. 服务可以在应用程序的不同进程之间共享数据和状态,这种服务称为跨进程服务。
Android服务的生命周期包括以下几个阶段:
1. onCreate():服务被创建时调用,用于执行一次性的初始化操作。
2. onStartCommand():服务启动时调用,用于执行后台操作。
3. onBind():服务被绑定时调用,用于返回一个IBinder对象,以便客户端与服务进行通信。
4. onUnbind():服务被解绑时调用,用于清理绑定相关的资源。
5. onDestroy():服务被销毁时调用,用于释放资源和停止后台操作。
Android服务的启动方式包括以下两种:
1. 启动服务:通过调用startService()方法启动服务,服务将在后台运行,直到调用stopService()方法停止服务。
2. 绑定服务:通过调用bindService()方法绑定服务,服务将在后台运行,直到所有客户端都解除绑定,或调用unbindService()方法解除绑定。
Android服务是一种强大的组件,它可以在后台执行长时间运行的操作,为应用程序提供了很大的灵活性和功能扩展性。
Service示例
下面我做了一个简单的音乐播放的应用,分别使用startService和bindService来启动本地的服务。
Activity
public class PlayMusicService extends Activity implements OnClickListener {
private Button playBtn;
private Button stopBtn;
private Button pauseBtn;
private Button exitBtn;
private Button closeBtn;
private Intent intent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.music_service);
playBtn = (Button) findViewById(R.id.play);
stopBtn = (Button) findViewById(R.id.stop);
pauseBtn = (Button) findViewById(R.id.pause);
exitBtn = (Button) findViewById(R.id.exit);
closeBtn = (Button) findViewById(R.id.close);
playBtn.setOnClickListener(this);
stopBtn.setOnClickListener(this);
pauseBtn.setOnClickListener(this);
exitBtn.setOnClickListener(this);
closeBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int op = -1;
intent = new Intent("com.homer.service.musicService");
switch (v.getId()) {
case R.id.play: // play music
op = 1;
break;
case R.id.stop: // stop music
op = 2;
break;
case R.id.pause: // pause music
op = 3;
break;
case R.id.close: // close activity
this.finish();
break;
case R.id.exit: // stopService
op = 4;
stopService(intent);
this.finish();
break;
}
Bundle bundle = new Bundle();
bundle.putInt("op", op);
intent.putExtras(bundle);
startService(intent); // startService
}
@Override
public void onDestroy(){
super.onDestroy();
if(intent != null){
stopService(intent);
}
}
}
Service
public class MusicService extends Service {
private static final String TAG = "MyService";
private MediaPlayer mediaPlayer;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
Log.v(TAG, "onCreate");
Toast.makeText(this, "show media player", Toast.LENGTH_SHORT).show();
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer.create(this, R.raw.tmp);
mediaPlayer.setLooping(false);
}
}
@Override
public void onDestroy() {
Log.v(TAG, "onDestroy");
Toast.makeText(this, "stop media player", Toast.LENGTH_SHORT);
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
}
}
@Override
public void onStart(Intent intent, int startId) {
Log.v(TAG, "onStart");
if (intent != null) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
int op = bundle.getInt("op");
switch (op) {
case 1:
play();
break;
case 2:
stop();
break;
case 3:
pause();
break;
}
}
}
}
public void play() {
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
}
}
public void pause() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
public void stop() {
if (mediaPlayer != null) {
mediaPlayer.stop();
try {
mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}