diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ef8322de50ead03db583f5378c7d3c6e4e048ca..10fef262a1c34f3a83b5f1ba61bc3449cb983395 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* `18/12/17` [fix] ToastUtils leak. Publish v1.22.2. * `18/12/09` [add] Component for the project. * `18/12/04` [add] BusUtils. Publish v1.22.1. * `18/11/18` [fix] ToastUtils don't show in the devices grater than API 24 when close the permission of notification. Publish v1.22.0. diff --git a/README-CN.md b/README-CN.md index b8644232340dc4fc398deec24e62418e1eea554f..9d9af8dead09ae6256d8f288b0ca062ec8828ef9 100644 --- a/README-CN.md +++ b/README-CN.md @@ -41,7 +41,7 @@ [logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png -[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.22.1-brightgreen.svg +[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.22.2-brightgreen.svg [auc]: https://github.com/Blankj/AndroidUtilCode [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg diff --git a/README.md b/README.md index 93a846b61e8175d4b44831912758d3214c3a2cee..b1ef32f97810e19da34762413541b9a2ce70be00 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ If this project helps you a lot and you want to support the project's developmen [logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png -[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.22.1-brightgreen.svg +[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.22.2-brightgreen.svg [auc]: https://github.com/Blankj/AndroidUtilCode [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg diff --git a/launcher/app/__bus__.json b/launcher/app/__bus__.json index a142264eae80c3f27546df040f2362cce7ee094f..fe76b2d76d6825da7201ed01565c73ee1fe52038 100644 --- a/launcher/app/__bus__.json +++ b/launcher/app/__bus__.json @@ -1,3 +1,4 @@ { + "SubUtilActivity#start": "void com.blankj.subutil.pkg.feature.SubUtilActivity.start(android.content.Context)", "CoreUtilActivity#start": "void com.blankj.utilcode.pkg.feature.CoreUtilActivity.start(android.content.Context)" } \ No newline at end of file diff --git a/lib/base/build.gradle b/lib/base/build.gradle index 74bb722b15da0570796fff44f06b1679a99c0756..b32b54d4b2f542bb30f12520a195b1405dd0e610 100644 --- a/lib/base/build.gradle +++ b/lib/base/build.gradle @@ -4,7 +4,7 @@ apply { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - api project(':utilcode-lib') +// api project(':utilcode-lib') api project(':subutil-lib') api dep.support.appcompat_v7 @@ -15,5 +15,5 @@ dependencies { api dep.free_proguard api 'com.r0adkll:slidableactivity:2.0.5' compileOnly dep.leakcanary.android_no_op -// api 'com.blankj:utilcode:1.22.1' + api 'com.blankj:utilcode:1.22.2' } \ No newline at end of file diff --git a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.java b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.java index 809b1c5a27cbad6e5e662dfbac6a9c7dfe77c8fc..e755a55cd323bd2e83f3798ab6c7ec18fbe54eb1 100644 --- a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.java +++ b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.java @@ -4,7 +4,7 @@ import android.app.Activity; import android.content.DialogInterface; import android.support.v7.app.AlertDialog; -import com.blankj.subutil.R.pkg; +import com.blankj.subutil.pkg.R; import com.blankj.utilcode.util.ActivityUtils; import com.blankj.utilcode.util.PermissionUtils; import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest; diff --git a/utilcode/README-CN.md b/utilcode/README-CN.md index 1b103ee3bba0a11b7660b37e4517013fec8bcb20..fcada55276b284fa31d761ebcc560d53965e1909 100644 --- a/utilcode/README-CN.md +++ b/utilcode/README-CN.md @@ -2,7 +2,7 @@ Gradle: ```groovy -implementation 'com.blankj:utilcode:1.22.1' +implementation 'com.blankj:utilcode:1.22.2' ``` diff --git a/utilcode/README-STATIC-BUS.md b/utilcode/README-STATIC-BUS.md index 1ccfe8ff78661cfec6e3da87809ff8abb9f21b6b..2f0a8f3ee9e5462692f612a31d84b2950c9523f4 100644 --- a/utilcode/README-STATIC-BUS.md +++ b/utilcode/README-STATIC-BUS.md @@ -27,7 +27,7 @@ apply plugin: "com.blankj.bus" 给 base 模块添加 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 依赖: ```groovy -api "com.blankj:utilcode:1.22.1" +api "com.blankj:utilcode:1.22.2" ``` 比如 module0 中存在的 `Module0Activity.java`,我们通常都是在它内部写一个 `start` 函数来启动它,现在我们给它添加 `@BusUtils.Subscribe` 注解,并给注解的 `name` 赋唯一值,要注意,函数务必要 `public static` 哦: diff --git a/utilcode/README.md b/utilcode/README.md index 80a60a105ab5f4981ef1f3576edbe3ae4a841a56..56d8f618799b21374b774bf8ee1136cc2b6f7151 100644 --- a/utilcode/README.md +++ b/utilcode/README.md @@ -2,7 +2,7 @@ Gradle: ```groovy -implementation 'com.blankj:utilcode:1.22.1' +implementation 'com.blankj:utilcode:1.22.2' ``` diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java index d8192297d5460e246e94208ea8f11357a58d782c..6cb0dc91a2c92dfd7f485555f4e997876a6cfcb9 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java @@ -49,7 +49,7 @@ public final class AppUtils { */ public static void registerAppStatusChangedListener(@NonNull final Object obj, @NonNull final Utils.OnAppStatusChangedListener listener) { - Utils.getActivityLifecycle().addListener(obj, listener); + Utils.getActivityLifecycle().addOnAppStatusChangedListener(obj, listener); } /** @@ -58,7 +58,7 @@ public final class AppUtils { * @param obj The object. */ public static void unregisterAppStatusChangedListener(@NonNull final Object obj) { - Utils.getActivityLifecycle().removeListener(obj); + Utils.getActivityLifecycle().removeOnAppStatusChangedListener(obj); } /** diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java index 9860ee4f3bde8a0a59f9d255e0a474fcf2592fcb..51efb2ac38905212471b800d9dad1676daede764 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java @@ -251,7 +251,7 @@ public final class ToastUtils { @Override public void run() { cancel(); - iToast = ToastFactory.makeToast(Utils.getTopActivityOrApp(), text, duration); + iToast = ToastFactory.makeToast(Utils.getApp(), text, duration); final TextView tvMessage = iToast.getView().findViewById(android.R.id.message); if (sMsgColor != COLOR_DEFAULT) { tvMessage.setTextColor(sMsgColor); @@ -416,11 +416,18 @@ public final class ToastUtils { static class ToastWithoutNotification extends AbsToast { private WindowManager mWM; - - private View mView; + private View mView; private WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); + private Utils.OnActivityDestroyedListener listener = + new Utils.OnActivityDestroyedListener() { + @Override + public void onActivityDestroyed(Activity activity) { + cancel(); + } + }; + ToastWithoutNotification(Toast toast) { super(toast); } @@ -437,20 +444,12 @@ public final class ToastUtils { } else { Context topActivityOrApp = Utils.getTopActivityOrApp(); if (topActivityOrApp instanceof Activity) { - mWM = ((Activity) topActivityOrApp).getWindowManager(); + Activity topActivity = (Activity) topActivityOrApp; + mWM = topActivity.getWindowManager(); + Utils.getActivityLifecycle().addOnActivityDestroyedListener(topActivity, listener); } mParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL; mParams.y = mToast.getYOffset() + getNavBarHeight(); - if (Utils.getActivityLifecycle().getOnActivityDestroyedListener() == null) { - Utils.getActivityLifecycle().setOnActivityDestroyedListener( - new Utils.OnActivityDestroyedListener() { - @Override - public void onActivityDestroyed(Activity activity) { - cancel(); - } - } - ); - } } final Configuration config = context.getResources().getConfiguration(); @@ -496,7 +495,7 @@ public final class ToastUtils { public void cancel() { try { if (mWM != null) { - mWM.removeView(mView); + mWM.removeViewImmediate(mView); } } catch (Exception ignored) { /**/ } mView = null; diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java index f82e5179c0d391f3633d067ba12734ff67bdd18b..518bf26726cb565ba97cc71268c559b2d66c82b9 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java @@ -11,9 +11,11 @@ import android.os.Bundle; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; /** *
@@ -157,28 +159,12 @@ public final class Utils {
         final LinkedList                        mActivityList      = new LinkedList<>();
         final HashMap mStatusListenerMap = new HashMap<>();
 
-        private OnActivityDestroyedListener mOnActivityDestroyedListener;
+        final HashMap> mDestroyedListenerMap = new HashMap<>();
 
         private int     mForegroundCount = 0;
         private int     mConfigCount     = 0;
         private boolean mIsBackground    = false;
 
-        OnActivityDestroyedListener getOnActivityDestroyedListener() {
-            return mOnActivityDestroyedListener;
-        }
-
-        void setOnActivityDestroyedListener(OnActivityDestroyedListener onActivityDestroyedListener) {
-            mOnActivityDestroyedListener = onActivityDestroyedListener;
-        }
-
-        void addListener(final Object object, final OnAppStatusChangedListener listener) {
-            mStatusListenerMap.put(object, listener);
-        }
-
-        void removeListener(final Object object) {
-            mStatusListenerMap.remove(object);
-        }
-
         @Override
         public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
             setTopActivity(activity);
@@ -229,9 +215,49 @@ public final class Utils {
         @Override
         public void onActivityDestroyed(Activity activity) {
             mActivityList.remove(activity);
-            if (mOnActivityDestroyedListener != null) {
-                mOnActivityDestroyedListener.onActivityDestroyed(activity);
+            consumeOnActivityDestroyedListener(activity);
+        }
+
+        Activity getTopActivity() {
+            if (!mActivityList.isEmpty()) {
+                final Activity topActivity = mActivityList.getLast();
+                if (topActivity != null) {
+                    return topActivity;
+                }
+            }
+            Activity topActivityByReflect = getTopActivityByReflect();
+            if (topActivityByReflect != null) {
+                setTopActivity(topActivityByReflect);
+            }
+            return topActivityByReflect;
+        }
+
+        void addOnAppStatusChangedListener(final Object object,
+                                           final OnAppStatusChangedListener listener) {
+            mStatusListenerMap.put(object, listener);
+        }
+
+        void removeOnAppStatusChangedListener(final Object object) {
+            mStatusListenerMap.remove(object);
+        }
+
+        void removeOnActivityDestroyedListener(final Activity activity) {
+            if (activity == null) return;
+            mDestroyedListenerMap.remove(activity);
+        }
+
+        void addOnActivityDestroyedListener(final Activity activity,
+                                            final OnActivityDestroyedListener listener) {
+            if (activity == null || listener == null) return;
+            Set listeners;
+            if (!mDestroyedListenerMap.containsKey(activity)) {
+                listeners = new HashSet<>();
+                mDestroyedListenerMap.put(activity, listeners);
+            } else {
+                listeners = mDestroyedListenerMap.get(activity);
+                if (listeners.contains(listener)) return;
             }
+            listeners.add(listener);
         }
 
         private void postStatus(final boolean isForeground) {
@@ -258,18 +284,17 @@ public final class Utils {
             }
         }
 
-        Activity getTopActivity() {
-            if (!mActivityList.isEmpty()) {
-                final Activity topActivity = mActivityList.getLast();
-                if (topActivity != null) {
-                    return topActivity;
+        private void consumeOnActivityDestroyedListener(Activity activity) {
+            Set>> entries = mDestroyedListenerMap.entrySet();
+            for (Map.Entry> entry : entries) {
+                if (entry.getKey() == activity) {
+                    Set value = entry.getValue();
+                    for (OnActivityDestroyedListener listener : value) {
+                        listener.onActivityDestroyed(activity);
+                    }
+                    removeOnActivityDestroyedListener(activity);
                 }
             }
-            Activity topActivityByReflect = getTopActivityByReflect();
-            if (topActivityByReflect != null) {
-                setTopActivity(topActivityByReflect);
-            }
-            return topActivityByReflect;
         }
 
         private Activity getTopActivityByReflect() {