提交 e265d786 编写于 作者: B Blankj

see 12/17 log

上级 050ff664
* `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.
......
......@@ -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
......
......@@ -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
......
{
"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
......@@ -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
......@@ -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;
......
......@@ -2,7 +2,7 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.22.1'
implementation 'com.blankj:utilcode:1.22.2'
```
......
......@@ -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` 哦:
......
......@@ -2,7 +2,7 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.22.1'
implementation 'com.blankj:utilcode:1.22.2'
```
......
......@@ -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);
}
/**
......
......@@ -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;
......
......@@ -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;
/**
* <pre>
......@@ -157,28 +159,12 @@ public final class Utils {
final LinkedList<Activity> mActivityList = new LinkedList<>();
final HashMap<Object, OnAppStatusChangedListener> mStatusListenerMap = new HashMap<>();
private OnActivityDestroyedListener mOnActivityDestroyedListener;
final HashMap<Activity, Set<OnActivityDestroyedListener>> 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<OnActivityDestroyedListener> 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<Map.Entry<Activity, Set<OnActivityDestroyedListener>>> entries = mDestroyedListenerMap.entrySet();
for (Map.Entry<Activity, Set<OnActivityDestroyedListener>> entry : entries) {
if (entry.getKey() == activity) {
Set<OnActivityDestroyedListener> 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() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册