提交 932e630a 编写于 作者: J JessYan

AppManager#getAppManager() instead AppComponent#appManager()

上级 e22a323e
......@@ -100,6 +100,7 @@ dependencies {
api rootProject.ext.dependencies["dagger2"]
annotationProcessor rootProject.ext.dependencies["dagger2-compiler"]
api rootProject.ext.dependencies["androideventbus"]
api 'org.greenrobot:eventbus:3.1.1'
api rootProject.ext.dependencies["gson"]
//test
......
......@@ -15,6 +15,7 @@
*/
package com.jess.arms.di.component;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
......@@ -23,8 +24,10 @@ import com.jess.arms.base.delegate.AppDelegate;
import com.jess.arms.di.module.AppModule;
import com.jess.arms.di.module.ClientModule;
import com.jess.arms.di.module.GlobalConfigModule;
import com.jess.arms.http.imageloader.BaseImageLoaderStrategy;
import com.jess.arms.http.imageloader.ImageLoader;
import com.jess.arms.integration.AppManager;
import com.jess.arms.integration.ConfigModule;
import com.jess.arms.integration.IRepositoryManager;
import com.jess.arms.integration.cache.Cache;
import com.jess.arms.utils.ArmsUtils;
......@@ -54,30 +57,76 @@ import okhttp3.OkHttpClient;
public interface AppComponent {
Application application();
//用于管理所有 activity
/**
* 用于管理所有 {@link Activity}
* 之前 {@link AppManager} 使用 Dagger 保证单例, 只能使用 {@link AppComponent#appManager()} 访问
* 现在直接将 AppManager 独立为单例类, 可以直接通过静态方法 {@link AppManager#getAppManager()} 访问, 更加方便
* 但为了不影响之前使用 {@link AppComponent#appManager()} 获取 {@link AppManager} 的项目, 所以暂时保留这种访问方式
*
* @return {@link AppManager}
* @deprecated Use {@link AppManager#getAppManager()} instead
*/
@Deprecated
AppManager appManager();
//用于管理网络请求层,以及数据缓存层
/**
* 用于管理网络请求层, 以及数据缓存层
*
* @return {@link IRepositoryManager}
*/
IRepositoryManager repositoryManager();
//RxJava 错误处理管理类
/**
* RxJava 错误处理管理类
*
* @return {@link RxErrorHandler}
*/
RxErrorHandler rxErrorHandler();
//图片管理器,用于加载图片的管理类,默认使用 Glide ,使用策略模式,可在运行时替换框架
/**
* 图片加载管理器, 用于加载图片的管理类, 使用策略者模式, 可在运行时动态替换任何图片加载框架
* arms-imageloader-glide 提供 Glide 的策略实现类, 也可以自行实现
* 需要在 {@link ConfigModule#applyOptions(Context, GlobalConfigModule.Builder)} 中
* 手动注册 {@link BaseImageLoaderStrategy}, {@link ImageLoader} 才能正常使用
*
* @return
*/
ImageLoader imageLoader();
/**
* 网络请求框架
*
* @return {@link OkHttpClient}
*/
OkHttpClient okHttpClient();
//gson
/**
* Json 序列化库
*
* @return {@link Gson}
*/
Gson gson();
//缓存文件根目录(RxCache 和 Glide 的缓存都已经作为子文件夹放在这个根目录下),应该将所有缓存都放到这个根目录下,便于管理和清理,可在 GlobalConfigModule 里配置
/**
* 缓存文件根目录 (RxCache 和 Glide 的缓存都已经作为子文件夹放在这个根目录下), 应该将所有缓存都统一放到这个根目录下
* 便于管理和清理, 可在 {@link ConfigModule#applyOptions(Context, GlobalConfigModule.Builder)} 种配置
*
* @return {@link File}
*/
File cacheFile();
//用来存取一些整个App公用的数据,切勿大量存放大容量数据
/**
* 用来存取一些整个 App 公用的数据, 切勿大量存放大容量数据, 这里的存放的数据和 {@link Application} 的生命周期一致
*
* @return {@link Cache}
*/
Cache<String, Object> extras();
//用于创建框架所需缓存对象的工厂
/**
* 用于创建框架所需缓存对象的工厂
*
* @return {@link Cache.Factory}
*/
Cache.Factory cacheFactory();
void inject(AppDelegate delegate);
......@@ -86,7 +135,9 @@ public interface AppComponent {
interface Builder {
@BindsInstance
Builder application(Application application);
Builder globalConfigModule(GlobalConfigModule globalConfigModule);
AppComponent build();
}
}
......@@ -22,7 +22,9 @@ import android.support.v4.app.FragmentManager;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.integration.ActivityLifecycle;
import com.jess.arms.integration.AppManager;
import com.jess.arms.integration.FragmentLifecycle;
import com.jess.arms.integration.IRepositoryManager;
import com.jess.arms.integration.RepositoryManager;
......@@ -61,6 +63,20 @@ public abstract class AppModule {
return builder.create();
}
/**
* 之前 {@link AppManager} 使用 Dagger 保证单例, 只能使用 {@link AppComponent#appManager()} 访问
* 现在直接将 AppManager 独立为单例类, 可以直接通过静态方法 {@link AppManager#getAppManager()} 访问, 更加方便
* 但为了不影响之前使用 {@link AppComponent#appManager()} 获取 {@link AppManager} 的项目, 所以暂时保留这种访问方式
*
* @param application
* @return
*/
@Singleton
@Provides
static AppManager provideAppManager(Application application){
return AppManager.getAppManager().init(application);
}
@Binds
abstract IRepositoryManager bindRepositoryManager(RepositoryManager repositoryManager);
......
......@@ -29,18 +29,14 @@ import android.view.View;
import com.jess.arms.base.delegate.AppLifecycles;
import com.jess.arms.utils.ArmsUtils;
import org.simple.eventbus.EventBus;
import org.simple.eventbus.Subscriber;
import org.simple.eventbus.ThreadMode;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.reactivex.Completable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Action;
import timber.log.Timber;
import static com.jess.arms.base.Platform.DEPENDENCY_SUPPORT_DESIGN;
......@@ -57,97 +53,91 @@ import static com.jess.arms.base.Platform.DEPENDENCY_SUPPORT_DESIGN;
* <a href="https://github.com/JessYanCoding">Follow me</a>
* ================================================
*/
@Singleton
public final class AppManager {
protected final String TAG = this.getClass().getSimpleName();
public static final String APPMANAGER_MESSAGE = "appmanager_message";
//true 为不需要加入到 Activity 容器进行统一管理,默认为 false
/**
* true 为不需要加入到 Activity 容器进行统一管理,默认为 false
*/
public static final String IS_NOT_ADD_ACTIVITY_LIST = "is_not_add_activity_list";
public static final int START_ACTIVITY = 5000;
public static final int SHOW_SNACKBAR = 5001;
public static final int KILL_ALL = 5002;
public static final int APP_EXIT = 5003;
@Inject
Application mApplication;
//管理所有存活的 Activity, 容器中的顺序仅仅是 Activity 的创建顺序, 并不能保证和 Activity 任务栈顺序一致
private static volatile AppManager sAppManager;
private Application mApplication;
/**
* 管理所有存活的 Activity, 容器中的顺序仅仅是 Activity 的创建顺序, 并不能保证和 Activity 任务栈顺序一致
*/
private List<Activity> mActivityList;
//当前在前台的 Activity
/**
* 当前在前台的 Activity
*/
private Activity mCurrentActivity;
//提供给外部扩展 AppManager 的 onReceive 方法
/**
* 此方法作废, 现在可通过 {@link AppManager#getAppManager()} 直接访问 {@link AppManager}
* <p>
* 提供给外部扩展 {@link AppManager} 的 {@link #onReceive(Message)} 方法
*/
private HandleListener mHandleListener;
@Inject
public AppManager() {
private AppManager() {
}
public static AppManager getAppManager() {
if (sAppManager == null) {
synchronized (AppManager.class) {
if (sAppManager == null) {
sAppManager = new AppManager();
}
}
}
return sAppManager;
}
@Inject
void init() {
EventBus.getDefault().register(this);
public AppManager init(Application application) {
this.mApplication = application;
return sAppManager;
}
/**
* 通过 {@link EventBus#post(Object)} 事件, 远程遥控执行对应方法
* 此方法作废, 现在可通过 {@link AppManager#getAppManager()} 直接访问 {@link AppManager}
* <p>
* 可通过 {@link #setHandleListener(HandleListener)}, 让外部可扩展新的事件
*
* @param message
*/
@Subscriber(tag = APPMANAGER_MESSAGE, mode = ThreadMode.MAIN)
@Deprecated
public void onReceive(Message message) {
switch (message.what) {
case START_ACTIVITY:
if (message.obj == null)
break;
dispatchStart(message);
break;
case SHOW_SNACKBAR:
if (message.obj == null)
break;
showSnackbar((String) message.obj, message.arg1 == 0 ? false : true);
break;
case KILL_ALL:
killAll();
break;
case APP_EXIT:
appExit();
break;
default:
Timber.tag(TAG).w("The message.what not match");
break;
}
if (mHandleListener != null) {
mHandleListener.handleMessage(this, message);
}
}
private void dispatchStart(Message message) {
if (message.obj instanceof Intent)
startActivity((Intent) message.obj);
else if (message.obj instanceof Class)
startActivity((Class) message.obj);
}
@Deprecated
public HandleListener getHandleListener() {
return mHandleListener;
}
/**
* 此方法作废, 现在可通过 {@link AppManager#getAppManager()} 直接访问 {@link AppManager}
* <p>
* 提供给外部扩展 {@link AppManager} 的 {@link #onReceive} 方法(远程遥控 {@link AppManager} 的功能)
* 建议在 {@link ConfigModule#injectAppLifecycle(Context, List)} 中
* 通过 {@link AppLifecycles#onCreate(Application)} 在 App 初始化时,使用此方法传入自定义的 {@link HandleListener}
*
* @param handleListener
*/
@Deprecated
public void setHandleListener(HandleListener handleListener) {
this.mHandleListener = handleListener;
}
/**
* 通过此方法远程遥控 {@link AppManager} ,使 {@link #onReceive(Message)} 执行对应方法
* 此方法作废, 现在可通过 {@link AppManager#getAppManager()} 直接访问 {@link AppManager}
* <p>
* 通过此方法远程遥控 {@link AppManager}, 使 {@link #onReceive(Message)} 执行对应方法
*
* @param msg
* @param msg {@link Message}
*/
@Deprecated
public static void post(Message msg) {
EventBus.getDefault().post(msg, APPMANAGER_MESSAGE);
getAppManager().onReceive(msg);
}
/**
......@@ -161,18 +151,23 @@ public final class AppManager {
Timber.tag(TAG).w("mCurrentActivity == null when showSnackbar(String,boolean)");
return;
}
//Arms 已将 com.android.support:design 从依赖中移除 (目的是减小 Arms 体积, design 库中含有太多 View)
//因为 Snackbar 在 com.android.support:design 库中, 所以如果框架使用者没有自行依赖 com.android.support:design
//Arms 则会使用 Toast 替代 Snackbar 显示信息, 如果框架使用者依赖了 arms-autolayout 库就不用依赖 com.android.support:design 了
//因为在 arms-autolayout 库中已经依赖有 com.android.support:design
if (DEPENDENCY_SUPPORT_DESIGN) {
View view = getCurrentActivity().getWindow().getDecorView().findViewById(android.R.id.content);
Snackbar.make(view, message, isLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT).show();
} else {
ArmsUtils.makeText(mApplication, message);
}
}
Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
//Arms 已将 com.android.support:design 从依赖中移除 (目的是减小 Arms 体积, design 库中含有太多 View)
//因为 Snackbar 在 com.android.support:design 库中, 所以如果框架使用者没有自行依赖 com.android.support:design
//Arms 则会使用 Toast 替代 Snackbar 显示信息, 如果框架使用者依赖了 arms-autolayout 库就不用依赖 com.android.support:design 了
//因为在 arms-autolayout 库中已经依赖有 com.android.support:design
if (DEPENDENCY_SUPPORT_DESIGN) {
View view = getCurrentActivity().getWindow().getDecorView().findViewById(android.R.id.content);
Snackbar.make(view, message, isLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT).show();
} else {
ArmsUtils.makeText(mApplication, message);
}
}
}).subscribeOn(AndroidSchedulers.mainThread()).subscribe();
}
/**
* 让在栈顶的 {@link Activity} ,打开指定的 {@link Activity}
......@@ -203,7 +198,6 @@ public final class AppManager {
* 释放资源
*/
public void release() {
EventBus.getDefault().unregister(this);
mActivityList.clear();
mHandleListener = null;
mActivityList = null;
......@@ -476,6 +470,7 @@ public final class AppManager {
}
}
@Deprecated
public interface HandleListener {
void handleMessage(AppManager appManager, Message message);
}
......
/*
* Copyright 2018 JessYan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jess.arms.integration;
import static com.jess.arms.base.Platform.DEPENDENCY_ANDROID_EVENTBUS;
import static com.jess.arms.base.Platform.DEPENDENCY_EVENTBUS;
/**
* ================================================
* EventBus 的管理类, Arms 核心库并不会依赖某个 EventBus, 如果您想使用 EventBus, 则请在项目中自行依赖对应的 EventBus, 如果不想使用则不依赖
* 支持 greenrobot 的 EventBus 和畅销书 《Android源码设计模式解析与实战》的作者 何红辉 所作的 AndroidEventBus
* 这个类并不能完全做到 EventBus 对外界的零耦合, 只能降低耦合, 因为两个 EventBus 的部分功能使用方法差别太大, 做到完全解耦代价太大
* 允许同时使用两个 EventBus 但不建议这样做, 建议使用 AndroidEventBus, 特别是组件化项目, 原因请看 https://github.com/hehonghui/AndroidEventBus/issues/49
* <p>
* Created by JessYan on 2018/8/1 15:28
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* ================================================
*/
public final class EventBusManager {
private static volatile EventBusManager sInstance;
public static EventBusManager getInstance() {
if (sInstance == null) {
synchronized (EventBusManager.class) {
if (sInstance == null) {
sInstance = new EventBusManager();
}
}
}
return sInstance;
}
private EventBusManager() { }
/**
* 注册订阅者, 允许在项目中同时依赖两个 EventBus, 只要您喜欢
*
* @param subscriber 订阅者
*/
public void register(Object subscriber) {
if (DEPENDENCY_ANDROID_EVENTBUS) {
org.simple.eventbus.EventBus.getDefault().register(subscriber);
}
if (DEPENDENCY_EVENTBUS) {
org.greenrobot.eventbus.EventBus.getDefault().register(subscriber);
}
}
/**
* 注销订阅者, 允许在项目中同时依赖两个 EventBus, 只要您喜欢
*
* @param subscriber 订阅者
*/
public void unregister(Object subscriber) {
if (DEPENDENCY_ANDROID_EVENTBUS) {
org.simple.eventbus.EventBus.getDefault().unregister(subscriber);
}
if (DEPENDENCY_EVENTBUS) {
org.greenrobot.eventbus.EventBus.getDefault().unregister(subscriber);
}
}
/**
* 发送事件, 如果您在项目中同时依赖了两个 EventBus, 请自己使用想使用的 EventBus 的 Api 发送事件
*
* @param event 事件
*/
public void post(Object event) {
if (DEPENDENCY_ANDROID_EVENTBUS) {
org.simple.eventbus.EventBus.getDefault().post(event);
} else if (DEPENDENCY_EVENTBUS) {
org.greenrobot.eventbus.EventBus.getDefault().post(event);
}
}
/**
* 发送黏性事件, 如果您在项目中同时依赖了两个 EventBus, 请自己使用想使用的 EventBus 的 Api 发送黏性事件
*
* @param event 事件
*/
public void postSticky(Object event) {
if (DEPENDENCY_ANDROID_EVENTBUS) {
org.simple.eventbus.EventBus.getDefault().postSticky(event);
} else if (DEPENDENCY_EVENTBUS) {
org.greenrobot.eventbus.EventBus.getDefault().postSticky(event);
}
}
/**
* 注销黏性事件, 如果您在项目中同时依赖了两个 EventBus, 请自己使用想使用的 EventBus 的 Api 注销黏性事件
*
* @param eventType
* @param <T>
* @return
*/
public <T> T removeStickyEvent(Class<T> eventType) {
if (DEPENDENCY_ANDROID_EVENTBUS) {
org.simple.eventbus.EventBus.getDefault().removeStickyEvent(eventType);
return null;
} else if (DEPENDENCY_EVENTBUS) {
return org.greenrobot.eventbus.EventBus.getDefault().removeStickyEvent(eventType);
}
return null;
}
/**
* 清除订阅者和事件的缓存, 如果您在项目中同时依赖了两个 EventBus, 请自己使用想使用的 EventBus 的 Api 清除订阅者和事件的缓存
*/
public void clear() {
if (DEPENDENCY_ANDROID_EVENTBUS) {
org.simple.eventbus.EventBus.getDefault().clear();
} else if (DEPENDENCY_EVENTBUS) {
org.greenrobot.eventbus.EventBus.clearCaches();
}
}
}
......@@ -20,7 +20,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Message;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
......@@ -41,11 +40,6 @@ import com.jess.arms.integration.AppManager;
import java.security.MessageDigest;
import static com.jess.arms.integration.AppManager.APP_EXIT;
import static com.jess.arms.integration.AppManager.KILL_ALL;
import static com.jess.arms.integration.AppManager.SHOW_SNACKBAR;
import static com.jess.arms.integration.AppManager.START_ACTIVITY;
/**
* ================================================
* 一些框架常用的工具
......@@ -231,11 +225,7 @@ public class ArmsUtils {
* @param text
*/
public static void snackbarText(String text) {
Message message = new Message();
message.what = SHOW_SNACKBAR;
message.obj = text;
message.arg1 = 0;
AppManager.post(message);
AppManager.getAppManager().showSnackbar(text, false);
}
/**
......@@ -248,11 +238,7 @@ public class ArmsUtils {
* @param text
*/
public static void snackbarTextWithLong(String text) {
Message message = new Message();
message.what = SHOW_SNACKBAR;
message.obj = text;
message.arg1 = 1;
AppManager.post(message);
AppManager.getAppManager().showSnackbar(text, true);
}
......@@ -268,27 +254,21 @@ public class ArmsUtils {
/**
* 跳转界面 1 ,通过 {@link AppManager#startActivity(Class)}
* 跳转界面 1, 通过 {@link AppManager#startActivity(Class)}
*
* @param activityClass
*/
public static void startActivity(Class activityClass) {
Message message = new Message();
message.what = START_ACTIVITY;
message.obj = activityClass;
AppManager.post(message);
AppManager.getAppManager().startActivity(activityClass);
}
/**
* 跳转界面 2 ,通过 {@link AppManager#startActivity(Intent)}
* 跳转界面 2, 通过 {@link AppManager#startActivity(Intent)}
*
* @param
*/
public static void startActivity(Intent content) {
Message message = new Message();
message.what = START_ACTIVITY;
message.obj = content;
AppManager.post(message);
AppManager.getAppManager().startActivity(content);
}
......@@ -437,21 +417,17 @@ public class ArmsUtils {
}
/**
* 远程遥控 {@link AppManager#killAll()}
* 执行 {@link AppManager#killAll()}
*/
public static void killAll() {
Message message = new Message();
message.what = KILL_ALL;
AppManager.post(message);
AppManager.getAppManager().killAll();
}
/**
* 远程遥控 {@link AppManager#appExit()}
* 执行 {@link AppManager#appExit()}
*/
public static void exitApp() {
Message message = new Message();
message.what = APP_EXIT;
AppManager.post(message);
AppManager.getAppManager().appExit();
}
public static AppComponent obtainAppComponentFromContext(Context context) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册