Binder的非正常消亡时的重置方法

一、原理

当Binder非正常消亡的时候,会导致远程调用失败,这样客户端功能就会受到影响。

解决:给Binder设置一个死亡代理,当Binder死亡时,我们就会收到通知,这个时候可以重新发起连接。

二、制作

1、前期准备

客户端:MainActivity.java

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

        createService();
    }
    /*连接Service端,获取mIBookManger*/
    private void createService(){
        ServiceConnection connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                //初始化mIBookManger
                mIBookManager = IBookManager.Stub.asInterface(service);
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        };
        Intent intent = new Intent(this,BookService.class);
        bindService(intent,connection,BIND_AUTO_CREATE);
    }

Service端:BookService.java

2、使用

创建IBinder.DeathRecipient接口,重写其中的binderDied(),当Binder死亡时候,回调该方法。

  private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
        @Override
        public void binderDied() {
            if (mIBookManager != null){
                //解除绑定当前接口
                mIBookManager.asBinder().unlinkToDeath(mDeathRecipient,0);
            }
            mIBookManager = null;

            createService();
        }
    };

当然解除绑定,之前还需要绑定接口

 /*连接Service端,获取mIBookManger*/
    private void createService(){
        ...(连接之前的代码)
        try {
            //绑定接口,等待回调
            mIBookManager.asBinder().linkToDeath(mDeathRecipient,0);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }        
时间: 2024-11-02 08:57:52

Binder的非正常消亡时的重置方法的相关文章

mysql密码设置及重置方法

mysql密码设置及重置方法 作者 :小刘 今天这篇文章,我们来看下mysql数据库的密码设置,当我们不小心忘记了root密码,是一件很糟糕的事情,希望此文章可以帮助大家,我们先从设置密码开始吧!我们刚安装好的mysql数据库,默认root的密码为空,这时我们可以用一下命令设置密码mysqladmin -u root password "密码"如图(为root设置密码为123456)  如果你知道原来的旧密码,我们就可以用下面的命令直接更改就可以了mysqladmin -u root

vs2008重置方法

开始->Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 命令提示 然后依次键入如下命令: 最后键入devenv.exe/ResetSettings 好啦,重新打开vs 就会看到第一次配置vs的界面. added by xiejl. vs2008重置方法,布布扣,bubuko.com

CentOS 7系统root用户忘记密码的重置方法

CentOS 7 的密码重置方法 进入到下面箭头指向的按"e" 跳入到下面的界面把"ro"删了改成"rw init=/sysroot/bin/sh" 按下面的命令进行操作 然后重启系统当下面箭头指向的位置加载到100%就说明密码修改成功了 . 然后用新密码登陆

ActiveDirectory之忘记管理员密码时的重置方法

背景 看见BBS中有人提出这个问题,刚好又遇到王兄在出这题考验,特测试了一下AD的管理员密码忘记了重置的方法,建议大家还是好好的保存管理员密码,不要用上此方法 欢迎吐槽 操作 1. 放入windows server 的光碟(此处为windows server 2012R2),选项光驱启动 2. 进入到第一个界面后,按shift+F10打开命令提示符 3. 查询windows系统安装的盘符 4. 将sethc.exe移动到其他位置,并且将cmd.exe复制到windows\system32下,重命

Mysql(Linux服务器)root用户密码忘记重置方法

MySQL是非常常见的开源数据库,使用者众多,若是不小心忘记了安装在服务器的mysql密码,无法登陆,应该如何重置呢?方法很简单,现在和大家分享下.(系统环境:CentOs 6.5  软件:Mysql) 1.首先确认服务器是处于安全的状态,也就是没有人能够任意地连接MySQL数据库.因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的状态下. 2.修改MySQL的登录设置: # vi /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-

事前准备!忘记Win10系统开机密码的重置方法

我们在使用电脑时一般都会设置一个帐户密码来保护我们的个人隐私,但有时我们会突然忘记这个密码,那么这时我们该怎么去解决这个问题呢?其实我们可以提前进行准备,在忘记密码时进行密码的重置.Win10系统重置密码有两种方式,一种是利用U盘创建一个密码重置盘,另一种就是设置安全问题来重置开机锁屏密码.下面我们就来介绍一下Win10系统中怎么设置安全问题来在忘记密码时重置密码.Win10系统开机锁屏密码忘记时重置密码的方法1.打开控制面板,点击选择"帐户"选项,在打开界面的左侧栏中点击选择&quo

MySQL5.7初始化后5种密码重置方法

前言:由于好几次安装MySQL5.7后一直被重置密码所困扰,因此特意整理重置的方法 安装MySQL5.7 [[email protected] db]# ll 以下的rpm安装包可以随处下载 total 402356 -rw-r--r-- 1 root root 24744 Nov 25 2015 libaio-0.3.109-13.el7.x86_64.rpm -rw-r--r-- 1 7155 31415 25106088 Mar 5 10:24 mysql-community-client

linux系统root用户忘记密码的重置方法

如何重置CentOS 7的root密码 重置Centos 7 Root密码的方式和Centos 6完全不同.让我来展示一下到底如何操作. 1.在启动grub菜单,选择编辑选项启动: 2.按键盘e键,来进入编辑界面: 3.找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4.现在按下 Control+x ,使用单用户模式启动: 5.现在,可以使用下面的命令访问系统: chroot   /sysroot 6.重置密码:(根据提示输入) passwd  root

MAC MYSQ忘记密码重置方法

网友的方法,记个笔记请勿转载. step1: 关闭mysql服务:  苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服务(点击stop mysql server) step2: 进入终端输入:cd /usr/local/mysql/bin/    回车后 登录管理员权限 sudo su    回车后输入以下命令来禁止mysql验证功能 ./mysqld_safe --skip-grant-tables &    回车后mysql会自动重启(偏好设置中mysql