Android onWindowFocusChanged() 配合 WeakReference 弱引用解决页面间跳转不连贯问题

简介:       小菜最近在处理适配方面的问题,今天发现在一些低版本且性能不佳的手机上,冷启动过程中,从 SplashActivity 到 MainActivity 过程中,主页面还没有加载完,启动页先销毁回到手机主页面,过1-2s才进入 MainActivity,中间的间隔时间比较长,用户体验较差。

      小菜最近在处理适配方面的问题,今天发现在一些低版本且性能不佳的手机上,冷启动过程中,从 SplashActivity 到 MainActivity 过程中,主页面还没有加载完,启动页先销毁回到手机主页面,过1-2s才进入 MainActivity,中间的间隔时间比较长,用户体验较差。
      小菜调试了很久,通过【弱引用 + onWindowFocusChanged】的方式来解决目前的问题,也许不是最好的处理方式,但小菜觉得是相对简单的方式,因此记录一下。

问题原因

      小菜的 MainActivity 中需要处理很多业务逻辑以及配置项处理等,在 UI 页面展示前会相对较慢,因此导致前一个 SplashActivity 页面已经销毁但是后一个主 MainActivity 还没有加载出来,导致一个较长的时间间隔。

技术方向

WeakReference 弱引用

      弱引用,即在引用对象的同时仍然允许通过垃圾回收来回收该对象。Android 中常用来在非 UI 线程处理图片和 Handler 与 Activity 的交互等。

onWindowFocusChanged() 周期函数

      判断窗口变化,在当前 Activity 的窗口获取焦点或失去焦点时进行回调。

解决方式

  1. 在第一个页面中添加弱引用,并且在页面跳转过程中不直接 finish 掉本页面;
public class SplashActivity extends AppCompatActivity {

    private Button mButton;
    private static WeakReference<AppCompatActivity> mWeakReference;

    public static void finishActivity() {
        if (mWeakReference != null && mWeakReference.get() != null) {
            mWeakReference.get().finish();
        }
    }

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

        mWeakReference = new WeakReference<>((AppCompatActivity) this);

        mButton = (Button) this.findViewById(R.id.test_btn);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(SplashActivity.this, TestActivity.class));
            }
        });

    }

}
  1. 在第二个页面中,添加 onWindowFocusChanged() 回调判断,若是第一次进入本页面时,将上一个页面手动 finish 掉,以衔接两个页面,取消时间间隔;
public class TestActivity extends AppCompatActivity {

    private static final String TAG = "TestActivity";
    private boolean isFirstInWindowFocusChanged = true;

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

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        Loger.e("==onWindowFocusChanged==",TAG + hasFocus);
        if(hasFocus) {
            if(isFirstInWindowFocusChanged){
                isFirstInWindowFocusChanged = false;
                SplashActivity.finishActivity();
            }
        }
    }
}

      至此,页面跳转过程中出现短时间时间间隔问题已解决,测试正常。

扩展测试

为什么要在 onWindowFocusChanged() 方法中添加是否是首次进入本页面的状态判断?

这个主要是由 Activity 的生命周期决定的,该方法主要是监测窗口是否获取或失去焦点,测试如下:

  1. 首次进入该页面,生命周期执行顺序:onCreate() -> onStart() -> onResume() -> onWindowFocusChanged()
初始化过程.png
  1. 点击 home 键,退到后台执行顺序:onPause() ->onWindowFocusChanged() -> onStop()
退居后台过程.png
  1. 从后台返回当前页面,生命周期执行顺序:onRestart() -> onStart() -> onResume() -> onWindowFocusChanged()
后台返回过程.png
  1. 退出该页面,生命周期执行顺序:onPause() ->onWindowFocusChanged() -> onStop() -> onDestroy()
销毁过程2.png

      以下是小菜公众号,欢迎闲来吐槽~


公众号
目录
相关文章
|
8月前
|
Android开发
Android实现页面渐变效果
Android实现页面渐变效果
58 1
|
8月前
|
Linux 调度 Android开发
【系统启动】Kernel怎么跳转到Android:linux与安卓的交界
【系统启动】Kernel怎么跳转到Android:linux与安卓的交界
129 0
|
3天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
7月前
|
Android开发 容器
35. 【Android教程】视频页面:ViewPager
35. 【Android教程】视频页面:ViewPager
68 3
|
3月前
|
程序员 开发工具 Android开发
Android|WebView 禁止长按,限制非白名单域名的跳转层级
如何限制 WebView 仅域名白名单网址能随意跳转,并禁用长按选择文字。
53 2
|
4月前
|
Android开发 UED Kotlin
Android中如何跳转到Wi-Fi开关设置页
本文介绍如何在Android应用开发中使用隐式Intent引导用户至特定系统设置页面,如Wi-Fi设置页,并提供Kotlin代码示例。通过设置Intent的Action属性并检查设备兼容性,可轻松实现跳转功能,提升用户体验。此外,还列举了其他常用设置页面的Intent Action及注意事项。
116 15
|
8月前
|
Android开发
Android WindowFeature小探究,Android客户端Web页面通用性能优化实践
Android WindowFeature小探究,Android客户端Web页面通用性能优化实践
|
5月前
|
存储 安全 物联网
Android经典实战之跳转到系统设置页面或其他系统应用页面大全
本文首发于公众号“AntDream”,关注获取更多技巧。文章总结了Android开发中跳转至系统设置页面的方法,包括设备信息、Wi-Fi、显示与声音设置等,并涉及应用详情与电池优化页面。通过简单的Intent动作即可实现,需注意权限与版本兼容性。每日进步,尽在“AntDream”。
611 2
|
5月前
|
Android开发 iOS开发
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
64 0
|
5月前
|
监控 安全 API
Android项目架构设计问题之保证线上用户不会进入到本地配置页面如何解决
Android项目架构设计问题之保证线上用户不会进入到本地配置页面如何解决
38 0

热门文章

最新文章