ActivityManager 类
class ActivityManager {
private val activityList = LinkedList<Activity>()
companion object{
private var instance: ActivityManager? = null
// 单例模式中获取唯一的MyApplication实例
fun getInstance(): ActivityManager {
if (null == instance) {
instance = ActivityManager()
}
return instance as ActivityManager
}
}
// 添加Activity到容器中
fun addActivity(activity: Activity) {
activityList.add(activity)
}
// 删除Activity到容器中 New Add
fun removeActivity(activity: Activity) {
activityList.remove(activity)
activity.finish()
}
fun close() {
for (activity in activityList) {
activity.finish()
}
}
// 遍历所有Activity并finish
fun exit() {
for (activity in activityList) {
activity.finish()
}
android.os.Process.killProcess(android.os.Process.myPid())
}
}
BaseActivity 类
@Suppress("DEPRECATED_IDENTITY_EQUALS", "DEPRECATION")
@SuppressLint("MissingPermission", "SourceLockedOrientationActivity")
abstract class BaseActivity : AppCompatActivity(), LifecycleProvider<ActivityEvent> {
private val lifecycleSubject = BehaviorSubject.create<ActivityEvent>()
private var myApp: Application? = null
private var statusH: Int = 0
private var viewlayout: FrameLayout? = null
private var tipDialog: QMUITipDialog? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
QMUIStatusBarHelper.translucent(this)
changeStatusColor(true) //修改状态栏 颜色 默认黑 传参false时 变更为白色
statusH = QMUIStatusBarHelper.getStatusbarHeight(this)
setContentView(getContentView())
myApp = MyApplication.getInstance()
ActivityManager.getInstance().addActivity(this)
lifecycleSubject.onNext(ActivityEvent.CREATE)
initView()
initData()
initOnclick()
initEye()
}
protected abstract fun getContentView(): Int
protected abstract fun initView()
protected abstract fun initData()
protected abstract fun initOnclick()
/**
* 添加护眼模式浮层
*/
protected open fun initEye() {
val content = findViewById<ViewGroup>(android.R.id.content)
viewlayout = FrameLayout(this)
viewlayout?.setBackgroundColor(Color.TRANSPARENT)
val params = WindowManager.LayoutParams()
params.flags =
(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
params.width = WindowManager.LayoutParams.MATCH_PARENT
params.height = WindowManager.LayoutParams.MATCH_PARENT
content.addView(viewlayout, params)
}
/**
* 开启护眼模式
*/
fun openEye() {
viewlayout?.setBackgroundColor(getFilterColor(30))
}
/**
* 关闭护眼模式
*/
fun closeEye() {
viewlayout?.setBackgroundColor(Color.TRANSPARENT)
}
/**
* 过滤蓝光
* @param [10-30-80] 蓝光过滤比例
*/
private fun getFilterColor(blueFilterPercent: Int): Int {
var realFilter = blueFilterPercent
if (realFilter < 10) {
realFilter = 10
} else if (realFilter > 80) {
realFilter = 80
}
val a = (realFilter / 80f * 180).toInt()
val r = (200 - (realFilter / 80f) * 190).toInt()
val g = (180 - (realFilter / 80f) * 170).toInt()
val b = (60 - realFilter / 80f * 60).toInt()
return Color.argb(a, r, g, b)
}
@NonNull
@CheckResult
override fun lifecycle(): Observable<ActivityEvent> { //<ActivityEvent>
return lifecycleSubject.hide()
}
@NonNull
@CheckResult
override fun <T> bindUntilEvent(@NonNull event: ActivityEvent): LifecycleTransformer<T> {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event)
}
@NonNull
@CheckResult
override fun <T> bindToLifecycle(): LifecycleTransformer<T> {
return RxLifecycleAndroid.bindActivity(lifecycleSubject)
}
@CallSuper
override fun onStart() {
super.onStart()
lifecycleSubject.onNext(ActivityEvent.START)
}
@CallSuper
override fun onResume() {
super.onResume()
lifecycleSubject.onNext(ActivityEvent.RESUME)
}
@CallSuper
override fun onPause() {
super.onPause()
lifecycleSubject.onNext(ActivityEvent.PAUSE)
}
@CallSuper
override fun onStop() {
super.onStop()
lifecycleSubject.onNext(ActivityEvent.STOP)
}
override fun onDestroy() {
super.onDestroy()
lifecycleSubject.onNext(ActivityEvent.DESTROY)
ActivityManager.getInstance().removeActivity(this)
}
//修改状态栏颜色
private fun changeStatusColor(value: Boolean = false) {
if (value) {
QMUIStatusBarHelper.setStatusBarLightMode(this) //黑色
} else {
QMUIStatusBarHelper.setStatusBarDarkMode(this) //白色
}
}
fun showProgress() {
dismissProgress()
tipDialog = QMUITipDialog.Builder(this).setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING)
.setTipWord("加载中...").create()
tipDialog?.show()
}
//自定义文字
fun showProgress(content: String, type: Int) {
tipDialog = QMUITipDialog.Builder(this)
.setIconType(if ((if (type == QMUITipDialog.Builder.ICON_TYPE_LOADING) QMUITipDialog.Builder.ICON_TYPE_LOADING else QMUITipDialog.Builder.ICON_TYPE_NOTHING) == QMUITipDialog.Builder.ICON_TYPE_NOTHING) QMUITipDialog.Builder.ICON_TYPE_SUCCESS else QMUITipDialog.Builder.ICON_TYPE_FAIL)
.setTipWord(content)
.create()
tipDialog?.show()
}
fun dismissProgress() {
if (tipDialog != null) {
tipDialog?.dismiss()
tipDialog = null
}
}
fun showConfigDialog(title: String, msg: String, obj: () -> Unit) {
AlertDialog.Builder(this).setTitle(title).setMessage(msg)
.setNegativeButton("取消") { dialog, _ -> dialog?.dismiss() }
.setPositiveButton("确定") { dialog, _ ->
dialog?.dismiss()
obj.invoke()
}
.create()
.show()
}
}
BaseMvpActivity 类
public abstract class BaseMvpActivity<T extends BasePresenter> extends BaseActivity implements BaseView {
protected T mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
if (mPresenter != null) {
mPresenter.detachView();
}
super.onDestroy();
}
/**
* 绑定生命周期 防止MVP内存泄漏
*
* @param <T>
* @return
*/
@Override
public <T> AutoDisposeConverter<T> bindAutoDispose() {
return AutoDispose.autoDisposable(AndroidLifecycleScopeProvider
.from(this, Lifecycle.Event.ON_DESTROY));
}
@Override
public void showToast(String str) {
Toasty.normal(this, str).show();
}
@Override
public void showToastError(Throwable throwable) {
Toasty.normal(this, ErrorResultUtil.getErrorMessage(throwable)).show();
}
@Override
public void showLoading() {
showProgress();
}
@Override
public void showLoading(String content) {
showProgress(content, IconType.ICON_TYPE_LOADING);
}
@Override
public void hideLoading() {
dismissProgress();
}
@Override
protected void initView() {
}
@Override
protected void initData() {
}
@Override
protected void initOnclick() {
}
@Override
public void endRefreshAndLoadMore() {
}
}
BaseFragment 类
abstract class BaseFragment : Fragment() {
private var mContext: AppCompatActivity? = null
private var mBaseView: View? = null
private var statusHeight: Int = 0 //状态栏高度
private var viewlayout: FrameLayout? = null
protected abstract fun getLayoutId(): Int
protected abstract fun initViews(savedInstanceState: Bundle)
protected abstract fun initData()
protected abstract fun initOnclick()
//new Add
override fun onAttach(context: Context) {
super.onAttach(context)
this.mContext = context as AppCompatActivity
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
statusHeight = QMUIStatusBarHelper.getStatusbarHeight(mContext)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
if (mBaseView == null) {
mBaseView = inflater.inflate(getLayoutId(), container, false)
}
return mBaseView
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (savedInstanceState != null) {
initViews(savedInstanceState)
} else {
initViews(savedInstanceState = Bundle())
}
initData()
initOnclick()
}
/**
* 添加护眼模式浮层
*/
protected open fun initEye() {
val content = mContext?.findViewById<ViewGroup>(android.R.id.content)
viewlayout = FrameLayout(mContext!!)
viewlayout?.setBackgroundColor(Color.TRANSPARENT)
val params = WindowManager.LayoutParams()
params.flags = (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
params.width = WindowManager.LayoutParams.MATCH_PARENT
params.height = WindowManager.LayoutParams.MATCH_PARENT
content?.addView(viewlayout, params)
}
/**
* 开启护眼模式
*/
fun openEye() {
viewlayout?.setBackgroundColor(getFilterColor(30))
}
/**
* 关闭护眼模式
*/
fun closeEye() {
viewlayout?.setBackgroundColor(Color.TRANSPARENT)
}
/**
* 过滤蓝光
* @param blueFilterPercent 蓝光过滤比例[10-30-80]
*/
fun getFilterColor(blueFilterPercent: Int): Int {
var realFilter = blueFilterPercent
if (realFilter < 10) {
realFilter = 10
} else if (realFilter > 80) {
realFilter = 80
}
val a = (realFilter / 80f * 180).toInt()
val r = (200 - (realFilter / 80f) * 190).toInt()
val g = (180 - (realFilter / 80f) * 170).toInt()
val b = (60 - realFilter / 80f * 60).toInt()
return Color.argb(a, r, g, b)
}
var tipDialog: QMUITipDialog? = null
fun showProgress(
iconType: Int = QMUITipDialog.Builder.ICON_TYPE_LOADING,
tit: String = "正在加载"
) {
tipDialog?.let {
if (it.isShowing) {
it.dismiss()
}
}
tipDialog = QMUITipDialog.Builder(activity)
.setIconType(iconType)
.setTipWord(tit)
.create()
tipDialog?.show()
}
fun dismissProgress() {
tipDialog?.let {
it.dismiss()
tipDialog = null
}
}
}
BaseMvpFragment类
public abstract class BaseMvpFragment<T extends BasePresenter> extends BaseFragment implements BaseView {
protected T mPresenter;
@Override
public void onDestroyView() {
super.onDestroyView();
if (mPresenter != null) {
mPresenter.detachView();
}
super.onDestroyView();
}
/**
* 绑定生命周期 防止MVP内存泄漏
*
* @param <T>
* @return
*/
@Override
public <T> AutoDisposeConverter<T> bindAutoDispose() {
return AutoDispose.autoDisposable(AndroidLifecycleScopeProvider
.from(this, Lifecycle.Event.ON_DESTROY));
}
@Override
public void showToast(String str) {
Toasty.normal(MyApplication.getInstance(), str).show();
}
@Override
public void showLoading() {
showProgress(QMUITipDialog.Builder.ICON_TYPE_LOADING, "正在加载");
}
@Override
public void showLoading(String content) {
showProgress(QMUITipDialog.Builder.ICON_TYPE_LOADING, content);
}
@Override
public void hideLoading() {
dismissProgress();
}
@Override
public void showToastError(Throwable throwable) {
Toasty.normal(MyApplication.getInstance(), ErrorResultUtil.getErrorMessage(throwable)).show();
}
@Override
protected void initViews(@NotNull Bundle savedInstanceState) {
}
@Override
protected void initData() {
}
@Override
protected void initOnclick() {
}
@Override
public void endRefreshAndLoadMore() {
}
}
BaseModel 类
public Apiservice mApiService ;
public BaseModel(){
mApiService = ApiManager.getInstance().mApiService;
}
BasePresenter类
public class BasePresenter<V extends BaseView> {
protected V mView;
/**
* 绑定view,一般在初始化中调用该方法
*
* @param view view
*/
public void attachView(V view) {
this.mView = view;
}
/**
* 解除绑定view,一般在onDestroy中调用
*/
public void detachView() {
this.mView = null;
}
/**
* View是否绑定
*
* @return
*/
public boolean isViewAttached() {
return mView != null;
}
}
BaseView 接口
public interface BaseView {
void showToast(String str);
//显示加载中
void showLoading();
//自定义加载提示内容
void showLoading(String content);
//隐藏加载
void hideLoading();
//数据获取失败
void showToastError(Throwable throwable);
//刷新完成
void endRefreshAndLoadMore();
//绑定Android生命周期 防止RxJava内存泄漏
<T> AutoDisposeConverter<T> bindAutoDispose();
}
ApiManager 类
@SuppressLint("TrustAllX509TrustManager")
public class ApiManager {
private List<String> verifyHostNameArray= Collections.singletonList(BaseConfig.BaseApi);//app使用的域名列表
public Apiservice mApiService = null;
private static ApiManager INSTANCE = null;
public static ApiManager getInstance() {
if (INSTANCE == null) {
INSTANCE = new ApiManager();
}
return INSTANCE;
}
public static void reset() {
INSTANCE = new ApiManager();
}
private ApiManager() {
OkHttpClient mOkHttpClient;
try {
//信用管理器
X509TrustManager trustManager = getX509TrustManager();
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{trustManager}, new java.security.SecureRandom());
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
mOkHttpClient = new OkHttpClient.Builder()
.writeTimeout(BaseConfig.WRITE_TIME, TimeUnit.SECONDS)
.readTimeout(BaseConfig.READ_TIME, TimeUnit.SECONDS)
.connectTimeout(BaseConfig.CONNECT_TIME, TimeUnit.SECONDS)
.addInterceptor(new ApiInterceptor())
.sslSocketFactory(sslSocketFactory, trustManager)
.hostnameVerifier((hostname, session) -> {
//方法1
for (String s : verifyHostNameArray) {
if (s.contains(hostname)) {
return true;
}
}
return false;
}).build();
Retrofit mRetrofit = new Retrofit.Builder()
.baseUrl(BaseConfig.BaseApi)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//使用rxjava
.addConverterFactory(GsonConverterFactory.create())//使用Gson
.client(mOkHttpClient)
.build();
this.mApiService = mRetrofit.create(Apiservice.class);
} catch (Exception e) {
e.printStackTrace();
}
}
//信用管理器
private X509TrustManager getX509TrustManager() throws Exception {
X509TrustManager x509TrustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0];
}
};
return x509TrustManager;
}
}
ApiInterceptor 类
public class ApiInterceptor implements Interceptor {
@NotNull
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
//
// HttpUrl.Builder builder = original.url().newBuilder();
// HttpUrl url = builder.build();
return chain.proceed(original);
}
private static String bodyToString(RequestBody request) {
try {
Buffer buffer = new Buffer();
if (request != null) {
request.writeTo(buffer);
return buffer.readUtf8();
} else {
return "";
}
} catch (IOException var3) {
return "did not work";
}
}
}