问题背景

在开发 PassportSDK 时遇到的此类问题,测试反馈说当打开 App 进入登录页面,此时如果切换出去到手机设置页面将App 的定位权限设置为「拒绝授予」,在切换回 App 会发生登录信息完全正确也登录不上的情况。

问题分析

经过抓包及打断点查找问题根源,发现是用户在操作应用权限授予时,App 对象及 Activity 经过了销毁重建,此时一些基础的 UI 状态数据可以通过 onSaveInstanceBundle 方法进行保存,在 onCreate 方法中取出保存的状态进行恢复。但是登陆成功的回调 loginListener 由于无法序列化且是随着启动视图的方法设置进来的,所以无法恢复。这造成系统恢复的 Activity 对象持有的回调 loginListener 为空,所以即使用户输入的登陆信息完全正确也无法登陆。

问题解决及带来的思考

今后的开发中,要避免这种无法序列化的回调类实例等与启动视图的方法绑定的 Case,例如,PassportSDK 中启动登录页面的方法如下:

public void login(int loginType, MCLoginListener listener) {

LoginActivity.setLoginListener(listener);

Intent intent = new Intent(Global.getContext(), LoginActivity.class);

intent.putExtra(LOGIN_TYPE, loginType);

Global.getContext().startActivity(intent);

}

可以看到上面的方法中,我们将设置登录回调的步骤放在了启动视图的方法中。这在平时并没有什么问题,我们只需要在某个按钮的点击事件中调用此方法,传入一个回调,即可完成正常的业务逻辑。修改之前的代码逻辑如下:

public class ActivityDemo extend Activity {

MCLoginListener mListener = new MCLoginListener() {

public void onSuccess(){

//TODO

}

public void onError(){

//TODO

}

}

public void onCreate(Bundle savedInstanceBundle) {

Button btn = findViewById(R.id.btn);

btn.setOnClickListener(v -> {

login(Global.CODE_PSD_LOGIN, mListener);

})

}

}

但是假如 App 经过上述的权限更改、屏幕旋转、在后台时间过久等场景,导致 App 对象及 Activity 销毁重建时,由于重建的 Activity 不是通过上述的启动视图的方法展示的,并且在 Activity 中也无法将回调类对象序列化并恢复,所以我们以后一定要记住需要将回调与启动视图的方法分离开来,并在上文对象(上个页面 Activity 对象或 App 对象)的 onCreate 生命周期中重新调用设置回调的方法即可。修改之后的代码如下:

public class ActivityDemo extend Activity {

MCLoginListener mListener = new MCLoginListener() {

public void onSuccess(){

//TODO

}

public void onError(){

//TODO

}

}

public void onCreate(Bundle savedInstanceBundle) {

// 放在这里可以保证系统恢复此上文 Activity 时就为 LoginActivity 添加了回调类实例

LoginActivity.setLoginListener(listener);

Button btn = findViewById(R.id.btn);

btn.setOnClickListener(v -> {

login(Global.CODE_PSD_LOGIN);

})

}

// 只保留纯粹的启动视图方法

public void login(int loginType) {

Intent intent = new Intent(Global.getContext(), LoginActivity.class);

intent.putExtra(LOGIN_TYPE, loginType);

Global.getContext().startActivity(intent);

}

}

