今天测试一个例子:
https://github.com/yuanhuihui/BinderSample
有问题!
Server侧:
IMyService.java:
package com.test.frameworkBinder;
import android.os.IInterface;
import android.os.RemoteException;
public interface IMyService extends IInterface {
static final java.lang.String DESCRIPTOR = "com.test.frameworkBinder.MyServer";
public void sayHello(String str) throws RemoteException;
static final int TRANSACTION_say = android.os.IBinder.FIRST_CALL_TRANSACTION;
}
MyService.java:
package com.test.frameworkBinder;
import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
public class MyService extends Binder implements IMyService {
public MyService() {
this.attachInterface(this, DESCRIPTOR);
}
@Override
public IBinder asBinder() {
return this;
}
// convert MyService to IMyService Interface
public static com.test.frameworkBinder.IMyService asInterface(
android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iInterface = obj.queryLocalInterface(DESCRIPTOR);
if (((iInterface != null) && (iInterface instanceof com.test.frameworkBinder.IMyService))){
return ((com.test.frameworkBinder.IMyService) iInterface);
}
return null;
}
// Server side: receive remote message, and deal with OnTransact()
@Override
protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
switch (code) {
case INTERFACE_TRANSACTION:
reply.writeString(DESCRIPTOR);
return true;
case TRANSACTION_say:
data.enforceInterface(DESCRIPTOR);
String str = data.readString();
sayHello(str);
reply.writeNoException();
return true;
}
return super.onTransact(code, data, reply, flags);
}
// Server side's sayHello()
@Override
public void sayHello(String str) {
System.out.println("MyService:: Hello, " + str);
}
}
ServerDemo.java:
package com.test.frameworkBinder;
import android.os.Looper;
import android.os.ServiceManager;
public class ServerDemo {
public static void main (String[] args) {
System.out.println("MyService start");
Looper.prepareMainLooper();
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
ServiceManager.addService("MyService", new MyService());
Looper.loop();
}
}
Client 侧:
IMyservice.java:
package com.test.frameworkBinder;
import android.os.IInterface;
import android.os.RemoteException;
public interface IMyService extends IInterface {
static final java.lang.String DESCRIPTOR = "com.test.frameworkBinder.MyServer";
public void sayHello(String str) throws RemoteException;
static final int TRANSACTION_say = android.os.IBinder.FIRST_CALL_TRANSACTION;
}
MyServiceProxy.java:
package com.test.frameworkBinder;
import android.os.IBinder;
import android.os.RemoteException;
public class MyServiceProxy implements IMyService {
private android.os.IBinder mRemote;
public MyServiceProxy(android.os.IBinder remote) {
mRemote = remote;
}
public java.lang.String getInterfaceDescriptor() {
return DESCRIPTOR;
}
@Override
public void sayHello(String str) throws RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(str);
mRemote.transact(TRANSACTION_say, _data, _reply, 0);
_reply.readException();
} finally {
_reply.recycle();
_data.recycle();
}
}
@Override
public IBinder asBinder() {
return mRemote;
}
}
ClientDemo.java:
package com.test.frameworkBinder;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
public class ClientDemo {
public static void main(String[] args) throws RemoteException {
System.out.println ("Client start");
IBinder binder = ServiceManager.getService("MyService");
IMyService myService = new MyServiceProxy(binder);
myService.sayHello("Binder");
System.out.println("Client end");
}
}
编译完成后:
adb push ServerDemo /system/bin
adb push ClientDemo /system/bin
adb push ServerDemo.jar /system/framework
adb push ClientDemo.jar /system/framework
运行:
窗口1:
adb shell
root@:/ # /system/bin/ServerDemo
Aborted (core dumped)
窗口2:
C:\>adb shell
root@:/ # /system/bin/ClientDemo
Aborted (core dumped)
看来要调试下。