如何不在 onBackPressed 中销毁 activity?

How not to destroy activity in onBackPressed?

我需要在调用onBackPressed方法时,activity不被销毁而是暂停停止

我的想法是,它的工作方式类似于按下手机的主页按钮,它会调用 onPauseonStop,因为那样的话,activity 不会被破坏,并且当activity 重新打开,调用 onResume 以便变量保持 activity 关闭时的值。

有什么办法吗?如果没有,有没有办法在 activity 关闭后保持变量的状态?我尝试使用 SharedPreference 但我无法使用它们,因为我的变量类型与提供的变量类型不同。

如果您想自定义按钮的行为,您必须在 activity ...

中使用
@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关于处理按键事件。


虽然看起来你想要做的只是保持你 activity 的状态。最好的方法是在退出之前存储您的数据,并在您重新创建 activity.

时调用它

如果你想存储临时数据(我的意思是不在两次启动之间保存它),一种方法是使用 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.