做响应式网站的意义,网站首页标题怎么写,公司部门架构,仿做静态网站多少钱问题描述
做一款音乐播放应用#xff0c;播放服务是通过AIDL形式对外暴露#xff0c;允许跨进程调用且多个App同时操作音乐播放#xff0c;偶现android.os.DeadObjectException问题
12-15 09:28:12.371: W/System.err(5412): android.os.DeadObjectException
12-15 09:28:…问题描述
做一款音乐播放应用播放服务是通过AIDL形式对外暴露允许跨进程调用且多个App同时操作音乐播放偶现android.os.DeadObjectException问题
12-15 09:28:12.371: W/System.err(5412): android.os.DeadObjectException
12-15 09:28:12.372: W/System.err(5412): at android.os.BinderProxy.transactNative(Native Method)
12-15 09:28:12.372: W/System.err(5412): at android.os.BinderProxy.transact(Binder.java:496)问题分析
在使用aidl进行进程间通信时有时候在客户端调用服务端的接口会抛出DeadObjectException异常原因一般是由于某种原因服务端程序崩溃重启或者服务对象由于内存紧张被回收导致的
问题解决
方案1
针对应用开发可以在服务端进程启动的时候发个消息给客户端客户端收到消息的时候重新进行绑定操作目的是为了同步客户端和服务端的连接客户端进程启动的时候也要绑定一次注在已经连接的情况下服务端由于某种原因进程重启了如果客户端没有收到回调客户端保存的连接不为空这时调用服务端接口就会抛出DeadObjectException异常
方案2
调用的对象不存在因为它所在App进程不存在或进程崩溃此时在底层回调时报错。
那么在调用对象之前建议检查是否存在此进程。DeadObjectException异常出现是因为App进程不存在或进程崩溃因此在底层回调时报错。进程不存在或者进程崩溃需要查看其他日志来定位。对于进程崩溃的情况也有可能部分原因是由于操作系统考虑到内存、CPU、优先级等指标选择杀死一个进程得到资源。 ActivityManager activityManager (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
ListActivityManager.RunningAppProcessInfo pidsTask activityManager.getRunningAppProcesses();for(int i 0; i pidsTask.size(); i) {nameList.add(pidsTask.get(i).processName);idList.add(pidsTask.get(i).uid);}If(nameList.contains(“processName”)){// 进程存在}else{// 进程不存在}
方案2
进行死亡监听 1在调用服务端接口的时候先进行判断bind是否还活着
if (mIMyAidlInterface ! null mIMyAidlInterface.asBinder().isBinderAlive()) {try {mIMyAidlInterface.startRecord();} catch (Exception e) {Log.e(TAG, Exception);e.printStackTrace();}
}2注册死亡代理
private IBinder.DeathRecipient mDeathRecipient new IBinder.DeathRecipient() {Overridepublic void binderDied() { // 当绑定的service异常断开连接后自动执行此方法Log.e(TAG,binderDied );if (mIMyAidlInterface ! null){// 当前绑定由于异常断开时将当前死亡代理进行解绑 mIMyAidlInterface.asBinder().unlinkToDeath(mDeathRecipient, 0);// 重新绑定服务端的servicebindService(new Intent(com.service.bind),mMyServiceConnection,BIND_AUTO_CREATE); }}
};3在service绑定成功后调用linkToDeath注册进service当service发生异常断开连接后会自动调用binderDied()
public void onServiceConnected(ComponentName name, IBinder service) { //绑定成功回调Log.d(TAG, onServiceConnected);mIMyAidlInterface IMyAidlInterface.Stub.asInterface(service); //获取服务端提供的接口try {// 注册死亡代理if(mIMyAidlInterface ! null){Log.d(TAG, mIMyAidlInterface.getName());service.linkToDeath(mDeathRecipient, 0); } } catch (RemoteException e) {e.printStackTrace();}
}