代码之家  ›  专栏  ›  技术社区  ›  lannyf

操作系统终止/恢复此活动后,如何恢复从其他活动构造的对象

  •  0
  • lannyf  · 技术社区  · 7 年前

    有两个模块, activity 1 从…起 module 1 将根据用户操作设置一些对象作为运行上下文。它将启动 activity 2 从 module 2 .还有 活动2 从…起 单元1 将使用更新的对象作为其处理的运行上下文。

    问题是什么时候 OS kills the process and restores (在资源限制下,即接到一个隐藏应用程序的电话-操作系统终止进程-在电话呼叫操作系统恢复应用程序后),操作系统将恢复 last activity 但上一个活动的运行上下文设置已消失,如何恢复 running context .

    例子:

    interface Handler {
        fun func_1(data: Data)
        fun func_2 (data: Data)
    
    }
    
    class Processor (val hanlder: Handler, var which: Int) {
    
        fun doProcess(data: Data) {
            when (which) {
                1 -> {
                    hanlder.func_1(data)
                }
                2-> {
                    hanlder.func_2(data)
                }
            }
        }
    
    }
    
    
    //using global (good or bad???) to avoid passing obj crossing activities
    object Running_context {
        lateinit var _processor: Processor
        fun setProcessor(processor: Processor) {
            this._processor = processor
        }
    
        fun getProcessor() :Processor {
            return this._processor
        }
    
    }
    

    在里面 单元1 这个 activity_1 将根据用户的操作设置运行上下文,如:

    fun launch_activity_2 (which: Int) {
        var processor = Processor (object: Handler {
            override fun func_1(data: String) {
                // do something based on some data get from use in this activity
                // e.g: if (checkBox_a.isChecked) {do something...}
            }
            override fun func_2 (data: String) {
                // do other things...
            }
        }, which)
    
        // set up running context
        Running_context.setProcessor(processor)
    
        // launching the activity_2 from module_2
        // ...
    }
    

    在未来 活动2 (在模块2中)将根据 活动1 :

    fun doProcess(data: String) {
        Running_context.getProcessor().doProcess(data)
    }
    

    在引用 object Running_context 它避免通过考试 object/function point 在所有的活动中。

    但是,当操作系统受到限制时,它可能会终止进程,然后将其恢复,在恢复流中,最后一个活动是 活动2 从…起 单元2 全局实例没有上次的正确运行上下文。

    1. 将对象/函数点传递给另一个活动并在操作系统终止/恢复该活动时使其恢复的最佳方式是什么?

    2. 另一个问题是,如果活动2来自第三方库,并且无法访问 global object Running_context ,以便运行的上下文必须传递到 activity 2'? (小标题) interface Handler 和 class Processor 定义在 单元2 哪一个 单元1 (取决于)

    1 回复  |  直到 7 年前
        1
  •  1
  •   nPn    7 年前

    正如您似乎意识到的,当应用程序被终止并恢复时,即使在全局单例中存储数据也无济于事。我认为你能做的最好的事情就是在每个活动的生命周期中找到一个好的位置(onPause和onResume都很好),对数据进行序列化/反派生,并将数据保存/恢复到持久性存储中。

    看一看 guide 关于这个问题。如果你没有一个巨大复杂的物体,我喜欢用 SharedPreferences .

    如果不需要存储大量数据,则共享首选项 不需要结构,应该使用SharedReferences。这个 SharedPreferences API允许您读取和写入持久数据 基本数据类型的键值对:布尔、浮点、整数、, 长串和弦。

    键值对被写入到XML文件中,这些XML文件在用户之间持久存在 会话,即使你的应用程序被终止。可以手动指定名称 或使用每个活动的文件来保存数据。

    API名称“共享首选项”有点误导,因为API 不完全是为了保存“用户偏好”,比如什么铃声 用户已选择。您可以使用SharedReferences保存任何类型的 简单的数据,比如用户的高分。然而,如果你真的想 保存应用程序的用户首选项,然后阅读如何创建 一个设置UI,它使用AndroidX首选项库来构建 设置屏幕并自动保留用户的设置。

        2
  •  1
  •   lannyf    7 年前

    根据@EpicPandaForce和@nPn的建议,使用bundle传递上下文。

    这里是想法,希望有人有更好的方法,谢谢!

    在里面 module 2 ,定义派生自的基本处理器类:

    open class BaseProcessor() : Parcelable {
    
        open fun doProcess(data: Data){}
    
        // parceable stuff below
        /......
    }
    

    在里面 module 1 使用处理函数创建一个类

    class TheHandler() {
       func_1 (data: Data) {
       }
    
       func_2 (data: Data) {
       }
    }
    

    制造 Processor 派生自BaseProcessor(可以有一些要序列化的基本数据,因此它很小),并重写 doProcess(data: Data) ,
    它将实例化一个 TheHandler 当 doProcess(数据:数据) 调用,并根据上下文值调用适当的函数(即 var which: Int )

    class Processor (var which: Int) : BaseProcessor {
    
        override fun doProcess(data: Data) {
            val handler = TheHandler()
            when (which) {
                1 -> {
                    handler.func_1(data)
                }
                2-> {
                    hanlder.func_2(data)
                }
            }
        }
    
        // parcelable stuff
        // ... ...
        override fun writeToParcel(out: Parcel, flags: Int) {
                super.writeToParcel(out, flags)
                out.writeInt(this.which)
        }
    
        companion object {
            @JvmField
            val CREATOR: Parcelable.Creator<Processor> = object : Parcelable.Creator<Processor> {
                override fun createFromParcel(parcel: Parcel): Processor {
                    return Processor(parcel)
                }
    
                override fun newArray(size: Int): Array<Processor?> {
                    return arrayOfNulls(size)
                }
            }
        }
    }
    

    什么时候发射 activity 2 ,它构建了 加工机 使用上下文数据,并将其放入新 活动2

    fun launch_activity_2 (which: Int) {
        var processor = Processor (which)
    
        // put processor in the bundle
        args.putParcelable(KEY_PROCESSOR_CONFIG, processor)
    
        // launching the activity_2 from module_2 with the bundle passed in 
        // ...
    }
    

    在模块2的活动2中,它希望从包中取出一个BaseProcessor并调用函数 doProces() 还有 processor (这是 加工机 )将具有上下文信息,并通过 泰汉德勒 来自 单元1 是的 activity 1 .

    fun doProcess(data: String) {
        //somethinglike:
    
        val processor: BaseProcessor? = arguments?.getParcelable(KEY_PROCESSOR_CONFIG)
        processor?.doProcess(data)
    }
    
    推荐文章