我一直在研究Android SDK平台,有点不清楚如何保存应用程序的状态.因此,考虑到'Hello,Android'示例的这种小型重新设计:
package com.android.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloAndroid extends Activity {
private TextView mTextView = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextView = new TextView(this);
if (savedInstanceState == null) {
mTextView.setText("Welcome to HelloAndroid!");
} else {
mTextView.setText("Welcome back.");
}
setContentView(mTextView);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这对于最简单的情况就足够了,但无论我如何远离应用程序,它总是以第一条消息响应.
我确信解决方案就像覆盖onPause
或类似的那样简单,但我已经在文档中捅了大约30分钟左右,并且没有找到任何明显的东西.
哪个更正确?这个:
@Override protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong(ID, mId);
}
Run Code Online (Sandbox Code Playgroud)
或这个:
@Override protected void onSaveInstanceState(Bundle outState) {
outState.putLong(ID, mId);
super.onSaveInstanceState(outState);
}
Run Code Online (Sandbox Code Playgroud)
他们都在我的姜饼设备和Froyo和冰淇淋三明治模拟器上为我工作,我已经看到尽可能多的例子说另一种方式.有关系吗?
我知道有许多问题在关于保存事件状态,但我无法找到问题的答案.
我有一个扩展AppCompatActivity的活动; 此活动使用3个片段,它有一个变量'int currentStep'来跟踪正在显示的片段.在onSavedInstanceState方法中,我将currentStep变量存储在bundle中,然后在onCreate方法中我将其恢复.
public class MainActivity extends AppCompatActivity {
private final String CURRENT_STEP_TAG = "current_step";
private int currentStep;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pedido);
if(savedInstanceState == null) {
loadFirstFragment();
} else {
currentStep = savedInstanceState.getInt(CURRENT_STEP_TAG);
if(currentStep == 2){
//Do some stuff...
}
}
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
Log.d("deubg", "--------onsaveinstancestate--------");
outState.putInt(CURRENT_STEP_TAG, currentStep);
super.onSaveInstanceState(outState, outPersistentState);
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题是onSavedInstanceState在屏幕变化时不会被调用,并且根据谷歌文档,它应该.消息"-------- onsaveinstancestate --------"未在控制台中显示.但是,onCreate方法中的Bundle savedInstanceState在屏幕旋转后为非null,但它没有int'sturrentStep'.
我尝试了很多东西:为ActionBarActivity更改了AppCompatActivity,将super.onSavedInstanceState的调用移到了不同的位置,试图存储其他变量; 但无论我做什么,该方法都不会执行.
另外,我的清单中没有android:configChanges.
我的应用程序是针对sdk版本22,buildToolsVersion 22.0.1编译的
我想测试一下onSaveInstanceState
和onRestoreInstanceState
我在模拟器应用程序.
我发现了这个,它说我们可以在方向更改期间模拟这个,但是我将一些变量存储在应用程序级别(子类android.app.Application
)中,因此方向更改不会消除变量.
所以我的问题是,我如何模拟低内存情况,从而杀死我的活动?
希望我已经清楚了.谢谢
使用compat lib v1(因为某些错误而不使用v2 | 3); 这个问题的一个变种.
我有一个片段,其UI具有各种控件,我希望在方向更改时保持其状态.
父方活动在方向改变时被销毁(请不要告诉我有关清单变化以避免活动娱乐!!!!).
片段调用setRetainInstance(true)
.
1)现在我的理解是,具有唯一ID的视图应该保留一些状态,例如方向更改.鉴于此,我期望一个非null的bundle,onCreateView|onActivityCreated
但它是null.
2)在任何情况下如果我保存状态onSaveInstanceState
(确保我调用super)我仍然在'onCreateView | onActivityCreated'中得到一个空包
3)如果我不调用setRetainInstance(true)
那么onCreateView|onActivityCreated
即使我没有`onSaveInstanceState'方法,我也会得到一个非空包.
我的问题是,这是否按预期工作,我对生命周期的理解被打破了?无论如何,我猜测对我来说最好的方法是保留片段,然后在片段中保持控件的状态.
提前致谢.彼得.