一步步解析用绑定的方式开启Service(二)

By | 2014/08/09

如同上篇博客中提到的一般我们在类的内部是不会实现一个公共类的。

如果这个内部类是私有的但是我们又有这样的需求,想想在其他类中使用这个内部类中的方法,

我们就可以把这些要用到方法抽象到接口中。然后让这个内部类实现这个接口。因为接口是公共的所以这个内部类中的这些方法就可以被调用了。

同样还是先来写Activity类:

[code lang=”java”]

package com.comcons.activity;

import com.comcons.myinterface.IBinderMethodInterface;
import com.comcons.service.MyService;

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 MyServiceConnection myServiceConnection;

/**
* 因为这个接口的存在
* 我们只把MyBinder中的部分方法暴漏出来了,
* 也就是说只把即在这个接口,又在MyBinder中的方法暴露出来了
*/
private IBinderMethodInterface iMethod ;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

/**
* 初始化MyServiceConnection
* 以便于在绑定和解绑Service时使用
*/
myServiceConnection = new MyServiceConnection() ;
}

/**
* 绑定服务的Button的事件
* @param view
*/
public void bindMyService(View view){
Intent intent = new Intent(MainActivity.this, MyService.class);
bindService(intent, myServiceConnection, BIND_AUTO_CREATE);
}

/**
* 调用服务中的方法的事件
* @param view
*/
public void callMyServiceMethod(View view){
iMethod.callServiceMethod01();
}

private class MyServiceConnection implements ServiceConnection{

/**
* 当绑定成功后会调用这个方法
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
System.out.println("====连接成功====");
//对接收到IBinder对象进行强制类型转换
iMethod = (IBinderMethodInterface)service;
}

/**
* 服务异常终止,也就是在没用调用unbindService(myServiceConnection);
* 方法时。比如内存清理,或者退出Service
* 只service的宿主进程崩溃或者被杀掉也可能是Service本身死掉了(此处感觉没解释清楚)
* 而且我也没发现,如何才能调用这个方法
*/
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
System.out.println("dis connect");
}

}
}

[/code]

然后是Service类:

[code lang=”java”]
package com.comcons.service;

import com.comcons.myinterface.IBinderMethodInterface;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class MyService extends Service {

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("MyService onBind()方法调用—-> 服务成功绑定");
return new MyBinder();
}

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("MyService onCreate()方法调用—->服务被创建");
}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("MyService onDestroy()方法调用—->服务被销毁");
}

@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("MyService onUnbind()方法调用—->服务被解绑");
return super.onUnbind(intent);
}

/**
* 模拟Service中的方法被调用
*/
private void letsCallMe_01(){
System.out.println("成功发送消息到MyService第一个方法");
}
/**
* 模拟Service中的方法被调用
*/
private void letsCallMe_02(){
System.out.println("成功发送消息到MyService第二个方法");
}

/**
* 在这里我们就可以把这个内部类声明成私有的了
* 然后向外仅仅暴漏IBinderMethodInterface接口,就能调用方法了
* @author LiuQiang
*
*/
private class MyBinder extends Binder implements IBinderMethodInterface{

/**
* 现在这个方法是实现的IBinderMethodInterface接口中方法
* 这个是真正暴露出去的方法,通过这个方法可以调用
* 外部类的letsCallMe_01();
*/
@Override
public void callServiceMethod01() {
// TODO Auto-generated method stub
letsCallMe_01();
}

@Override
public void callServiceMethod02() {
// TODO Auto-generated method stub
letsCallMe_02();
}

}
}

[/code]

接下来是一个接口我把它命名为IBinderMethodInterface:

[code lang=”java”]
package com.comcons.myinterface;

public interface IBinderMethodInterface {

public void callServiceMethod01() ;

public void callServiceMethod02() ;
}

[/code]

其实已经没有什么好解释的了,如果前一篇博客的实现方式能够理解的话,这个也很容易就理解了,其实是一样的,只不过,完成了更好的封装
进一步只把该暴漏的暴露不该暴露的设置成了private。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据