android中的service与Activity之间的通信

package com.example.servicefyy;

主界面的程序代码哦!
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
    private SeekBar mSb;
    private TextView mTv;
    private boolean isStop;
    MyService.MyBinder mBinder;
    private Handler mHander = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (isStop){
                return;
            }
            mSb.setMax(mBinder.getDuration());
            mSb.setProgress(mBinder.getCurrentPos());
            mHander.sendEmptyMessageDelayed(111, 1200);

        }
    };
    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mBinder = (MyService.MyBinder) service;//serivceActivity的通信哦
            mHander.sendEmptyMessage(111);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSb = (SeekBar) findViewById(R.id.sb);
        mTv = (TextView) findViewById(R.id.tv);
        mSb.setOnSeekBarChangeListener(this);
        Intent intent = new Intent(this, MyService.class);
        this.bindService(intent, conn, BIND_AUTO_CREATE);
    }


    public void go1(View view) {
        isStop = false;
        mHander.sendEmptyMessage(111);//停止后的重新开始,需要发送消息,提示界面的更新哦哦!
        Intent intent = new Intent(this, MyService.class);
        intent.putExtra("command", MyService.COMMAND_PLAYER);
        startService(intent);
    }

    public void go2(View view) {
        isStop = true;
        Intent intent = new Intent(this, MyService.class);
        intent.putExtra("command", MyService.COMMAND_STOP);
        startService(intent);
    }

    public void go3(View view) {
        Intent intent = new Intent(this, MyService.class);
        intent.putExtra("command", MyService.COMMAND_PAUSE);
        startService(intent);
    }

    public void go4(View view) {
        Intent intent = new Intent(this, MyService.class);
        intent.putExtra("command", MyService.COMMAND_RESUME);
        startService(intent);
    }

    public void go5(View view) {
        Intent intent = new Intent(this, MyService.class);
        intent.putExtra("command", MyService.COMMAND_KJIN);
        startService(intent);
    }

    public void go6(View view) {
        Intent intent = new Intent(this, MyService.class);
        intent.putExtra("command", MyService.COMMAND_KTUI);
        startService(intent);
    }


    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser) {//手动拖动哦
            if (isStop) {
                return;
            }
            Intent intent = new Intent(this, MyService.class);
            intent.putExtra("command", MyService.COMMAND_XJD);
            intent.putExtra("jd", progress);
            startService(intent);

        }


    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解绑定哦哦哦!
        this.unbindService(conn);
    }
}


服务中的程序哦哦哦哦!

package com.example.servicefyy;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.Environment;
import android.os.IBinder;
import android.widget.Toast;

import java.io.IOException;

public class MyService extends Service implements MediaPlayer.OnPreparedListener {
    //主线程终止,子线程不会终止的哦哦!
    private MediaPlayer mMediaPlayer;//内部封装有子线程进行音乐播放哦!
    private String musicPath;
    private boolean isStop;//判断是否停止哦!
    private boolean isPrepare;//判断是否准备哦!
//    private MyThread mMyThread;

    public static final String COMMAND_PLAYER = "player";
    public static final String COMMAND_STOP = "stop";
    public static final String COMMAND_PAUSE = "pause";
    public static final String COMMAND_RESUME = "resume";
    public static final String COMMAND_KJIN = "kjin";
    public static final String COMMAND_KTUI = "ktui";
    public static final String COMMAND_XJD = "jd";


    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        getMedia();
    }

    void getMedia() {
        mMediaPlayer = new MediaPlayer();//声明实例化MediaPlayer哦!
        musicPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/love.mp3";
        try {//获取本地文件的路径哦哦!
            mMediaPlayer.setDataSource(this, Uri.parse(musicPath));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String command = intent.getStringExtra("command");
        if (command == null) {
            return super.onStartCommand(intent, flags, startId);
        }
        switch (command) {
            case COMMAND_PLAYER:
                doPlay();
                break;
            case COMMAND_STOP:
                doStop();
                break;
            case COMMAND_PAUSE:
                doPause();
                break;
            case COMMAND_RESUME:
                doResume();
                break;
            case COMMAND_KJIN:
                doKin();
                break;
            case COMMAND_KTUI:
                doKTui();
                break;
            case COMMAND_XJD:
                doXJD(intent.getIntExtra("jd", 0));
                break;
        }

        return super.onStartCommand(intent, flags, startId);
    }

    private void doXJD(int prigrass) {
        mMediaPlayer.seekTo(prigrass);
    }

    private void doKTui() {

        Toast.makeText(this, "快退", Toast.LENGTH_SHORT).show();
        mMediaPlayer.seekTo(mMediaPlayer.getCurrentPosition() - 5000);
    }

    private void doKin() {
        Toast.makeText(this, "快进", Toast.LENGTH_SHORT).show();
        mMediaPlayer.seekTo(mMediaPlayer.getCurrentPosition() + 5000);
    }

    private void doResume() {

        Toast.makeText(this, "继续", Toast.LENGTH_SHORT).show();
        mMediaPlayer.start();
    }

    private void doPause() {

        Toast.makeText(this, "暂停", Toast.LENGTH_SHORT).show();
//        mMediaPlayer.stop();
        mMediaPlayer.pause();
    }

    private void doStop() {
        Toast.makeText(this, "停止", Toast.LENGTH_SHORT).show();
        isStop = true;
        isPrepare = false;
        //停止播放,并释放资源哦哦!
        //完全释放mMediaPlayer资源--等同于销毁哦!需要重新构造资源才能播放哦!
        mMediaPlayer.stop();
        mMediaPlayer.release();
    }

    private void doPlay() {
        Toast.makeText(this, "开始", Toast.LENGTH_SHORT).show();
        if (isStop) {
            getMedia();//release后,需要重新构造资源哦!
        }
        if (!isPrepare) {
            //通常异步处理(子线程)都会有一个回调的结果!
            mMediaPlayer.prepareAsync();//要播放,先准备哦!--开启子线程哦!准备是耗时的操作哦
            mMediaPlayer.setOnPreparedListener(this);
        }
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
//        mSb.setProgress(mMediaPlayer.getDuration());//获取最大进度哦哦!
//        if (mMyThread == null || !mMyThread.isAlive()) {
//            mMyThread = new MyThread();//为确保子线程只能start一次的机制的进行哦!
//            mMyThread.start();
//        }
        //准备好,在开始哦哦!
        mMediaPlayer.start();
        isPrepare = true;
        isStop = false;
    }

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

    public class MyBinder extends Binder {
        public int getCurrentPos() {
            if (!isPrepare) {
                return 0;
            }
            return mMediaPlayer.getCurrentPosition();//返回当前的进度哦哦!
        }

        public int getDuration() {
            if (!isPrepare) {
                return 100;
            }
            return mMediaPlayer.getDuration();//返回总时长哦!
        }
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值