恢复时Android对象值已更改

时间:2011-12-05 18:22:53

标签: android android-activity onresume

我有一个非常奇怪的情况......(对我来说)

例如,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呢? 如果我的变量是静态的呢?

2 个答案:

答案 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已弃用,您可以在旧平台上使用它。我把它放在这里是为了说明目的。实现这一目标的新方法更具参与性。

以下是详细参考:

getLastNonConfigurationInstance

onRetainNonConfigurationInstance