退出android app时界面残留影响,【Android】App 或 Activity 销毁重建的状态恢复对回调带来的影响...
问题背景
在开发 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 销毁重建的状态恢复对回调带来的影响...相关推荐
- android预览界面编译出错,Android O预览findViewById编译错误
我试图测试Android O Developer Preview的第二阶段. 项目创建后,我只是点击了构建并运行但我没有任何成功. Android默认生成的代码如下:Toolbar toolbar = ...
- android开发UI界面布局教学,android UI学习 -- 设置界面的布局(包括style的使用,selector的使用,Checkbox自定义样式,菜单项的样式)...
最终实现效果如下图: 具体来说就是实现了checkbox自定义选中和为选择样式,菜单项根据不同位置设置不同背景. 先上整体布局文件代码: xmlns:tools="http://schema ...
- android开机启动界面,26_自定义 Android 启动页面
示意图 思路 自定义一个布局容器(SplashView),在这个布局容器中添加启动页图片,倒计时控件等逻辑操作,也就是把启动界面的一些相同的操作都封装到该容器中,最后将容器添加到启动界面 Activi ...
- Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
[正文] 一.接口回调的简单引入: 我们先来看一个简单的接口回调的例子: 新建一个Java工程,然后新建一个包.然后新建一个A.java文件: A.java代码如下: 1 package com.cn ...
- 模拟Android内存不足 activity回收 值保存 状态恢复
作者简介 微信公众号(高质量文章推送):陈博易 作者:陈博易 声明:本文是个人原创,未经允许请勿转载 商业合作请在微信公众号回复:联系方式 **## 前言 1.我记得我实习的那会,面试官问我关于aci ...
- android 原生分享界面_索尼PlayStation App获得语音聊天功能和新的UI界面
索尼的PlayStation 5将于11月12日发布,而在此基础上,该公司已经在Android和iOS上对PlayStation App进行了相当大的更新. 该更新带来了新的,经过改进的用户界面(UI ...
- android 原生分享界面_原生 Android 用户终于能用上骚扰电话拦截了
虽然对大部分国产手机用户而言,骚扰电话早已不再是一个令人头痛的问题.但如果你使用的是原生/类原生 Android 系统(例如 Google Pixel),骚扰电话拦截这件事就变得非常棘手了.所以和很多 ...
- android日记本功能界面图片,基于android的日记本的设计和开发.ppt
基于android的日记本的设计和开发 基于android的日记本的设计与开发 指导教师:闫宇帅 答辩人:廉若榕 毕业答辩 2014年5月18日 背景 手机的发展给人们的生活带来了极大的便利.以往,我 ...
- android 编译时解析xml布局,android – 在xml布局中引用build.gradle versionName属性
根据 http://tools.android.com/tech-docs/new-build-system你可以直接从毕业生创造资源,所以放 android { ... defaultConfig ...
最新文章
- C#调用淘宝API流程整理
- MODEL COMPRESSION VIA DISTILLATION AND QUANTIZATION 论文笔记
- 621. Task Scheduler 任务调度器
- unity3d点击屏幕选中物体
- CodeForces - 748C Santa Claus and Robot
- java小游戏程序的编写
- Google Chrome(谷歌浏览器)安装方法与使用技巧
- python视频格式转换_用Python+FFmpeg进行音视频格式转换
- 树莓派 能干啥_大神们都用树莓派做了哪些事
- 【毕业设计】深度学习卫星遥感图像检测与识别 -opencv python 目标检测
- 小程序项目从Hbuilder转移到vscode步骤
- 关于经纬度试算距离和范围
- android ui 切图工具,APP切图标注教程:UI设计切图标注的小工具实用技巧
- JB的产品之旅-产品经理是干嘛的?
- 家具行业APP定制开发需具备哪些功能
- BLAM源码解析(四)—— 基于ICP的位姿更新
- Linux命令-df命令
- JVM基础知识---对象的创建过程
- Python学习——异常
- C1: 什么是基金? 5大基金类型