2021-02-24

标题Android-绑定服务调用服务的方法

Service按照其启动的方式,可分为两种:
1、StartedStarted的Service,通过在Application里用startService(Intent intent)方法来启动。这种类型的Service一经启动,会在后面无休止地运行,即使启动它的Activity被Destroy掉。要停止此类型的Service,可在Service中调用stopSelf()或在Application中调用stopService(Intent intent),要不然就只能等Android系统在系统资源紧张的时候把它杀掉。
2、BoundBound的Service,通过在Application里调用bindService()方法来启动。该类型的Service与Application绑定在一起,一旦绑定的所有Application消失了,Android会Detroy掉该Service。也可以主动调用unbindService()方法来解绑Service。有时候我们想在Activity中获知Service的状态,例如一个音乐播放器,Service负责音乐播放,Activity负责显示当前歌曲名和播放进度。可以用Broadcast,这个也不失为一个解决方法。但如果可以获取Service实例,那么就可以调用Service中自定义的一些方法来获取Service状态了。首先要明确的是,第一种类型的Service是无能为力的。因为Activity与Service之间并没有相关联的接口,即使这个Service是在Activity里start的,一旦start,两者不再有关联。一、本地Service调用。如果Activity与Service在同一应用程序中,两者间的交互就属于本地Service调用。可通过bindService实现,具体操作如下:
1、自定义子类MyService,继承Service类
2、在MyService类中,自定义内部类MyBinder,继承Binder类在内部类中,根据需要交互的数据,创建一些方法,以便Activity可通过这些方法得到Service中的一些数据。或者干脆通过一个方法返回Service实例。

public class MyBinder extends Binder  
{  public MyService getServiceInstance()  {  return MyService.this;  }  }  

3、在Service类中,new一个MyBinder私有成员,并在onBind()方法中return一个MyBinder实例。
之所以这样做,是因为Service一旦绑定,就会回调onBind()方法,并返回一个Binder对象给Activity。具体看下一个步骤。
4、在Activity中覆写ServiceConnection接口中的onServiceConnected(ComponentName name, IBinder service)方法,其中的service参数就是MyService类中onBind()方法返回的MyBinder对象,调用MyBinder对象的自定义方法getServiceInstance()可得到Service实例。下面是一个DEMO:

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) {			// TODO Auto-generated method stub			mi = (MusicInterface) service;		} 		@Override		public void onServiceDisconnected(ComponentName name) {			// TODO Auto-generated method stub					}    	    }     //开始播放按钮    public void play(View v){    	mi.play();    }    //暂停播放按钮    public void pause(View v){    	mi.pause();    }}
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) {		// TODO Auto-generated method stub		return new MusicController();	}	
//必须继承binder,才能作为中间人对象返回
class MusicController extends Binder implements MusicInterface{		public void play(){			MusicService.this.play();		}		public void pause(){			MusicService.this.pause();		}	}		public void play(){		System.out.println("播放音乐");	}		public void pause(){		System.out.println("暂停播放");	} 	}
public interface MusicInterface {
 	void play();	void pause();}

(二)客户端步骤:
1、创建AIDL文件客户端也要创建AIDL文件,而且是跟服务端完全一样的AIDL文件。复制服务端AIDL文件即可。应当注意的是:AIDL文件的包名一定要跟服务端的一致。如果客户端没有该包,应创建一个包,并将AIDL文件放到包下。
2、跨进程调用Service客户端跨进程调用Service的方法与本地调用Service的方法差不多,也是通过bindService()。应当注意的是,调用成功后,通过ServiceConnection接口中的onServiceConnected(ComponentName name, IBinder service)方法得到服务端onBind()方法传递过来的Binder对象。将该对象类型转化为AIDL文件中声明的接口类型,即可调用该接口中定义的方法。示例代码如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值