【问题标题】:How not to destroy activity in onBackPressed?如何不破坏 onBackPressed 中的活动?
【发布时间】:2021-04-26 14:25:29
【问题描述】:

我需要在调用onBackPressed 方法时,Activity 不会被破坏,而是暂停和停止。

我的想法是,它就像按下手机的 Home 按钮时一样工作,它调用 onPauseonStop 因为那样,活动不会被破坏,当活动重新打开时,onResume 被调用以便变量保持活动关闭时的值。

有没有办法做到这一点?如果没有,有没有办法在活动关闭后保持变量的状态?我曾尝试使用 SharedPreference 但我无法使用它们,因为我的变量与提供的变量类型不同。

【问题讨论】:

    标签: android kotlin android-activity onbackpressed


    【解决方案1】:

    如果你想自定义按钮的行为,你必须在你的活动中使用...

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
            
            return true;    //To assess you have handled the event.
        }
        //If you want the normal behaviour to go on after your code.
        return super.onKeyDown(keyCode, event);
    }
    

    这里是some more information关于处理关键事件。


    虽然看起来你想做的只是保留你的活动状态。最好的方法是在退出之前存储您的数据,并在您重新创建活动时将其回调。

    如果您想存储临时数据(我的意思是不要在两次启动之间保存),一种方法是使用sharedPreferences

    //Before your activity closes
    private val PREFS_NAME = "kotlincodes"
    private val SAVE_VALUE = "valueToSave"
    val sharedPref: SharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
    val editor: SharedPreferences.Editor = sharedPref.edit()
    editor.putInt(SAVE_VALUE, value)
    editor.commit()
    
    //When you reopen your activity
    private val PREFS_NAME = "kotlincodes"
    val sharedPref: SharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
    sharedPref.getString(SAVE_VALUE, null)
    

    由于您不能使用 sharedPreferences(因为您不使用原始类型),另一种方法是使用全局单例。

    这是一个 Java 实现 ...

    public class StorageClass{
        private Object data1 = null;
        private StorageClass instance;
    
        private StorageClass(){};
    
        public static final StorageClass getInstance(){
            if(instance == null){
                synchronized(StorageClass.class){
                    if(instance==null)    instance = new StorageClass();
                }
            }
            return instance;
        }
    
        public void setData1(Object newData) { data1 = newData; }
    
        public Object getData1() { return data1; }
    }
    

    然后只需使用 ...

    StorageClass.getInstance().setData1(someValue);
    

    ...和...

    StorageClass.getInstance().getData1(someValue);
    

    在 Kotlin 中 ...

    object Singleton{
        var data1
    }
    

    你使用的...

    Singleton.data1 = someValue    //Before closing.
    someValue = Singleton.data1    //When restarting the activity.
    

    【讨论】:

    • 如何存储数据?我不能使用共享偏好。可以做个小样吗?
    • 这完全取决于你想做什么。它是持久数据,是游戏状态,还是只是一些信息?
    • 只是两个变量的值。
    • 是的,在这种情况下,只为 2 个变量保留整个活动将浪费 RAM。我会编辑我的答案,但告诉我,你为什么不能使用 sharedPreferences ?
    • 我不能使用 sharedpreference 因为我使用的两个变量都不是 boolean、float、int、long、string 所以我可以使用 put 方法。它们是 Route (HERE sdk) 类型和 GeoCoordinate (HERE sdk) 类型的变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多