Kotlin版BaseActivity

本文介绍了一个自定义的BaseActivity框架,用于简化Android应用的开发流程。该框架包含了对话框显示与隐藏、屏幕方向锁定、软键盘布局调整等功能,并实现了主线程与子线程异常捕获机制,确保应用稳定性。此外,还提供了自适应布局、沉浸式状态栏设置及资源适配等特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

abstract class BaseActivity : FragmentActivity() {
    private var dialog : ProgressDialog ?= null
    var mHandler : Handler ?= null
    private var sUncaughtExceptionHandler : Thread.UncaughtExceptionHandler ?= null
    private var file : File ?= null
    private var Tag : String = "BaseActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(getLayout())
        myApplicaion.context = this
        myApplicaion.baseActivity = this
        //沉浸式状态栏
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
            //设置App主题颜色
            window.setStatusBarColor(resources.getColor(R.color.colorPrimary))
        }

        //初始化布局,并适配
        var view : View ?=  null
        view = View.inflate(this,getLayout(),null)
        AutoUtils.setSize(this, false, 750, 1334)
        AutoUtils.auto(view)
        setContentView(view)

        //禁止横屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)

        //禁止键盘挤压布局
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)

        mHandler = Handler()

        //初始化控件
        initView()
        //执行逻辑
        initData()
        //Adapter的内容
        initAdapter()

        //上线前解开
        Handler(Looper.getMainLooper()).post {
            //主线程异常拦截
            while (true) {
                try {
                    Looper.loop()//主线程的异常会从这里抛出
                } catch (e: Throwable) {

                }

            }
        }

        sUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()
        //所有线程异常拦截,由于主线程的异常都被我们catch住了,所以下面的代码拦截到的都是子线程的异常
        Thread.setDefaultUncaughtExceptionHandler { t, e ->
            Log.e(Tag,t.toString() + e.toString())
        }
    }

    //显示加载圈
    fun showLoading(){
        if(dialog!!.isShowing){
            return
        }
        dialog = ProgressDialog(this)
        dialog!!.requestWindowFeature(Window.FEATURE_NO_TITLE)
        dialog!!.setCanceledOnTouchOutside(false)
        dialog!!.setProgressStyle(ProgressDialog.STYLE_SPINNER)
        dialog!!.setMessage("正在加载")
        dialog!!.show()
    }
    //加载圈消失
    fun  dismissLoading() {
        if (dialog!!.isShowing()) {
            dialog!!.dismiss()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
            dialog!!.dismiss()
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        val fragmentManager = supportFragmentManager
        for (indext in 0 until fragmentManager.fragments.size) {
            val fragment = fragmentManager.fragments[indext] //找到第一层Fragment
            if (fragment == null)
                Log.w(
                    Tag,
                    "Activity result no fragment exists for index: 0x" + Integer.toHexString(
                        requestCode
                    )
                )
            else
                handleResult(fragment, requestCode, resultCode, data)
        }
    }

    //递归调用,对所有的子Fragment生效
    private fun handleResult(fragment: Fragment?, requestCode: Int, resultCode: Int, data: Intent?) {
        fragment!!.onActivityResult(requestCode, resultCode, data)//调用每个Fragment的onActivityResult
        Log.e(Tag, "BaseFragmentActivity")
        val childFragment = fragment.getChildFragmentManager().fragments //找到第二层Fragment
        if (childFragment != null)
            for (f in childFragment)
                if (f != null) {
                    handleResult(f, requestCode, resultCode, data)
                }
        if (childFragment == null)
            Log.e(Tag, "BaseFragmentActivity1111")
    }


    abstract fun initAdapter()
    abstract fun initData()
    abstract fun initView()
    abstract fun getLayout() : Int


    companion object{
        class myHandler : Handler(){
            //使用弱引用防止内存泄漏
            var activityWeakReference : WeakReference<BaseActivity> ?= null
            fun myHandler(activity: BaseActivity){
                this.activityWeakReference = WeakReference<BaseActivity>(activity)
            }
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                activityWeakReference?.get()?.mHandler?.handleMessage(msg)
            }

        }
    }



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值