我有一个问题与@mnish大约一年前提出的这个 question有关. 请看看他的问题和代码.他实现了一个ServiceConnection()并将其传递给bindService().这遵循顶部附近的Service文档中的本地服务示例. 我想
请看看他的问题和代码.他实现了一个ServiceConnection()并将其传递给bindService().这遵循顶部附近的Service文档中的本地服务示例.
我想实现本地服务示例,所以我试图从@mnish问题/答案中添加一些细节.在ServiceConnection()中@mnish有这条线让我感到困惑:
mService = ILocService.Stub.asInterface(iservice);
我理解@mnish编写了这段代码,但有没有人知道ILocService是什么,并且知道如何创建自己的ILocService?这个结构记录在哪里,我需要它吗? IBinder的价值来自何处?
他可能正在使用Android界面定义语言(AIDL)http://developer.android.com/guide/components/aidl.html
因此,他必须使用服务器端实现的存根,如记录:
// This is called when the connection with the service has been // established, giving us the service object we can use to // interact with the service. We are communicating with our // service through an IDL interface, so get a client-side // representation of that from the raw service object. mService = IRemoteService.Stub.asInterface(service);
iservice引用来自onServiceConnected方法,该方法在将服务绑定到您的活动之后调用.调用bindService传递ServiceConnection,它实现onServiceConnected方法.
当您的服务实现是本地的时,您不需要“IRemoteService.Stub.asInterface(service)”,那么您可以将服务转发给您本地服务.
本地服务示例在服务中执行此操作:
public class LocalService extends Service { private NotificationManager mNM; // Unique Identification Number for the Notification. // We use it on Notification start, and to cancel it. private int NOTIFICATION = R.string.local_service_started; /** * Class for clients to access. Because we know this service always * runs in the same process as its clients, we don't need to deal with * IPC. */ public class LocalBinder extends Binder { LocalService getService() { return LocalService.this; } } ... }
这在ServiceConnection类的Activity中:
private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { // This is called when the connection with the service has been // established, giving us the service object we can use to // interact with the service. Because we have bound to a explicit // service that we know is running in our own process, we can // cast its IBinder to a concrete class and directly access it. mBoundService = ((LocalService.LocalBinder)service).getService(); // Tell the user about this for our demo. Toast.makeText(Binding.this, R.string.local_service_connected, Toast.LENGTH_SHORT).show(); } public void onServiceDisconnected(ComponentName className) { // This is called when the connection with the service has been // unexpectedly disconnected -- that is, its process crashed. // Because it is running in our same process, we should never // see this happen. mBoundService = null; Toast.makeText(Binding.this, R.string.local_service_disconnected, Toast.LENGTH_SHORT).show(); } };