在framework里面用aidl传递 客户端回调接口到service,service得到的回调接口总是null。

sy00800 2017-04-05 04:41:21
回调接口为IPm25Listener.aidl
interface IPm25Listener
{
void OnPm25Chanaged(in Pm25Data data);
}
客户端和服务端的aidl为IPm25Manager.aidl,
interface IPm25Manager
{
void startRequest(in Pm25Request request, in IPm25Listener listener);
void stopRequest(in IPm25Listener listener);
void reportPm25Data(in Pm25Data data);
}
以上两者都在framework/base/Android.mk中添加

客户端如下
public class Pm25Manager {
private final String TAG = "Pm25Manager";
private final Context mContext;
private final IPm25Manager mService;
private Pm25Request mPm25Request;
private Pm25TransportListener mTransportListener;

public Pm25Manager(Context context, IPm25Manager service) {
mService = service;
mContext = context;
mPm25Request = null;
mTransportListener = null;

}
public void startRequest(int type, int interval, String provider, Pm25ListenerInterface listener) {

Log.v(TAG, "startRequest , type = " + type);
String packageName = mContext.getPackageName();
Pm25Request request = new Pm25Request(type, interval, provider, packageName);
mTransportListener = new Pm25TransportListener(listener);
if (mTransportListener == null) {
Log.v(TAG, "startRequest transportListener == null");
return ;
}
try {
mService.startRequest(request, mTransportListener);
} catch (RemoteException e) {
e.printStackTrace();
}
}

public void stopRequest(Pm25ListenerInterface listener) {

try {
mService.stopRequest(mTransportListener);
} catch (RemoteException e) {
e.printStackTrace();
}
}

public class Pm25TransportListener extends IPm25Listener.Stub {
private Pm25ListenerInterface mListener;
Pm25TransportListener(Pm25ListenerInterface listener) {
mListener = listener;
}

public void OnPm25Chanaged(Pm25Data data) {
Log.v(TAG, "OnPm25Chanaged");
mListener.OnPm25Chanaged(data);
}
}
}
Pm25ListenerInterface为提供给app使用的回调接口,Pm25TransportListener为发送给服务端的回调接口。

服务端如下,已在framework中注册。
class Pm25ManagerService extends IPm25Manager.Stub {

private static final String TAG = "Pm25Service";
private ParticulateMatterProviderInterface mProvider;
private ParticulateMatterRequest mRequest;
private final Context mContext;
private int mClientCount;
private IPm25Listener mListener;

public Pm25ManagerService(Context context) {
mContext = context;
}
public void systemRunning() {
Log.v(TAG, "systemRunning");
mProvider = new DSLParticulateMatterProvider(this);
mRequest = new ParticulateMatterRequest(1);
mProvider.init();
mProvider.enable();
}

public void startRequest(Pm25Request request, IPm25Listener listener) {
mRequest.mType = request.getType();
Log.v(TAG, "request type = " + mRequest.mType);
mListener = listener;
if (mListener == null) {
Log.v(TAG, "startRequest listen == null");
return;
}
mProvider.setRequest(mRequest);

}

public void stopRequest(IPm25Listener listener) {

}

public void reportPm25Data(Pm25Data data) {
Log.v(TAG, "value = " + data.getValue()+ " type = " + data.getType() + " provider = " + data.getProvider());

try {
mListener.OnPm25Chanaged( data);
} catch (RemoteException e) {
e.printStackTrace();
}

}
}

测试app如下:
public class MainActivity extends Activity {

private Button mButtonStartRequest;
private Button mButtonStopRequest;
private Pm25Manager mPm25Manager;
private Pm25ListenerInterface mPm25Listener;
private final String TAG = "SVEN MainActivity";

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

mButtonStartRequest = (Button)findViewById(R.id.start_request);
mButtonStopRequest = (Button) findViewById(R.id.stop_request);
mPm25Manager = (Pm25Manager)getSystemService(Context.PM25_SERVICE);
mPm25Listener = new Pm25ListenerInterface() {
@Override
public void OnPm25Chanaged(Pm25Data data){
Log.v(TAG, "pm25data is " + data.getValue());
}
};
Log.v(TAG, "after Pm25ListenerInterface");
mButtonStartRequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPm25Manager.startRequest(1, 10, "dsl", mPm25Listener);
}
});
}
}

当点击start_request按钮后,打印如下log,可以看到走到Pm25Manager中mTransportListener不是空,但当到Pm25Service中传递过来的IPm25Listener就是null了,而且另一个数据Pm25Data service可以正确收到。哪位大神帮看下是什么原因?
01-03 04:07:45.204 V/SVEN MainActivity( 4813): after Pm25ListenerInterface
01-03 04:07:46.521 V/Pm25Manager( 4813): startRequest , type = 1
01-03 04:07:46.525 W/Parcel ( 1096): Attempt to read object from Parcel 0x9fcda7dc at offset 88 that is not in the object list
01-03 04:07:46.526 V/Pm25Service( 1096): startRequest listen == null
...全文
398 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
哎哟---喂 2017-10-12
  • 打赏
  • 举报
回复
我也碰到了类似问题,请问你是怎么解决的啊?
sy00800 2017-04-06
  • 打赏
  • 举报
回复
低级错误。。
sy00800 2017-04-05
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