package com.itheima.banzheng; import com.itheima.banzheng.LeaderService.ZhouMi; import android.os.Bundle; import android.os.IBinder; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { private Intent intent; private MyServiceConn conn; PublicBusiness pb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intent = new Intent(this, LeaderService.class); conn = new MyServiceConn();//服务连接对象,成功后就调用 //绑定领导服务 bindService(intent, conn, BIND_AUTO_CREATE);//执行这个代码后服务就成功的绑定了连接就建立了,连接后会调用LeaderService的onBind方法返回IBinder对象, } public void click(View v){ //调用服务的办证方法 pb.QianXian();//这样就可以调用LeaderService的banZheng方法,否则是不能调用LeaderService的banZheng方法的 } class MyServiceConn implements ServiceConnection{//服务连接对象 //连接服务成功(成功拿到中间人IBinder的ZhouMi对象),此方法调用 @Override public void onServiceConnected(ComponentName name, IBinder service) { //service就是中间人ZhouMi pb = (PublicBusiness) service; } @Override public void onServiceDisconnected(ComponentName name) { } } }
Service:
package com.itheima.banzheng; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class LeaderService extends Service { @Override public IBinder onBind(Intent intent) { // 返回一个IBinder对象,这个对象就是MainActivity和LeaderService之间的中间人对象 return new ZhouMi();//返回给了onServiceConnected的service参数 } class ZhouMi extends Binder implements PublicBusiness{ public void QianXian(){ banZheng(); } public void daMaJiang(){ System.out.println("陪李处打麻将"); } } public void banZheng(){ System.out.println("李处帮你来办证"); } }
接口:
package com.itheima.banzheng; public interface PublicBusiness { void QianXian(); }
清单文件:
<service android:name="com.itheima.banzheng.LeaderService"></service>
音乐播放器:
package com.itheima.musicplayer; import android.os.Bundle; import android.os.IBinder; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { MusicInterface mi; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(this, MusicService.class); //混合调用 //为了把服务所在进程变成服务进程 startService(intent); //为了拿到中间人对象 bindService(intent, new MusicServiceConn(), BIND_AUTO_CREATE); //* 服务的混合调用 //* 先开始、再绑定,先解绑、再停止 } class MusicServiceConn implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { mi = (MusicInterface) service;//返回中间人对象 } @Override public void onServiceDisconnected(ComponentName name) { } } //开始播放按钮 public void play(View v){//Activity的方法 mi.play();//中间人的方法,调用Service的方法 } //暂停播放按钮 public void pause(View v){ mi.pause(); } } //清单文件: <service android:name="com.itheima.musicplayer.MusicService"></service>
package com.itheima.musicplayer; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class MusicService extends Service{ @Override public IBinder onBind(Intent intent) { return new MusicController();//中间人对象 } //必须继承binder,才能作为中间人对象返回给onServiceConnected的service class MusicController extends Binder implements MusicInterface{ public void play(){ MusicService.this.play();//中间人对象调用Service的方法 } public void pause(){ MusicService.this.pause(); } } public void play(){//Service的方法 System.out.println("播放音乐"); } public void pause(){ System.out.println("暂停播放"); } }
package com.itheima.musicplayer; public interface MusicInterface { void play(); void pause(); }
#找领导办证 * 把服务看成一个领导,服务中有一个banZheng方法,如何才能访问? * 绑定服务时,会触发服务的onBind方法,此方法会返回一个Ibinder的对象给MainActivity,通过这个对象访问服务中的方法 * 绑定服务 Intent intent = new Intent(this, BanZhengService.class); bindService(intent, conn, BIND_AUTO_CREATE); * 绑定服务时要求传入一个ServiceConnection实现类的对象 * 定义这个实现类 class MyServiceconn implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { zjr = (PublicBusiness) service; } @Override public void onServiceDisconnected(ComponentName name) { } } * 创建实现类对象 conn = new MyServiceconn(); * 在服务中定义一个类实现Ibinder接口,以在onBind方法中返回 class ZhongJianRen extends Binder implements PublicBusiness{ public void QianXian(){ //访问服务中的banZheng方法 BanZheng(); } public void daMaJiang(){ } } * 把QianXian方法抽取到接口PublicBusiness中定义 --- #两种启动方法混合使用 * 用服务实现音乐播放时,因为音乐播放必须运行在服务进程中,可是音乐服务中的方法,需要被前台Activity所调用,所以需要混合启动音乐服务 * 先start,再bind,销毁时先unbind,在stop