Android多进程系列

  • Android 多进程通信之几个基本问题
  • Android多进程之Binder的使用
  • Android多进程之手动编写Binder类
  • Android多进程之Binder解绑监听的问题
  • Android 多进程之Messenger的使用
通过前几篇文章,我们对Binder的使用和工作流程有了一定的了解,但是还有几个问题休要我们去解决。一个是如果服务端进程意外退出,Binder死亡,那客户端就会请求失败;还有一个就是权限校验问题,就是服务端需要校验一下客户端的身份权限,不能谁都能请求服务端的服务

Binder意外死亡的处理

给Binder设置DeathRecipient监听
  • 在绑定Service服务后的onServiceConnected回调中给Binder注册死亡回调DeathRecipient
private ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {Log.e(TAG, "ServiceConnection-->"+ System.currentTimeMillis());IBookManager bookManager = BookManagerImpl.asInterface(iBinder);mRemoteBookManager = bookManager;try {//注册死亡回调iBinder.linkToDeath(mDeathRecipient,0);...} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName componentName) {Log.e(TAG, "onServiceDisconnected-->binder died");}
};
复制代码
  • 在DeathRecipient中相应的处理,比如重新连接服务端
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {@Overridepublic void binderDied() {Log.e(TAG, "mDeathRecipient-->binderDied-->");if (mRemoteBookManager == null) {return;}mRemoteBookManager.asBinder().unlinkToDeath(mDeathRecipient, 0);mRemoteBookManager = null;//Binder死亡,重新绑定服务Log.e(TAG, "mDeathRecipient-->bindService");Intent intent = new Intent(MainActivity.this, BookManagerService.class);bindService(intent, mConnection, Context.BIND_AUTO_CREATE);}
};
复制代码
  • 为了测试,我们在服务端添加结束进程的代码
@Override
public void onCreate() {super.onCreate();Log.e(TAG, "onCreate-->"+ System.currentTimeMillis());new Thread(new ServiceWorker()).start();
}private class ServiceWorker implements Runnable {@Overridepublic void run() {while (!mIsServiceDestoryed.get()) {try {Thread.sleep(5000);}catch (InterruptedException e) {e.printStackTrace();}int bookId = mBookList.size() + 1;if (bookId == 8) {//结束当前进程,测试Binder死亡回调android.os.Process.killProcess(android.os.Process.myPid());return;}...}}
}
复制代码
  • 测试效果
从上面的测试我们可以看到客户端在服务端进程意外退出后,通过重新绑定服务又把服务端进程启动了。此外,我们还可以在ServiceConnection的onServiceDisconnected方法中处理服务端进程意外退出的情况,方法是一样的,就不测试了。2种方法的区别就在于onServiceDisconnected方法在客户端的UI线程中被回调,而binderDied方法在客户端的Binder线程池中被回调

权限验证

在onBind中通过自定义权限来验证
  • 首先要自定义一个权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.xxq2dream.android_ipc"><permissionandroid:name="com.xxq2dream.permission.ACCESS_BOOK_SERVICE"android:protectionLevel="normal"/></manifest>
复制代码
  • 然后在Service中的onBind方法中校验
@Nullable
@Override
public IBinder onBind(Intent intent) {Log.e(TAG, "onBind-->"+ System.currentTimeMillis());int check = checkCallingOrSelfPermission("com.xxq2dream.permission.ACCESS_BOOK_SERVICE");if (check == PackageManager.PERMISSION_DENIED) {Log.e(TAG, "PERMISSION_DENIED");return null;}Log.e(TAG, "PERMISSION_GRANTED");return mBinder;
}
复制代码
  • 从上图中我们可以看到,由于我们的应用客户端没有声明服务端校验的权限,所以服务端校验不通过,我们只需要在我们的客户端添加相应的权限声明即可
<uses-permission android:name="com.xxq2dream.permission.ACCESS_BOOK_SERVICE"/>复制代码
在onTransact方法中进行权限校验
private Binder mBinder = new BookManagerImpl(){@Overridepublic List<Book> getBookList() throws RemoteException {Log.e(TAG, "getBookList-->"+ System.currentTimeMillis());return mBookList;}...@Overridepublic boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {int check = checkCallingOrSelfPermission("com.xxq2dream.permission.ACCESS_BOOK_SERVICE");if (check == PackageManager.PERMISSION_DENIED) {Log.e(TAG, "PERMISSION_DENIED");return false;}String packageName = null;//获取客户端包名 String[] packages = getPackageManager().getPackagesForUid(getCallingUid());if (packages != null && packages.length > 0) {packageName = packages[0];}//校验包名if (!packageName.startsWith("com.xxq2dream")) {return false;}Log.e(TAG, "PERMISSION_GRANTED");return super.onTransact(code, data, reply,flags);}
};
复制代码
结语
  • Binder的一个很好的应用就是推送消息和保活。比如我们可以创建一个Service运行在一个独立的进程中,然后和我们的应用进程中的一个Service绑定。独立进程的Service每隔一定的时间向我们的服务端请求查看是否有新的消息,有的话就拉取新的消息,然后通知给应用进程的Service,执行弹出通知之类的操作。应用程序退出后,我们的Service进程还是存活的,这样就可以一直接收消息。当然,如果用户一键清理或是直接结束应用的话,我们的Service进程仍然会被干掉。

                                欢迎关注我的微信公众号,期待与你一起学习,一起交流,一起成长!
复制代码

Android多进程之Binder的意外死亡及权限校验相关推荐

  1. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学 ...

  2. Android应用程序启动Binder线程源码分析

    Android的应用程序包括Java应用及本地应用,Java应用运行在davik虚拟机中,由zygote进程来创建启动,而本地服务应用在Android系统启动时,通过配置init.rc文件来由Init ...

  3. Android uevent进程源码分析

    在Android Init进程源码分析中讲到init进程会依次执行被加入到待执行队列action_queue中的Action,在init.rc中我们有这么一段配置: 11 on early-init1 ...

  4. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

  5. 写给 Android 应用工程师的 Binder 原理剖析

    2019独角兽企业重金招聘Python工程师标准>>> 一. 前言 这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔.生怕自己理解上还有偏差,对大家造成误解,贻笑大 ...

  6. Android多线程之IntentService源码解析

    想要了解 IntentService 的工作原理需要先对 Android 系统中以 Handler.Looper.MessageQueue 组成的异步消息处理机制以及 HandlerThread 有所 ...

  7. Android系统中的Binder通信机制分析(7)- Java 层的 Binder 机制

    声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得2019年6.7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾- 文中参考 ...

  8. 8.node多进程之spawn

    8.node多进程之spawn 1.spawn用法 spawn返回的是子进程,不具备回调功能,但是子进程可以处理结果 spawn是逐步输出结果的,如果某行出错了,那么该行错误被监听到,然后会继续往下执 ...

  9. Android 网络编程之HTTPS详解

    前言:HTTPS涉及相关的知识,总是很难的将其归纳总结起来,本文旨在带你学习详细的HTTPS相关知识点,看完本文后,你会了解到以下相关知识点: HTTPS的工作原理 HTTPS为什么要这样设计 密码学 ...

  10. Android 多线程之IntentService 完全详解

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52426425 出自[zejian的博客] 关联文章: Android ...

最新文章

  1. 分布式WebSocket架构
  2. HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)
  3. 射频系统基础知识总结
  4. Clion 2020.2 使用 C++20 等C++标准 编程
  5. 中石油训练赛 - 腿部挂件(可持久化字典树)
  6. gdalwarp:变形工具
  7. 解决2010版办公软件打不开从系统中导出的Excel表格
  8. db_cxx.h: No such file or directory
  9. Excel填充日期和星期
  10. ssh远程连接Ubuntu 20.04
  11. Java爬取英雄联盟官网,全英雄皮肤背景图片
  12. JavaWeb——HTTP协议TomcatServlet学习笔记
  13. Spring5学习笔记------4、JdbcTemplate
  14. windows光标移动快捷键操作
  15. 采集页面之后css布局混乱之rem适配布局
  16. Java web系统打包成exe安装文件
  17. linux系统下解压缩
  18. 异常音检测(持续更新)
  19. 此前小编为大家介绍了女人吃鸡蛋的好处,想必大家对鸡蛋这种蛋类有了更多的了解。今天小编为大家介绍另一种蛋类——鸭蛋。鸭蛋又名鸭卵,是人们经常食用的一种蛋类食品,与鸡蛋营养相当,吃它的好处众多。那么女人吃
  20. 安装企业宽带的一些问题

热门文章

  1. 始终都要覆盖toString()方法
  2. Enumeration与Iterator接口
  3. jquery on()绑定的点击事件在js动态新添加的元素上无效
  4. 希望能够在这条路上走下去
  5. Transfrom在64bit服务下面无法运行
  6. hdu 5003 模拟水题 (2014鞍山网赛G题)
  7. C#远程连接Oracle数据库(不安装客户端)
  8. 百度编辑器ueditor字体添加
  9. 提升企业网站流量转化率的核心是什么
  10. pojCashier Employment