上一篇讲到调用Service的第一种方法StartService,非常简单,只要重写OnCreat,OnStartCommand,OnStop三种方法,在MainActivity里Start就行,这里讲的是另一种方法BoundService,这种方法可以实现在MainActivity里调用Service的内部类与方法等,这是StartService做不到的。
新建一个Service文件,第一步要做的是在该Service里新建一个继承自Binder内部类,该类的方法返回这个Service类。创建这个类是为了实例化下面的IBinder对象,IBinder实现Activity与Service的通信,自定义类的自定义方法是返回该Service
public class MyService extends Service{
public MyService() {
}
public class zidingyilei extends Binder{
public MyService zidingyifangfa();{
return MyService.this}
}
然后在重写的Onbind方法中,就可以直接返回一个上面方法新建的对象。注意这里一定要有返回值,如果返回值为null则该服务不会被调用
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new zidingyilei();
}
然后想要完成的操作可以通过定义方法来完成,这里演示的是生成随机数,顺便学习一下
public String shengchengsuijishu(){
String num=String.valueOf(new Random().nextint(99));
}
//调用Random方法,nextint是Random子方法,括号内参数为范围
注意重写OnDestroy方法,不然就会出现Service已经停止却一直占用内存的情况
@Override
public void onDestroy() {
super.onDestroy();
}
到这里Service中的操作已经完成,转到MainActivity
首先是新建一个MyService对象
public MyService myService;
然后创建一个ServiceConnection对象sc,创建该对象时会自动重写两个方法,分别是连接上与断开时的操作。单纯只是想连接上的话,配上下面的Intent已经可以了。但是单纯的连接上是不够的,我们还要调用Service中的方法,所以在连接上时对myService进行了定义。调用自定义类的自定义方法,由上面知道这个自定义方法返回的是Service本身(事实上这里直接myService=new Myservice;
就好,这样写纯粹是为了显得高级一点)
private ServiceConnection sc=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myService=((MyService.zidingyilei)service).zidingyifangfa();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
这里还要一步,当Activity开始时就完成与Service的连接,通过重写OnStart方法实现
@Override
protected void onStart() {
super.onStart();
Intent intent=new Intent(MainActivity.this,MyService.class);
bindService(intent,sc,BIND_AUTO_CREATE);
//最后一个参数是表示没有这个Service时自动生成一个,设为0就是不生成
然后就能愉快调用Service中的方法了,OnCreat方法,单击事件监听器,通过myService对象直接调用Service中的生成随机数方法
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editText.setText(myService.shengchengsuijishu());
}
});
效果