Selaa lähdekoodia

封装页面基类,添加mvp层

Frankensteinly 1 vuosi sitten
vanhempi
sitoutus
5d08f94bf1

+ 1 - 0
app/src/main/java/com/grkj/iscs/activity/BleActivity.kt

@@ -18,6 +18,7 @@ import com.grkj.iscs.CustomBleIndicateCallback
 import com.grkj.iscs.CustomBleScanCallback
 import com.grkj.iscs.CustomBleWriteCallback
 import com.grkj.iscs.R
+import com.grkj.iscs.base.BaseBindingActivity
 import com.grkj.iscs.databinding.ActivityBleBinding
 import com.grkj.iscs.model.BleBean
 import com.grkj.iscs.model.Constants.PERMISSION_REQUEST_CODE

+ 5 - 0
app/src/main/java/com/grkj/iscs/activity/IModbusView.kt

@@ -0,0 +1,5 @@
+package com.grkj.iscs.activity
+
+import com.grkj.iscs.base.IView
+
+interface IModbusView: IView

+ 1 - 0
app/src/main/java/com/grkj/iscs/activity/MainActivity.kt

@@ -1,6 +1,7 @@
 package com.grkj.iscs.activity
 
 import android.content.Intent
+import com.grkj.iscs.base.BaseBindingActivity
 import com.grkj.iscs.databinding.ActivityMainBinding
 
 class MainActivity : BaseBindingActivity<ActivityMainBinding>() {

+ 14 - 0
app/src/main/java/com/grkj/iscs/activity/ModBusPresenter.kt

@@ -0,0 +1,14 @@
+package com.grkj.iscs.activity
+
+import com.grkj.iscs.base.BasePresenter
+import com.grkj.iscs.modbus.ModBusController
+
+class ModBusPresenter: BasePresenter<IModbusView>() {
+
+    fun initModbus() {
+        ModBusController.setSlaveCount(4)
+        ModBusController.interruptReadTrashBinStatus(false)
+        ModBusController.start(mContext!!)
+        ModBusController.unregisterListener(mContext!!)
+    }
+}

+ 8 - 5
app/src/main/java/com/grkj/iscs/activity/ModbusActivity.kt

@@ -1,18 +1,17 @@
 package com.grkj.iscs.activity
 
+import com.grkj.iscs.base.BaseMvpActivity
 import com.grkj.iscs.databinding.ActivityModbusBinding
 import com.grkj.iscs.modbus.ModBusController
 
-class ModbusActivity : BaseBindingActivity<ActivityModbusBinding>() {
+class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityModbusBinding>() {
+
     override val viewBinding: ActivityModbusBinding
         get() = ActivityModbusBinding.inflate(layoutInflater)
 
     override fun initView() {
 
-        ModBusController.setSlaveCount(4)
-        ModBusController.interruptReadTrashBinStatus(false)
-        ModBusController.start(this)
-        ModBusController.unregisterListener(this)
+        presenter?.initModbus()
 
 //        mBinding?.send?.setOnClickListener {
 //            PortManager.plcPort?.send(byteArrayOf(0x03, 0x00, 0x6B, 0x00, 0x03))
@@ -20,6 +19,10 @@ class ModbusActivity : BaseBindingActivity<ActivityModbusBinding>() {
         mBinding?.exit?.setOnClickListener { finish() }
     }
 
+    override fun initPresenter(): ModBusPresenter {
+        return ModBusPresenter()
+    }
+
     override fun onDestroy() {
         super.onDestroy()
         ModBusController.stop()

+ 24 - 9
app/src/main/java/com/grkj/iscs/activity/BaseBindingActivity.kt → app/src/main/java/com/grkj/iscs/base/BaseActivity.kt

@@ -1,28 +1,36 @@
-package com.grkj.iscs.activity
+package com.grkj.iscs.base
 
 import android.os.Bundle
+import android.view.View
 import androidx.appcompat.app.AppCompatActivity
-import androidx.viewbinding.ViewBinding
+import com.grkj.iscs.util.ActivityUtils
 import pub.devrel.easypermissions.EasyPermissions
 
-abstract class BaseBindingActivity<T : ViewBinding?> : AppCompatActivity() {
-    protected var mBinding: T? = null
+/**
+ * 页面基类
+ */
+abstract class BaseActivity : AppCompatActivity() {
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        mBinding = viewBinding
-        setContentView(mBinding!!.root)
-
+        setContentView(getLayoutView())
+        ActivityUtils.addActivity(this)
         initView()
     }
 
-    abstract val viewBinding: T
+    /**
+     * 页面布局View
+     */
+    abstract fun getLayoutView(): View
 
+    /**
+     * 控件初始化
+     */
     abstract fun initView()
 
     override fun onDestroy() {
         super.onDestroy()
-        mBinding = null
+        ActivityUtils.removeActivity(this)
     }
 
     fun handleLoading(isShow: Boolean) {
@@ -33,4 +41,11 @@ abstract class BaseBindingActivity<T : ViewBinding?> : AppCompatActivity() {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults)
         EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
     }
+
+    /**
+     * 退出页面,默认直接finish
+     */
+    open fun exitPage() {
+        finish()
+    }
 }

+ 27 - 0
app/src/main/java/com/grkj/iscs/base/BaseBindingActivity.kt

@@ -0,0 +1,27 @@
+package com.grkj.iscs.base
+
+import android.os.Bundle
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import androidx.viewbinding.ViewBinding
+import pub.devrel.easypermissions.EasyPermissions
+
+abstract class BaseBindingActivity<T : ViewBinding?> : BaseActivity() {
+    protected var mBinding: T? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        mBinding = viewBinding
+        super.onCreate(savedInstanceState)
+    }
+
+    override fun getLayoutView(): View {
+        return mBinding!!.root
+    }
+
+    abstract val viewBinding: T
+
+    override fun onDestroy() {
+        super.onDestroy()
+        mBinding = null
+    }
+}

+ 28 - 0
app/src/main/java/com/grkj/iscs/base/BaseMvpActivity.kt

@@ -0,0 +1,28 @@
+package com.grkj.iscs.base
+
+import android.os.Bundle
+import androidx.viewbinding.ViewBinding
+
+/**
+ * MVP基类Activity
+ */
+abstract class BaseMvpActivity<V : IView?, T : BasePresenter<V>?, B : ViewBinding> :
+    BaseBindingActivity<B>(), IView {
+    var presenter: T? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        presenter = initPresenter()
+        presenter?.onCreate(this as V, this)
+        super.onCreate(savedInstanceState)
+    }
+
+    override fun onDestroy() {
+        presenter?.onDestroy()
+        super.onDestroy()
+    }
+
+    /**
+     * 实例化Presenter对象
+     */
+    abstract fun initPresenter(): T
+}

+ 24 - 0
app/src/main/java/com/grkj/iscs/base/BasePresenter.kt

@@ -0,0 +1,24 @@
+package com.grkj.iscs.base
+
+import android.content.Context
+
+/**
+ * MVP基类Presenter
+ */
+abstract class BasePresenter<T : IView?> {
+    protected var mvpView: T? = null
+    protected var mContext: Context? = null
+
+    fun onCreate(mvpView: T, context: Context) {
+        this.mvpView = mvpView
+        mContext = context
+    }
+
+    open fun onDestroy() {
+        mvpView = null
+    }
+
+    fun onLowMemory() {
+        mvpView = null
+    }
+}

+ 8 - 0
app/src/main/java/com/grkj/iscs/base/IView.kt

@@ -0,0 +1,8 @@
+package com.grkj.iscs.base
+
+interface IView {
+    /**
+     * Loading显隐
+     */
+//    fun setLoadingState(isShow: Boolean, process: String? = null)
+}

+ 291 - 0
app/src/main/java/com/grkj/iscs/util/ActivityUtils.kt

@@ -0,0 +1,291 @@
+package com.grkj.iscs.util
+
+import android.R
+import android.app.Activity
+import android.app.ActivityManager
+import android.app.ActivityOptions
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.util.Pair
+import android.view.View
+import androidx.core.app.ActivityCompat
+import androidx.core.app.ActivityOptionsCompat
+import java.util.*
+import kotlin.system.exitProcess
+
+/**
+ * @author tamsiree
+ * @date 2016/1/24
+ *
+ *
+ * 封装Activity相关工具类
+ */
+object ActivityUtils {
+    var activityStack: Stack<Activity?>? = null
+
+    /**
+     * 获取栈中指定Activity实例
+     *
+     * @param T activity
+     * @return 栈中存在的指定Activity/null
+     */
+    inline fun <reified T>  getSpecActivity(): T? {
+        activityStack?.forEach {
+            it?.let { itActivity ->
+                if (itActivity is T) {
+                    return itActivity
+                }
+            }
+        }
+        return null
+    }
+
+    /**
+     * 清理指定activity之后的activity
+     */
+    inline fun <reified T> clearSpecTop() {
+        activityStack?.asReversed()?.forEach {
+            if (it !is T) {
+                it?.finish()
+            }
+        }
+    }
+
+    /**
+     * 添加Activity 到栈
+     *
+     * @param activity Activity
+     */
+    @JvmStatic
+    fun addActivity(activity: Activity?) {
+        if (activityStack == null) {
+            activityStack = Stack()
+        }
+        activityStack?.add(activity)
+    }
+
+    /**
+     * 从List中移除活动
+     *
+     * @param activity 活动
+     */
+    @JvmStatic
+    fun removeActivity(activity: Activity?) {
+        if (activity != null) {
+            if (activityStack!!.contains(activity)) {
+                activityStack?.remove(activity)
+            }
+        }
+    }
+
+
+    /**
+     * 获取当前的Activity(堆栈中最后一个压入的)
+     */
+    @JvmStatic
+    fun currentActivity(): Activity? {
+        return activityStack?.lastElement()
+    }
+
+    /**
+     * 结束当前Activity(堆栈中最后一个压入的)
+     */
+    @JvmStatic
+    @JvmOverloads
+    fun finishActivity(isTransition: Boolean = false) {
+        val activity = activityStack?.lastElement()
+        if (isTransition) {
+            activity?.onBackPressed()
+        } else {
+            activity?.finish()
+        }
+    }
+
+    /**
+     * 结束指定类名的Activity
+     */
+    @JvmStatic
+    fun finishActivity(cls: Class<out Activity>) {
+        for (activity in activityStack!!) {
+            if (activity!!.javaClass == cls) {
+                finishActivity(activity)
+            }
+        }
+    }
+
+    /**
+     * 结束所有的Activity
+     */
+    @JvmStatic
+    fun finishAllActivity() {
+        val size = activityStack!!.size
+        for (i in 0 until size) {
+            if (null != activityStack!![i]) {
+                activityStack!![i]!!.finish()
+            }
+        }
+        activityStack!!.clear()
+        exitProcess(0)
+    }
+
+    /**
+     * 判断是否存在指定Activity
+     *
+     * @param context     上下文
+     * @param packageName 包名
+     * @param className   activity全路径类名
+     * @return `true`: 是<br></br>`false`: 否
+     */
+    @JvmStatic
+    fun isExistActivity(context: Context, packageName: String?, className: String?): Boolean {
+        val intent = Intent()
+        intent.setClassName(packageName!!, className!!)
+        return !(context.packageManager.resolveActivity(intent, 0) == null || intent.resolveActivity(context.packageManager) == null || context.packageManager.queryIntentActivities(intent, 0).size == 0)
+    }
+
+    /**
+     * 要求最低API为11
+     * Activity 跳转
+     * 跳转后Finish之前所有的Activity
+     *
+     * @param context Context
+     * @param goal    Activity
+     */
+    /**
+     * 要求最低API为11
+     * Activity 跳转
+     * 跳转后Finish之前所有的Activity
+     *
+     * @param context Context
+     * @param goal    Activity
+     */
+    @JvmStatic
+    @JvmOverloads
+    fun skipActivityAndFinishAll(context: Context, goal: Class<out Activity>?, bundle: Bundle? = null, isFade: Boolean = false) {
+        val intent = Intent(context, goal)
+        if (bundle != null) {
+            intent.putExtras(bundle)
+        }
+        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+        context.startActivity(intent)
+        finishActivity(context, false)
+        if (isFade) {
+            fadeTransition(context)
+        }
+    }
+
+    /**
+     * Activity 跳转
+     *
+     * @param context Context
+     * @param goal    Activity
+     */
+    @JvmStatic
+    fun skipActivityAndFinish(context: Context, goal: Class<out Activity>?, isFade: Boolean = false, isTransition: Boolean = false) {
+        skipActivity(context, goal, null, isFade)
+        finishActivity(context, isTransition)
+    }
+
+    /**
+     * Activity 跳转
+     *
+     * @param context Context
+     * @param goal    Activity
+     */
+    @JvmStatic
+    @JvmOverloads
+    fun skipActivityAndFinish(context: Context, goal: Class<out Activity>?, bundle: Bundle? = null, isFade: Boolean = false, isTransition: Boolean = false) {
+        skipActivity(context, goal, bundle, isFade)
+        finishActivity(context, isTransition)
+    }
+
+    /**
+     * Activity 跳转
+     *
+     * @param context Context
+     * @param goal    Activity
+     */
+    @JvmStatic
+    @JvmOverloads
+    fun skipActivity(context: Context, goal: Class<out Activity>?, bundle: Bundle? = null, isFade: Boolean = false) {
+        val intent = Intent(context, goal)
+        if (bundle != null) {
+            intent.putExtras(bundle)
+        }
+        context.startActivity(intent)
+        if (isFade) {
+            fadeTransition(context)
+        }
+    }
+
+    @JvmStatic
+    @JvmOverloads
+    fun skipActivityForResult(context: Activity, goal: Class<out Activity>?, bundle: Bundle? = null, requestCode: Int) {
+        val intent = Intent(context, goal)
+        if (bundle != null) {
+            intent.putExtras(bundle)
+        }
+        context.startActivityForResult(intent, requestCode)
+    }
+
+    @JvmStatic
+    @JvmOverloads
+    fun skipActivityOnTransitions(mContext: Context?, goal: Class<out Activity>?, bundle: Bundle? = null, vararg pairs: Pair<View, String>?) {
+        val intent = Intent(mContext, goal)
+        val bundle1 = ActivityOptions.makeSceneTransitionAnimation(mContext as Activity?, *pairs).toBundle()
+        if (bundle != null) {
+            intent.putExtras(bundle)
+        }
+        ActivityCompat.startActivity(mContext!!, intent, bundle1)
+    }
+
+    @JvmStatic
+    @JvmOverloads
+    fun skipActivityTransition(mContext: Context, goal: Class<out Activity>?, bundle: Bundle? = null, view: View?, elementName: String?) {
+        val intent = Intent(mContext, goal)
+        val bundle1 = ActivityOptionsCompat.makeSceneTransitionAnimation((mContext as Activity), view!!, elementName!!).toBundle()
+        if (bundle != null) {
+            intent.putExtras(bundle)
+        }
+        mContext.startActivity(intent, bundle1)
+    }
+
+    /**
+     * 获取launcher activity
+     *
+     * @param context     上下文
+     * @param packageName 包名
+     * @return launcher activity
+     */
+    @JvmStatic
+    fun getLauncherActivity(context: Context, packageName: String): String {
+        val intent = Intent(Intent.ACTION_MAIN, null)
+        intent.addCategory(Intent.CATEGORY_LAUNCHER)
+        val pm = context.packageManager
+        val infos = pm.queryIntentActivities(intent, 0)
+        for (info in infos) {
+            if (info.activityInfo.packageName == packageName) {
+                return info.activityInfo.name
+            }
+        }
+        return "no $packageName"
+    }
+
+    @JvmStatic
+    @JvmOverloads
+    fun finishActivity(mContext: Context, isTransition: Boolean = false) {
+        removeActivity((mContext as Activity))
+        if (isTransition) {
+            mContext.onBackPressed()
+        } else {
+            mContext.finish()
+        }
+    }
+
+    @JvmStatic
+    fun fadeTransition(mContext: Context) {
+        (mContext as Activity).overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
+    }
+
+}