4

Android Application Development for Dummiesの例を試しています。これは、電話の呼び出しモードを切り替えるシンプルなアプリです。コードは以下です。

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()現在の状態を確認して更新しますUI)、しかし、プロセスを強制終了してから電話モードをサイレントに変更しても、正しい画像が表示されるのはなぜですか?

アプリがリロードされ、デフォルトの画像が表示されると思いますが、これは正常です。正確ではありませんが、紛らわしい静かなイメージです。

4

4 に答える 4

5

onResume()アクティビティがフォアグラウンド入力を取り戻すたびに呼び出されます。これも:

  • 他の何かがフォアグラウンドになった後に画面に戻ったとき (例: 設定)、および

  • このプロセスで初めて作成されるとき (これには、DDMS から古いプロセスを強制終了したために必要な新しいプロセスが含まれます)

したがって、コードはどちらの場合も呼び出し音モードの状態を調べ、どちらの場合も適切な画像を使用します。

于 2012-06-10T13:05:55.180 に答える
4

onResume は、アクティビティが一時停止された後に呼び出されるだけでなく、アクティビティがアクティビティ スタックの一番上に移動するたびに呼び出されます。これには、作成後に最初に表示されたときも含まれます。

開発者向けドキュメントには、各ライフサイクル コールバックが実際に呼び出されるタイミングを説明するフローチャートや表など、アクティビティ ライフサイクルがどのように機能するかについて非常に詳細に記載されています。

于 2012-06-10T13:06:49.800 に答える
0

Android 開発者向けドキュメントの最近の更新により、答えが明確になると思います。onResume() は、アクティビティが初めて開始されたとき、アクティビティをフォアグラウンドに移動したとき、または電話をロック画面から外したときに呼び出されます。

Android アクティビティのドキュメント

于 2012-07-10T08:25:52.450 に答える