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();  
            }  
        }  
    }  
}