zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

安卓笔记0913

2023-09-11 14:18:52 时间

1.LifeCycle如何实现监听所有activity生命周期的。

这个实现原理其实很简单,既然是activity是所有使用的activity的基类,那么直接在对应的生命周期方法中通知一下application就可以了。

 然后application对所有注册的LifeCycle依次回调

void dispatchActivityCreated(@NonNull Activity activity,
            @Nullable Bundle savedInstanceState) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                        savedInstanceState);
            }
        }
    }

2.Gilde传入activity和传入application有什么不同?

with可以传入六种类型,

Activity,Fragment,Context,FragmentActivity,View。其实无论传入那种,最后都会执行到RequestManagerRetriever的get方法里面,

如果是Context类型,就判断是否最终属于application类型

 public RequestManager get(@NonNull Context context) {
    if (context == null) {
      throw new IllegalArgumentException("You cannot start a load on a null Context");
    } else if (Util.isOnMainThread() && !(context instanceof Application)) {
      if (context instanceof FragmentActivity) {
        return get((FragmentActivity) context);
      } else if (context instanceof Activity) {
        return get((Activity) context);
      } else if (context instanceof ContextWrapper
          // Only unwrap a ContextWrapper if the baseContext has a non-null application context.
          // Context#createPackageContext may return a Context without an Application instance,
          // in which case a ContextWrapper may be used to attach one.
          && ((ContextWrapper) context).getBaseContext().getApplicationContext() != null) {
        return get(((ContextWrapper) context).getBaseContext());
      }
    }

    return getApplicationManager(context);
  }

activity的类型。

  @SuppressWarnings("deprecation")
  @NonNull
  public RequestManager get(@NonNull Activity activity) {
    if (Util.isOnBackgroundThread()) {
      return get(activity.getApplicationContext());
    } else {
      assertNotDestroyed(activity);
      android.app.FragmentManager fm = activity.getFragmentManager();
      return fragmentGet(activity, fm, /*parentHint=*/ null, isActivityVisible(activity));
    }
  }

我们这里看到如果是activity的话,会获取FragmentManager,最后其实会添加一个透明的Fragment到FragmentManager中,从而间接的获取到Activity的生命周期。

  @NonNull
  private SupportRequestManagerFragment getSupportRequestManagerFragment(
      @NonNull final FragmentManager fm, @Nullable Fragment parentHint, boolean isParentVisible) {
    SupportRequestManagerFragment current =
        (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
    if (current == null) {
      current = pendingSupportRequestManagerFragments.get(fm);
      if (current == null) {
        current = new SupportRequestManagerFragment();
        current.setParentFragmentHint(parentHint);
        if (isParentVisible) {
          current.getGlideLifecycle().onStart();
        }
        pendingSupportRequestManagerFragments.put(fm, current);
        fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
        handler.obtainMessage(ID_REMOVE_SUPPORT_FRAGMENT_MANAGER, fm).sendToTarget();
      }
    }
    return current;
  }

我们来断点看一下,这里我们可以看到,确实走的是Fragment的生命周期。

我们接下来看一下,activity销毁的时候,Gilde会进行哪些操作。对应的回调在RequestManager的onDestroy里面。

@Override
public synchronized void onDestroy() {
  targetTracker.onDestroy();
  for (Target<?> target : targetTracker.getAll()) {
    clear(target);
  }
  targetTracker.clear();
  requestTracker.clearRequests();
  lifecycle.removeListener(this);
  lifecycle.removeListener(connectivityMonitor);
  mainHandler.removeCallbacks(addSelfToLifecycle);
  glide.unregisterRequestManager(this);
}

我们看到,首先针对若干监听对象进行清理操作。对应的其实就是尚未发送的请求给暂停掉。

然后清空所有的回调注册。

 

3.事件传递机制,子View接收到Down事件后ViewGroup是否会接收到通知。

4.LifeCycle如何实现监听所有activity声明周期的。