和尚最近在处理适配方面的问题,今天发现在一些低版本且性能不佳的手机上,冷启动过程中,从 SplashActivity 到 MainActivity 过程中,主页面还没有加载完,启动页先销毁回到手机主页面,过1-2s才进入 MainActivity,中间的间隔时间比较长,用户体验较差。 和尚调试了很久,通过【弱引用 + onWindowFocusChanged】的方式来解决目前的问题,也许不是最好的处理方式,但和尚觉得是相对简单的方式,因此记录一下。
和尚的 MainActivity 中需要处理很多业务逻辑以及配置项处理等,在 UI 页面展示前会相对较慢,因此导致前一个 SplashActivity 页面已经销毁但是后一个主 MainActivity 还没有加载出来,导致一个较长的时间间隔。
弱引用,即在引用对象的同时仍然允许通过垃圾回收来回收该对象。Android 中常用来在非 UI 线程处理图片和 Handler 与 Activity 的交互等。
判断窗口变化,在当前 Activity 的窗口获取焦点或失去焦点时进行回调。
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));
}
});
}
}
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();
}
}
}
}
至此,页面跳转过程中出现短时间时间间隔问题已解决,测试正常。
这个主要是由 Activity 的生命周期决定的,该方法主要是监测窗口是否获取或失去焦点,测试如下:
1. 首次进入该页面,生命周期执行顺序:onCreate() -> onStart() -> onResume() -> onWindowFocusChanged()
2. 点击 home 键,退到后台执行顺序:onPause() ->onWindowFocusChanged() -> onStop()
3. 从后台返回当前页面,生命周期执行顺序:onRestart() -> onStart() -> onResume() -> onWindowFocusChanged()
4. 退出该页面,生命周期执行顺序:onPause() ->onWindowFocusChanged() -> onStop() -> onDestroy()
以下是和尚公众号,欢迎闲来吐槽~