Android生命周期:是否应该在启动时调用onResume()?

时间:2012-06-10 12:57:09

标签: android android-lifecycle

我正在尝试 Android应用程序开发傻瓜的示例,这是一个简单的应用程序,可以切换手机的铃声模式。代码如下。

public class SilentModeToggleActivity extends Activity {

  private AudioManager mAudioManager;
  private boolean mPhoneIsSilent;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
    checkIfPhoneIsSilent();
    setButtonClickListener();
  }

  @Override public void onResume() {
    super.onResume();
    checkIfPhoneIsSilent();
    toggleUi();
  }

  private void checkIfPhoneIsSilent() {
    int ringerMode = mAudioManager.getRingerMode();
    if (ringerMode == AudioManager.RINGER_MODE_SILENT) {
      mPhoneIsSilent = true;
    } else {
      mPhoneIsSilent = false;
    }
  }

  private void setButtonClickListener() {
    Button toggleButton = (Button) findViewById(R.id.toggleButton);
    toggleButton.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        if (mPhoneIsSilent) {
          mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
          mPhoneIsSilent = false;
        } else {
          mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
          mPhoneIsSilent = true;
        }
        toggleUi();
      }
    });
  }

  private void toggleUi() {
    ImageView imageView = (ImageView) findViewById(R.id.phone_icon);
    Drawable newPhoneImage;
    if (mPhoneIsSilent) {
      newPhoneImage = getResources().getDrawable(R.drawable.phone_silent);
    } else {
      newPhoneImage = getResources().getDrawable(R.drawable.phone_on);
    }
    imageView.setImageDrawable(newPhoneImage);
  }
}

我的问题是因为我只覆盖onCreate()(默认情况下显示“正常”模式图像)和onResume(),如果我将手机模式更改为“静音”,则预计图像会变为“静音”在应用程序外部静音(在onResume()我检查当前状态并更新用户界面),但为什么即使我 KILL 进程然后将手机模式更改为无声?

我希望该应用重新加载并显示默认图片,这是正常的。不是正确而又令人困惑的无声图像。

4 个答案:

答案 0 :(得分:5)

每当活动重新获得前景输入时,都会调用

onResume()。这包括:

  • 当其他人有前景后(例如,设置)返回到屏幕时,

  • 在此过程中第一次创建它时(包括因为您从DDMS中删除了旧进程而需要的任何新进程)

因此,在任何一种情况下,您的代码都会检查振铃模式的状态,并且在任何一种情况下都会使用正确的图像。

答案 1 :(得分:3)

onResume不限于在活动暂停后被调用,只要活动进入活动堆栈的顶部,它就会被称为。这包括它在创建后第一次显示。

developer doucmentation非常详细地介绍了活动生命周期的工作原理,包括描述实际调用每个生命周期回调的流程图和表格。

答案 2 :(得分:0)

我认为您会发现Android开发人员文档的最新更新将澄清您的答案。 onResume()将在您的活动第一次启动时调用,将活动带到前台,或将手机带出锁定屏幕。

Android Activity Documentation

答案 3 :(得分:0)

onResume IS在启动时被调用。请参阅活动生命周期文档here