Service启动的两种方式案例

本文详细介绍了Android中服务的两种使用方式:启动式和服务绑定式。启动式服务可以在应用程序关闭后继续运行,而绑定式服务则会在应用程序退出时停止。文章通过实例展示了如何使用这两种服务来播放和控制音乐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Service使用分为启动式和绑定式。
先来看启动式:
启动式最大特点是服务与活动没有绑定,即使关闭程序,服务也照样运行。
以music的方式说明:

// 使用启动式使用服务
public class MusicService extends Service {

    MediaPlayer mMediaPlayer;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        // 事先将音乐文件放在raw目录下
        mMediaPlayer = MediaPlayer.create(MusicService.this, R.raw.music);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
        }
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        int number = intent.getIntExtra("number", 1);
        switch (number) {
        case 1:
            play();
            break;
        case 2:
            pause();
            break;

        default:
            break;
        }
    }

    /**
     * 播放音乐
     */
    private void play() {
        if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
            mMediaPlayer.start();
        }
    }

    /**
     * 暂停音乐
     */
    private void pause() {
        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
            mMediaPlayer.pause();
        }
    }

}

主布局就是四个按钮,就不贴了

public class MainActivity extends Activity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.tv_content);
    }

    public void onClick(View v) {
        Intent mIntent = new Intent(MainActivity.this, MusicService.class);
        switch (v.getId()) {
        case R.id.btn_start:
            mIntent.putExtra("music", 1);
            startService(mIntent);
            mTextView.setText("您已开启服务");
            break;
        case R.id.btn_pause:
            mIntent.putExtra("music", 2);
            startService(mIntent);
            mTextView.setText("您已暂停音乐");
            break;
        case R.id.btn_stop:
            MainActivity.this.finish();
            Toast.makeText(MainActivity.this, "您已关闭程序", Toast.LENGTH_SHORT).show();
            break;
        case R.id.btn_exit:
            stopService(mIntent);
            mTextView.setText("您已退出服务");
            break;

        default:
            break;
        }
    }
}

代码应该没什么难的。下面是效果图:
这里写图片描述

当开始服务后,音乐播放,但当关闭程序后,音乐依然在播放,只有退出服务时才停止音乐。

下面再来看绑定时的情况:
绑定式使用服务时,当程序退出后,服务也会停止,即音乐停止播放。

/**
 *  使用绑定式使用服务
 * @author Administrator
 *
 */
public class MusicService extends Service {

    MediaPlayer mMediaPlayer;
    MyBinder mBinder = new MyBinder();

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    /**
     * 自定义了一个子类继承自Binder,并定义getService()方法用于获取Service对象
     * @author Administrator
     *
     */
    class MyBinder extends Binder{
        MusicService getMusicService(){
            return MusicService.this;
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        // 事先将音乐文件放在raw目录下
        mMediaPlayer = MediaPlayer.create(MusicService.this, R.raw.music);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
        }
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    /**
     * 播放音乐
     */
    public void play() {
        if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
            mMediaPlayer.start();
        }
    }

    /**
     * 暂停音乐
     */
    public void pause() {
        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
            mMediaPlayer.pause();
        }
    }

}
public class MainActivity extends Activity {

    private TextView mTextView;
    MusicService mService;
    MyServiceConnection mServiceConnection = new MyServiceConnection();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.tv_content);
    }

    public void onClick(View v) {

        Intent mIntent = new Intent(MainActivity.this, MusicService.class);

        switch (v.getId()) {
        case R.id.btn_bind:
            bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
            mTextView.setText("您已绑定服务");
            break;

        case R.id.btn_pause:
            if (mService != null) {
                mService.pause();
            }
            mTextView.setText("您已暂停音乐");
            break;

        case R.id.btn_stop:
            MainActivity.this.finish();
            Toast.makeText(MainActivity.this, "您已关闭程序", Toast.LENGTH_SHORT).show();
            break;

        case R.id.btn_unbind:
            unbindService(mServiceConnection);
            mTextView.setText("您已取消绑定");
            break;

        default:
            break;
        }
    }

    /**
     * 使用绑定式启动服务时,必须创建ServiceConnection类的对象,才能进行绑定
     * 
     * @author Administrator
     *
     */
    class MyServiceConnection implements ServiceConnection {

        // 返回一个IBinder接口对象,该对象即为onBind()方法返回的对象,
        // 通过该对象获取Service对象,进而调用Service对象中的其他方法
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = ((MusicService.MyBinder) service).getMusicService();
            if (mService != null) {
                mService.play();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;
        }

    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值