退出android app时界面残留影响,【Android】App 或 Activity 销毁重建的状态恢复对回调带来的影响...相关推荐

  1. android预览界面编译出错,Android O预览findViewById编译错误

    我试图测试Android O Developer Preview的第二阶段. 项目创建后,我只是点击了构建并运行但我没有任何成功. Android默认生成的代码如下:Toolbar toolbar = ...

  2. android开发UI界面布局教学,android UI学习 -- 设置界面的布局(包括style的使用,selector的使用,Checkbox自定义样式,菜单项的样式)...

    最终实现效果如下图: 具体来说就是实现了checkbox自定义选中和为选择样式,菜单项根据不同位置设置不同背景. 先上整体布局文件代码: xmlns:tools="http://schema ...

  3. android开机启动界面,26_自定义 Android 启动页面

    示意图 思路 自定义一个布局容器(SplashView),在这个布局容器中添加启动页图片,倒计时控件等逻辑操作,也就是把启动界面的一些相同的操作都封装到该容器中,最后将容器添加到启动界面 Activi ...

  4. Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

    [正文] 一.接口回调的简单引入: 我们先来看一个简单的接口回调的例子: 新建一个Java工程,然后新建一个包.然后新建一个A.java文件: A.java代码如下: 1 package com.cn ...

  5. 模拟Android内存不足 activity回收 值保存 状态恢复

    作者简介 微信公众号(高质量文章推送):陈博易 作者:陈博易 声明:本文是个人原创,未经允许请勿转载 商业合作请在微信公众号回复:联系方式 **## 前言 1.我记得我实习的那会,面试官问我关于aci ...

  6. android 原生分享界面_索尼PlayStation App获得语音聊天功能和新的UI界面

    索尼的PlayStation 5将于11月12日发布,而在此基础上,该公司已经在Android和iOS上对PlayStation App进行了相当大的更新. 该更新带来了新的,经过改进的用户界面(UI ...

  7. android 原生分享界面_原生 Android 用户终于能用上骚扰电话拦截了

    虽然对大部分国产手机用户而言,骚扰电话早已不再是一个令人头痛的问题.但如果你使用的是原生/类原生 Android 系统(例如 Google Pixel),骚扰电话拦截这件事就变得非常棘手了.所以和很多 ...

  8. android日记本功能界面图片,基于android的日记本的设计和开发.ppt

    基于android的日记本的设计和开发 基于android的日记本的设计与开发 指导教师:闫宇帅 答辩人:廉若榕 毕业答辩 2014年5月18日 背景 手机的发展给人们的生活带来了极大的便利.以往,我 ...

  9. android 编译时解析xml布局,android – 在xml布局中引用build.gradle versionName属性

    根据 http://tools.android.com/tech-docs/new-build-system你可以直接从毕业生创造资源,所以放 android { ... defaultConfig ...

最新文章

  1. C#调用淘宝API流程整理
  2. MODEL COMPRESSION VIA DISTILLATION AND QUANTIZATION 论文笔记
  3. 621. Task Scheduler 任务调度器
  4. unity3d点击屏幕选中物体
  5. CodeForces - 748C Santa Claus and Robot
  6. java小游戏程序的编写
  7. Google Chrome(谷歌浏览器)安装方法与使用技巧
  8. python视频格式转换_用Python+FFmpeg进行音视频格式转换
  9. 树莓派 能干啥_大神们都用树莓派做了哪些事
  10. 【毕业设计】深度学习卫星遥感图像检测与识别 -opencv python 目标检测
  11. 小程序项目从Hbuilder转移到vscode步骤
  12. 关于经纬度试算距离和范围
  13. android ui 切图工具,APP切图标注教程:UI设计切图标注的小工具实用技巧
  14. JB的产品之旅-产品经理是干嘛的?
  15. 家具行业APP定制开发需具备哪些功能
  16. BLAM源码解析(四)—— 基于ICP的位姿更新
  17. Linux命令-df命令
  18. JVM基础知识---对象的创建过程
  19. Python学习——异常
  20. C1: 什么是基金? 5大基金类型

热门文章

  1. linux 查询wwid命令,Linux磁盘及分区之wwid和uuid
  2. 数据结构 5-3-2 二叉树前序中序后序遍历非递归实现
  3. python数据结构之字典(dict)——超详细
  4. B - Frogger(最短路之多条最短路径中最大权值的最小值)
  5. poj 3061 Subsequence 尺取法
  6. 夏侯南溪搭建目标检测模型——文件结构设计篇
  7. Youki的笔记本配置要求
  8. 认真把事办砸是一种能力
  9. Github的README中插入图片,Github仓库项目主页显示图片
  10. ViewPager——基础知识和PagerAdapter必须重写的四个方法