zoukankan      html  css  js  c++  java
  • 绑定服务抽取接口

    示例代码 简易的播放器:

    A. 写一个接口,在接口中写一个要暴露出去的方法

    B. 让服务里的内部类实现这个接口

    C. activity的连接成功后,强转为接口类型

    D. 调用接口中的方法,实际上调用的时接口的实现类服务里的内部类里的方法

    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.os.Binder;
    import android.os.IBinder;
    public class MusicService extends Service {
       private MediaPlayer   mediaPlayer;
       @Override
       public IBinder onBind(Intent intent) {
          return new Music();
       }
       private class Music extends Binder implements IMusicService{
          @Override
          public void play() {
             playMusic();
          }
          @Override
          public void pause() {
             pauseMusic();
          }
          @Override
          public void stop() {
             stopMusic();
          }
          @Override
          public void resume() {
             resumeMusic();
          }
       }
    
       public void playMusic(){
          //避免音乐二重唱
          if (mediaPlayer != null) {
             mediaPlayer.stop();
             mediaPlayer.release();//释放音乐
             mediaPlayer = null;
          }
          //创建音乐对象
          mediaPlayer = MediaPlayer.create(this, R.raw.ib);
          //开启播放
          mediaPlayer.start();
       }
       public void stopMusic() {
          if (mediaPlayer != null && mediaPlayer.isPlaying()) {
             mediaPlayer.stop();
          }
       }
       public void resumeMusic() {
          if (mediaPlayer != null && !mediaPlayer.isPlaying()) {
             mediaPlayer.start();
          }
       }
       public void pauseMusic(){
          if (mediaPlayer != null && mediaPlayer.isPlaying()) {
             mediaPlayer.pause();
         }
       }

    /**
     * 音乐服务的接口
     * 暴露播放 、暂停、停止、继续播放的功能
     */
    public interface IMusicService {
       /**
        * 播放音乐
        */
       public void play();
       public void pause();
       public void stop();
       public void resume();
    }

    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.view.View;
    
    
    
    public class MainActivity extends Activity {
       private Intent     intent;
       private MusicCon   mConn;
       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          // start开启服务,让服务长期运行在后台
          intent = new Intent(this, MusicService.class);
          startService(intent);
          // bind绑定服务,调用服务里的方法
          mConn = new MusicCon();
          bindService(intent, mConn, BIND_AUTO_CREATE);
       }
       /**
        * 播放音乐
        */
       public void start(View v) {
          mService.play();
       }
       /**
        * 暂停音乐
        */
       public void pause(View v) {
          mService.pause();
       }
    
       /**
        * 停止播放
        */
       public void stop(View v) {
         mService.stop();
       }
    
       /**
        * 继续播放音乐
        */
       public void resume(View v) {
          mService.resume();
       }
       private IMusicService mService;
       /**
        * 音乐的连接对象
        */
       private class MusicCon implements ServiceConnection {
         @Override
          public void onServiceDisconnected(ComponentName name) {
          }
          @Override
          public void onServiceConnected(ComponentName name, IBinder service) {
             mService = (IMusicService) service;
          }
       }
      /**
        * 在activity销毁前解绑服务
        */
       @Override
       protected void onDestroy() {
         super.onDestroy();
          unbindService(mConn);
       }
    }

    清单文件注册服务:
          <service android:name="com.example.dugu_music.MusicService" ></service>
    
  • 相关阅读:
    八大排序算法思想介绍
    关于高并发问题的点滴思考
    一致性Hash算法的原理与实现(分布式映射算法)
    Java线程安全与锁优化
    JAVA体系的线程的实现,线程的调度,状态的转换
    CSS + ul li 横向排列的两种方法
    CSS 有序或者无序列表的前面的标记 list-style-type 属性
    HTML+CSS实现导航栏二级下拉菜单完整代码
    C#中关于DataGridView行和列的背景色-前景色设置
    WinForm------GridControl单元格内容修改外表样式
  • 原文地址:https://www.cnblogs.com/loaderman/p/6416286.html
Copyright © 2011-2022 走看看