From 3b4337c1c69f5eac003f45244779f8ea52d3a1dd Mon Sep 17 00:00:00 2001 From: sum41forever Date: Thu, 18 Jan 2018 17:22:24 +0800 Subject: [PATCH] Improve comment --- .../java/com/jess/arms/base/BaseActivity.java | 3 +- .../base/delegate/ActivityDelegateImpl.java | 18 ++++- .../jess/arms/base/delegate/AppDelegate.java | 79 +++++++++++++++++-- .../jess/arms/base/delegate/IActivity.java | 1 + .../arms/integration/ActivityLifecycle.java | 6 ++ 5 files changed, 95 insertions(+), 12 deletions(-) diff --git a/arms/src/main/java/com/jess/arms/base/BaseActivity.java b/arms/src/main/java/com/jess/arms/base/BaseActivity.java index 6bd8942..fe55794 100644 --- a/arms/src/main/java/com/jess/arms/base/BaseActivity.java +++ b/arms/src/main/java/com/jess/arms/base/BaseActivity.java @@ -85,7 +85,8 @@ public abstract class BaseActivity

extends AppCompatActivi super.onCreate(savedInstanceState); try { int layoutResID = initView(savedInstanceState); - if (layoutResID != 0) {//如果initView返回0,框架则不会调用setContentView(),当然也不会 Bind ButterKnife + //如果initView返回0,框架则不会调用setContentView(),当然也不会 Bind ButterKnife + if (layoutResID != 0) { setContentView(layoutResID); //绑定到butterknife mUnbinder = ButterKnife.bind(this); diff --git a/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java b/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java index acc83ad..2c59ac1 100644 --- a/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java +++ b/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java @@ -40,11 +40,20 @@ public class ActivityDelegateImpl implements ActivityDelegate { this.iActivity = (IActivity) activity; } + /** + * + * @param savedInstanceState + */ @Override public void onCreate(Bundle savedInstanceState) { - if (iActivity.useEventBus())//如果要使用eventbus请将此方法返回true - EventBus.getDefault().register(mActivity);//注册到事件主线 - iActivity.setupActivityComponent(ArmsUtils.obtainAppComponentFromContext(mActivity));//依赖注入 + // 如果要使用eventbus请将此方法返回true + if (iActivity.useEventBus()){ + //注册到事件主线 + EventBus.getDefault().register(mActivity); + } + + // 这里提供AppComponent对象给BaseActivity的实现类,用于Dagger2依赖注入 + iActivity.setupActivityComponent(ArmsUtils.obtainAppComponentFromContext(mActivity)); } @Override @@ -74,7 +83,8 @@ public class ActivityDelegateImpl implements ActivityDelegate { @Override public void onDestroy() { - if (iActivity != null && iActivity.useEventBus())//如果要使用eventbus请将此方法返回true + //如果要使用eventbus请将此方法返回true + if (iActivity != null && iActivity.useEventBus()) EventBus.getDefault().unregister(mActivity); this.iActivity = null; this.mActivity = null; diff --git a/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java b/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java index d56ac5b..9ba7900 100644 --- a/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java +++ b/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java @@ -86,6 +86,7 @@ public class AppDelegate implements App, AppLifecycles { //遍历 mAppLifecycles, 回调所有已注册的 AppLifecycles 的 attachBaseContext() 方法 for (AppLifecycles lifecycle : mAppLifecycles) { + // (个人选择扩展的逻辑) lifecycle.attachBaseContext(base); } } @@ -107,29 +108,32 @@ public class AppDelegate implements App, AppLifecycles { this.mModules = null; - //该注册是为了给每个 Activity 增加 Arms 框架中统一的全局逻辑 + // 注册框架已实现的Activity生命周期逻辑 mApplication.registerActivityLifecycleCallbacks(mActivityLifecycle); - //该注册是为了 RxLifecycle 能在每个 Activity 或 Fragment 的生命周期中, 发送对应 Event 事件 + // 注册框架已实现的RxLifecycle逻辑 mApplication.registerActivityLifecycleCallbacks(mActivityLifecycleForRxLifecycle); - //遍历 mActivityLifecycles, 注册所有 Activity 的生命周期回调, 每个 ConfigModule 的实现类可以声明多个 Activity 的生命周期回调 - //也可以有 N 个 ConfigModule 的实现类 (完美支持组件化项目 各个 Module 的各种独特需求) + // 注册个人扩展的Activity生命周期逻辑 + // 每个 ConfigModule 的实现类可以声明多个 Activity 的生命周期回调 + // 也可以有 N 个 ConfigModule 的实现类 (完美支持组件化项目 各个 Module 的各种独特需求) for (Application.ActivityLifecycleCallbacks lifecycle : mActivityLifecycles) { mApplication.registerActivityLifecycleCallbacks(lifecycle); } mComponentCallback = new AppComponentCallbacks(mApplication, mAppComponent); + // 注册回掉:内存紧张时释放部分内存 mApplication.registerComponentCallbacks(mComponentCallback); - //遍历 mAppLifecycles, 回调所有已注册的 AppLifecycles 的 onCreate() 方法 + // 注册个人扩展的App onCreate逻辑 for (AppLifecycles lifecycle : mAppLifecycles) { lifecycle.onCreate(mApplication); } } + @Override public void onTerminate(Application application) { if (mActivityLifecycle != null) { @@ -184,7 +188,7 @@ public class AppDelegate implements App, AppLifecycles { /** * 将AppComponent返回出去,供其它地方使用, AppComponent接口中声明的方法返回的实例,在getAppComponent()拿到对象后都可以直接使用 * - * @return + * @return AppComponent */ @NonNull @Override @@ -196,6 +200,13 @@ public class AppDelegate implements App, AppLifecycles { } + /** + * ComponentCallbacks2是一个细粒度的内存回收管理回调。 + * Application、Activity、Service、ContentProvider、Fragment实现了ComponentCallback2接口 + * 开发者应该实现onTrimMemory(int)方法,细粒度release 内存,参数可以体现不同程度的内存可用情况 + * 响应onTrimMemory回调:开发者的app会直接受益,有利于用户体验,系统更有可能让app存活的更持久。 + * 不响应onTrimMemory回调:系统更有可能kill 进程 + */ private static class AppComponentCallbacks implements ComponentCallbacks2 { private Application mApplication; private AppComponent mAppComponent; @@ -205,9 +216,57 @@ public class AppDelegate implements App, AppLifecycles { this.mAppComponent = appComponent; } + /** + * 在你的app生命周期的任何阶段,onTrimMemory的回调方法同样可以告诉你整个设备的内存资源已经开始紧张。 + * 你应该根据onTrimMemory回调中的内存级别来进一步决定释放哪些资源。 + * onTrimMemory()的回调可以发生在Application,Activity,Fragment,Service,Content Provider + * + * @see level 官方文档 + * @param level 内存级别 + */ @Override public void onTrimMemory(int level) { + switch (level) { + //1.当开发者的app正在运行 + // 设备开始运行缓慢,不会被kill不会被列为可杀死的。但是设备此时正运行于低内存状态下,系统开始触发杀死LRU Cache中的Process的机制。 + case TRIM_MEMORY_RUNNING_MODERATE: + + break; + // 设备运行更缓慢了,不会被kill。但请回收unused资源,以便提升系统的性能。你应该释放不用的资源用来提升系统性能(但是这也会直接影响到你的app的性能)。 + case TRIM_MEMORY_RUNNING_LOW: + + break; + // 设备运行特别慢,当前app还不会被杀死,但是系统已经把LRU Cache中的大多数进程都已经杀死,因此你应该立即释放所有非必须的资源。 + // 如果系统不能回收到足够的RAM数量,系统将会清除所有的LRU缓存中的进程,并且开始杀死那些之前被认为不应该杀死的进程,例如那个包含了一个运行态Service的进程。 + case TRIM_MEMORY_RUNNING_CRITICAL: + + break; + + //2.当前app UI不再可见,这是一个回收大个资源的好时机, + case TRIM_MEMORY_UI_HIDDEN: + break; + + //3.当前的app进程被置于Background LRU List + // 进程位于LRU list的上端。尽管你的app进程并不是处于被杀掉的高危险状态,系统可能已经开始杀掉LRU缓存中的其他进程了。 + // 你应该释放那些容易恢复的资源,以便于你的进程可以保留下来,这样当用户回退到你的app的时候才能够迅速恢复。 + case TRIM_MEMORY_BACKGROUND: + + break; + // 系统正运行于低内存状态并且你的进程已经已经接近LRU名单的中部位置。如果系统开始变得更加内存紧张,你的进程是有可能被杀死的。 + case TRIM_MEMORY_MODERATE: + + break; + // 系统正运行与低内存的状态并且你的进程正处于LRU名单中最容易被杀掉的位置。你应该释放任何不影响你的app恢复状态的资源。 + // 低于api 14的,用户可以使用onLowMemory回调。 + case TRIM_MEMORY_COMPLETE: + + break; + + default: + + break; + } } @Override @@ -215,9 +274,15 @@ public class AppDelegate implements App, AppLifecycles { } + /** + * 当系统开始清除LRU缓存中的进程时,尽管它首先按照LRU的顺序来操作,但是它同样会考虑进程的内存使用量。因此消耗越少的进程则越容易被留下来。 + * onTrimMemory() 的回调是在API 14才被加进来的,对于老的版本,你可以使用onLowMemory)回调来进行兼容。 + * onLowMemory 相当与下面 onTrimMemory(TRIM_MEMORY_COMPLETE) + * @see #TRIM_MEMORY_COMPLETE + */ @Override public void onLowMemory() { - //内存不足时清理不必要的资源 + } } diff --git a/arms/src/main/java/com/jess/arms/base/delegate/IActivity.java b/arms/src/main/java/com/jess/arms/base/delegate/IActivity.java index e66677b..579e98e 100644 --- a/arms/src/main/java/com/jess/arms/base/delegate/IActivity.java +++ b/arms/src/main/java/com/jess/arms/base/delegate/IActivity.java @@ -83,6 +83,7 @@ public interface IActivity { /** * 这个Activity是否会使用Fragment,框架会根据这个属性判断是否注册{@link FragmentManager.FragmentLifecycleCallbacks} * 如果返回false,那意味着这个Activity不需要绑定Fragment,那你再在这个Activity中绑定继承于 {@link BaseFragment} 的Fragment将不起任何作用 + * @see com.jess.arms.integration.ActivityLifecycle#registerFragmentCallbacks (Fragment的注册过程) * * @return */ diff --git a/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java b/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java index 959eeb8..da57c6a 100644 --- a/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java +++ b/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java @@ -153,17 +153,22 @@ public class ActivityLifecycle implements Application.ActivityLifecycleCallbacks * @param activity */ private void registerFragmentCallbacks(Activity activity) { + boolean useFragment = activity instanceof IActivity ? ((IActivity) activity).useFragment() : true; if (activity instanceof FragmentActivity && useFragment) { if (mFragmentLifecycle == null) { + // Fragment生命周期实现类:EventBus,ButterKnife注册解绑,IFragment部分接口的实现 mFragmentLifecycle = new FragmentLifecycle(); } + // 注册框架已实现的Fragment生命周期逻辑 ((FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycle, true); if (mFragmentLifecycles == null && mExtras.containsKey(ConfigModule.class.getName())) { + mFragmentLifecycles = new ArrayList<>(); + List modules = (List) mExtras.get(ConfigModule.class.getName()); for (ConfigModule module : modules) { module.injectFragmentLifecycle(mApplication, mFragmentLifecycles); @@ -171,6 +176,7 @@ public class ActivityLifecycle implements Application.ActivityLifecycleCallbacks mExtras.remove(ConfigModule.class.getName()); } + // 注册个人扩展的Fragment生命周期逻辑 for (FragmentManager.FragmentLifecycleCallbacks fragmentLifecycle : mFragmentLifecycles) { ((FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(fragmentLifecycle, true); } -- GitLab