android BindService介绍

 

BindService中使用bindService()方法来绑定服务,调用者和绑定者绑在一起,调用者一旦退出服务也就终止了【onCreate()->onBind()->onUnbind()->onDestroy()】。

由于Android 中的Service使用了onBind 的方法去绑定服务,返回一个Ibinder对象进行操作,而我们要获取具体的Service方法的内容的时候,我们需要Ibinder对象返回具体的Service对象才能操作,所以说具体的Service对象必须首先实现Binder对象,这个样子的话我们才能利用bindService的方法对Service进行绑定,获取Binder对象之后获取具体的Service对象,然后才获取Service中的方法等等。所以我们需要注意的是bindService的方式去绑定服务获取的必定是实现了Binder的对象,所以这是我们必须使用Binder的方式去获取Service的方式而不是直接使用Service的类,这个是Android内部实现所约束的。

方法过程如下:

Intent intent = new Intent(MainActivity.this,BindService.class)->新建了BindService对象->新建了MyBinder对象

->bindService(intent, conn, Context.BIND_AUTO_CREATE);->onBind()函数  -----传递MyBinder对象------->onServiceConnected()

 --> 通过传递的Binder对象获取刚刚和Binder对象对应的BindService 对象  -->调用Service中定义的方法。

    这个其中必须通过Binder对象,因为是通过Binder对象来传递的,通过Binder对象获取Service对象,然后获取所需的服务,所以Service必须实现Binder,以便传递和使用。

演示一个播放器的小例子,是用bindService的方法来进行的

第一步,编写AndroidMainFest.xml文件

<?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="cn.edu.zwu.tel"
     android:versionCode="1"
     android:versionName="1.0" >
 
     <uses-sdk android:minSdkVersion="8" />
 
     <application
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name" >
         <activity
             android:name=".MyMusicPlayer1Activity"
             android:label="@string/app_name" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
          <activity android:name=".PlayerActivity">
         </activity>
         <service android:enabled="true" android:name=".MusicService">
         </service>
     </application>
 
 </manifest>


 

第二步:编写PlayerActivity.java文件

 import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.view.View;
 import android.widget.ImageButton;
 import android.widget.SeekBar;
 
 
 public class PlayerActivity extends Activity {
 
     private MusicService musicService;
     ImageButton imageButtonStop;
     ImageButton imageButtonNext;
     ImageButton imageButtonPlay;
     ImageButton imageButtonPre;
     ImageButton imageButtonRepeat;
     SeekBar musicSeekBar;
 
     boolean isPlaying = false;
     boolean isBound=false;
     //conn的作用相当于管道连接作用,链接playerActivity和MusicService,
     private ServiceConnection conn=new ServiceConnection(){
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) 
         {
             musicService=((MusicService.MyBinder)service).getService();
         }
 
         @Override
         public void onServiceDisconnected(ComponentName name) 
         {
             musicService=null;
         
         }
     };    
     
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.player);
 
         imageButtonStop = (ImageButton) findViewById(R.id.imageButtonStop);
         imageButtonNext = (ImageButton) findViewById(R.id.imageButtonNext);
         imageButtonPlay = (ImageButton) findViewById(R.id.imageButtonPlay);
         imageButtonPre = (ImageButton) findViewById(R.id.imageButtonPre);
         imageButtonRepeat = (ImageButton) findViewById(R.id.imageButtonRepeat);
         musicSeekBar = (SeekBar) findViewById(R.id.musicSeekBar);
 
             
         final Intent intent=new Intent(PlayerActivity.this, MusicService.class);
         if(!isBound)
         {
             bindService(intent,conn,Context.BIND_AUTO_CREATE);
             isBound=true;
         }
         
         imageButtonPlay.setOnClickListener(new View.OnClickListener() 
         {
             @Override
             public void onClick(View v) 
             {
                 if (!isPlaying) {
                     try {
                           musicService.play();
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
                     imageButtonPlay.setBackgroundResource(R.drawable.pause_button);
                     isPlaying = true;
 
                 } else {
                     try {
                          musicService.pause();
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
                     imageButtonPlay.setBackgroundResource(R.drawable.play_button);
                     isPlaying = false;
                 }
             }
         });
         
         
         imageButtonStop.setOnClickListener(new View.OnClickListener() 
         {
             @Override
             public void onClick(View v) 
             {
                musicService.stop();
                if(isBound)
                 {
                    unbindService(conn);
                     isBound=false;
                     musicService=null;
                 }
                
                PlayerActivity.this.finish();
             }
         });
         
     }
 }


 

第三步:编写 MusicService.java文件

 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 final MyBinder myBinder=new MyBinder();
     public static MediaPlayer mPlayer;
     
     public class MyBinder extends Binder
     {
         MusicService getService()
         {
             return MusicService.this;
         }
     }
     //这个方法是在MusicService被绑定到其他应用程序上时被调用,
 //这个IBinder对象和应用程序的OnServiceConnecred方法中传入的Ibinder是同个事物,
 //应用程序和MusicService就靠这个IBinder进行通信
     @Override
     public IBinder onBind(Intent intent) 
     {
         mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.wind);
         return myBinder;
     }
 
     @Override
     public void onCreate() 
     {
        //    mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.wind);
     }
     
     @Override
     public boolean onUnbind(Intent intent) 
     {
         return false;
     }
 
     @Override
     public void onDestroy() {
         super.onDestroy();
     }
     
     public void play()
     {
         mPlayer.start();
     }
     
     public void pause()
     {
         mPlayer.pause();
     }
     public void stop()
     {
         mPlayer.stop();
     }
 
 }


 

你可能感兴趣的:(android,exception,service,Class,import,button)