bind / unbind服务示例(android)

时间:2011-12-01 12:49:49

标签: android binding service

你能给我一个简单的后台服务应用程序示例,它使用bind / unbind方法来启动和停止它吗?我正在谷歌搜索半个小时,但这些示例使用startService / stopService方法或对我来说非常困难。谢谢。

3 个答案:

答案 0 :(得分:58)

您可以尝试使用此代码:

protected ServiceConnection mServerConn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder binder) {
        Log.d(LOG_TAG, "onServiceConnected");
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d(LOG_TAG, "onServiceDisconnected");
    }
}

public void start() {
    // mContext is defined upper in code, I think it is not necessary to explain what is it 
    mContext.bindService(intent, mServerConn, Context.BIND_AUTO_CREATE);
    mContext.startService(intent);
}

public void stop() {
    mContext.stopService(new Intent(mContext, ServiceRemote.class));
    mContext.unbindService(mServerConn);
}

答案 1 :(得分:41)

将这些方法添加到您的活动中:

private MyService myServiceBinder;
public ServiceConnection myConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder binder) {
        myServiceBinder = ((MyService.MyBinder) binder).getService();
        Log.d("ServiceConnection","connected");
        showServiceData();
    }

    public void onServiceDisconnected(ComponentName className) {
        Log.d("ServiceConnection","disconnected");
        myService = null;
    }
};

public Handler myHandler = new Handler() {
    public void handleMessage(Message message) {
        Bundle data = message.getData();
    }
};

public void doBindService() {
    Intent intent = null;
    intent = new Intent(this, BTService.class);
    // Create a new Messenger for the communication back
    // From the Service to the Activity
    Messenger messenger = new Messenger(myHandler);
    intent.putExtra("MESSENGER", messenger);

    bindService(intent, myConnection, Context.BIND_AUTO_CREATE);
}

您可以通过ovverriding onResume() onPause()绑定到服务类。

@Override
protected void onResume() {

    Log.d("activity", "onResume");
    if (myService == null) {
        doBindService();
    }
    super.onResume();
}

@Override
protected void onPause() {
    //FIXME put back

    Log.d("activity", "onPause");
    if (myService != null) {
        unbindService(myConnection);
        myService = null;
    }
    super.onPause();
}

注意,绑定到服务时,只在服务类中调用onCreate()方法。 在Service类中,您需要定义myBinder方法:

private final IBinder mBinder = new MyBinder();
private Messenger outMessenger;

@Override
public IBinder onBind(Intent arg0) {
    Bundle extras = arg0.getExtras();
    Log.d("service","onBind");
    // Get messager from the Activity
    if (extras != null) {
        Log.d("service","onBind with extra");
        outMessenger = (Messenger) extras.get("MESSENGER");
    }
    return mBinder;
}

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

定义这些方法后,您可以在“活动”中找到服务的方法:

private void showServiceData() {  
    myServiceBinder.myMethod();
}

最后,您可以在发生某些事件时启动您的服务,例如_BOOT_COMPLETED _

public class MyReciever  extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals("android.intent.action.BOOT_COMPLETED")) {
            Intent service = new Intent(context, myService.class);
            context.startService(service);
        }
    }
}

请注意,启动服务时,会在服务类中调用onCreate()onStartCommand() 当您通过 stopService()发生其他事件时,您可以停止服务 请注意,您的事件监听器应该在Android清单文件中注册:

<receiver android:name="MyReciever" android:enabled="true" android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
</receiver>

答案 2 :(得分:15)

首先,我们需要了解两件事,

客户端

  • 向特定服务器发出请求

bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);

这里mServiceConnServiceConnection类(内置)的实例,它实际上是接口 我们需要实现两个(第一个用于网络连接和第二个网络未连接)方法来监控网络连接状态。

服务器

  • 它处理客户端的请求并制作自己的副本,这个副本只对发送请求的客户端是私有的,服务器的这个raplica在不同的线程上运行。

现在在客户端,如何访问服务器的所有方法?

  • 服务器使用IBinder对象发送响应。因此,IBinder object是我们的处理程序,它使用(。)运算符访问Service的所有方法。

MyService myService;
public ServiceConnection myConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder binder) {
        Log.d("ServiceConnection","connected");
        myService = binder;
    }
    //binder comes from server to communicate with method's of 

    public void onServiceDisconnected(ComponentName className) {
        Log.d("ServiceConnection","disconnected");
        myService = null;
    }
}

现在如何调用服务中的方法

myservice.serviceMethod();

此处myService是对象,serviceMethod是服务中的方法。 通过这种方式,在客户端和服务器之间建立通信。