我有一个非常奇怪的情况......(对我来说)
例如,2个对象,
1是一个名为isInPage的活动成员boolean,
2是一个名为bmpPhoto的静态位图对象。
当我进入我自己的活动时,名为“missActivity”
在我退出此活动之前,isInPage将是真的,
bmpPhoto将会有一张照片。
在onCreare()和onResume()之后,没有任何代码在运行,直到用户单击某个GUI。
我所做的是通过按下硬件电源按钮关闭屏幕,可能需要等待5或10分钟。
好的,现在我再次按porwe唤醒手机,解锁屏幕,
和我的missActivity回到了前面。
然后我点击我的GUI按钮通过Logcat检查变量值,它说:
isInPage = FALSE;
我忘记了bmpPhoto的价值,但在我的GUI上,照片刚刚消失,
不再显示了......
这是怎么发生的?
在我这样做之后,每次都不会发生......
如果我覆盖onSaveInstanceState(Bundle savedInstanceState)和
onRestoreInstanceState(Bundle savedInstanceState)?
它会有帮助吗?
那位图对象怎么样?
仍然不知道这是怎么发生的......
我错过了什么吗?
我真的需要你的帮助,请大家〜
以下是我的代码的一部分,很长一段时间...... “isPageRunning”和“bmp”在从桌面返回时有所改变,但不是每次都改变。
public class FacebookShareActivity extends Activity
{
private Bundle b=null;
private Bitmap bmp=null;
private boolean isFacebookWorking=false;
private boolean isPageRunning=true; //This value sometime changed when back from desktop, but not every time
protected void onCreate(Bundle savedInstanceState)
{
Log.i(Constants.TAG, "ON Facebook Share create......");
super.onCreate(savedInstanceState);
setContentView(R.layout.facebook_share);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
}
private void initUI()
{
btnBack=(Button)findViewById(R.id.btnBack);
btnBack.setOnClickListener(new ButtonClickHandler());
formImage=(RelativeLayout)findViewById(R.id.form_image);
formImage.setDrawingCacheEnabled(true);
btnShare=(Button)findViewById(R.id.btnShare);
btnShare.setOnClickListener(new ButtonClickHandler());
txtIntroText=(TextView)findViewById(R.id.txtIntroText);
txtIntroText.setOnClickListener(new ButtonClickHandler());
txtIntroText.setText(getUploadInImageText());
photo=(ImageView)findViewById(R.id.photo);
bmp=Constants.PROFILE.getName().getPhoto();
if(bmp!=null)
{photo.setImageBitmap(bmp);} //bmp wouldn't be null, it filled by some other activity before
}
@Override
protected void onResume()
{
super.onResume();
Log.i(Constants.TAG, "Trying to set UI on resume...");
b=getIntent().getExtras();
// ...
// ... Get some String value passed from prev activity
facebook=new Facebook("123456789012345"); //Test
asyncFacebook=new AsyncFacebookRunner(facebook);
initUI();
System.gc();
}
@Override
public void onBackPressed()
{
Log.d(Constants.TAG, "Activity receive back key...");
lockButtons(false);
return;
}
private void lockButtons(boolean b)
{
if(isPageRunning)
{
btnBack.setClickable(!b);
btnShare.setClickable(!b);
}
}
private class DelayReleaseKey implements Runnable
{
public void run()
{
try{Thread.sleep(10000);}
catch(InterruptedException ie){}
handler.sendEmptyMessage(0);
}
}
private class ButtonClickHandler implements OnClickListener
{
public void onClick(View v)
{
if(v==btnBack)
{
if(isFacebookWorking)
{ShowAlertDialog(Constants.MESSAGE_FACEBOOK_WORK);}
else
{
lockButtons(true);
formImage=null;
photo=null;
b=null;
facebook=null;
isPageRunning=false;
Intent intent=new Intent(FacebookShareActivity.this, PracticeListActivity.class);
startActivity(intent);
FacebookShareActivity.this.finish();
overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
}
}
if(v==btnShare)
{
lockButtons(true);
facebookLogin();
}
}
}
}
现在我知道我必须覆盖onSaveInstanceState,onRestoreInstanceState。 他们可以帮我保存像String,int,boolean这样的变量...... 那么Bitmap呢? 如果我的变量是静态的呢?
答案 0 :(得分:0)
现在再试一次。
public class FacebookShareActivity extends Activity
{
private Bundle b=null;
private static Bitmap bmp=null;
private static boolean isFacebookWorking=false;
private static boolean isPageRunning=true; //This value sometime changed when back from desktop, but not every time
protected void onCreate(Bundle savedInstanceState)
{
Log.i(Constants.TAG, "ON Facebook Share create......");
super.onCreate(savedInstanceState);
setContentView(R.layout.facebook_share);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
}
private void initUI()
{
btnBack=(Button)findViewById(R.id.btnBack);
btnBack.setOnClickListener(new ButtonClickHandler());
formImage=(RelativeLayout)findViewById(R.id.form_image);
formImage.setDrawingCacheEnabled(true);
btnShare=(Button)findViewById(R.id.btnShare);
btnShare.setOnClickListener(new ButtonClickHandler());
txtIntroText=(TextView)findViewById(R.id.txtIntroText);
txtIntroText.setOnClickListener(new ButtonClickHandler());
txtIntroText.setText(getUploadInImageText());
photo=(ImageView)findViewById(R.id.photo);
bmp=Constants.PROFILE.getName().getPhoto();
if(bmp!=null)
{photo.setImageBitmap(bmp);} //bmp wouldn't be null, it filled by some other activity before
}
@Override
protected void onResume()
{
super.onResume();
isPageRunning = true;
Log.i(Constants.TAG, "Trying to set UI on resume...");
b=getIntent().getExtras();
// ...
// ... Get some String value passed from prev activity
facebook=new Facebook("123456789012345"); //Test
asyncFacebook=new AsyncFacebookRunner(facebook);
initUI();
System.gc();
}
@Override
protected void onPause()
{
isPageRunning = false;
}
@Override
public void onBackPressed()
{
Log.d(Constants.TAG, "Activity receive back key...");
lockButtons(false);
return;
}
private void lockButtons(boolean b)
{
if(isPageRunning)
{
btnBack.setClickable(!b);
btnShare.setClickable(!b);
}
}
private class DelayReleaseKey implements Runnable
{
public void run()
{
try{Thread.sleep(10000);}
catch(InterruptedException ie){}
handler.sendEmptyMessage(0);
}
}
private class ButtonClickHandler implements OnClickListener
{
public void onClick(View v)
{
if(v==btnBack)
{
if(isFacebookWorking)
{ShowAlertDialog(Constants.MESSAGE_FACEBOOK_WORK);}
else
{
lockButtons(true);
formImage=null;
photo=null;
b=null;
facebook=null;
isPageRunning=false;
Intent intent=new Intent(FacebookShareActivity.this, PracticeListActivity.class);
startActivity(intent);
FacebookShareActivity.this.finish();
overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
}
}
if(v==btnShare)
{
lockButtons(true);
facebookLogin();
}
}
}
}
答案 1 :(得分:0)
对于原始值,您应该使用onSaveInstanceState
。要进行恢复,您可以使用onRestoreInstanceState
,也可以使用onCreate
中的某些代码:
if(savedInstanceState != null) {
// restore old state
} else {
// a fresh start
}
现在要恢复像Bitmap
这样的对象,如果它们的创建成本不高并且不会让你的UI缓慢,那么在恢复时再创建它们。如果您不想这样,那么使用onRetainNonConfigurationInstance
,代码将如下所示:
@Override
public Object onRetainNonConfigurationInstance () {
return bmp;
}
@Override
public void onCreate() {
if
bmp = (Bitmap)getLastNonConfigurationInstance();
}
警告:此api已弃用,您可以在旧平台上使用它。我把它放在这里是为了说明目的。实现这一目标的新方法更具参与性。
以下是详细参考: