0

複数のアクティビティが特定の順序で表示されるアプリケーションがありますが、これは現在のアクティビティのイベントに基づいて変更される可能性があります。どのアクティビティが表示されるかを管理する「マスター」アクティビティがあります。startActivityForResult()各活動は、その活動にrequestCode固有のものから始まります。

アクティビティが終了したら、resultCodeマスター アクティビティにとって意味のある値に を設定します。マスター アクティビティのonActivityResultメソッドには、switch (requestCode)返されたアクティビティを通知する があり、各ブロックで を使用して、resultCode次に開始するアクティビティを決定します。

私が抱えている問題は、時々、一見ランダムに見えるアプリケーションが非常に不規則に動作し、アクティビティが順不同で表示されることです。

デバッグ中に問題を再現することができなかったので、私が持っているすべての情報は良さそうに見えますが、エンド ユーザーは常に不安定な動作について不満を漏らしています。

どこに問題があるかをテストするにはどうすればよいですか?


マスター アクティビティの onActivityResult からのコード:


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    case Settings.SCREEN_UPDATE:
        ShowActivity(LoginActivity.class, Settings.SCREEN_LOGIN);
        break;
    case Settings.SCREEN_LOGIN: 
        if (resultCode == RESULT_OK) {
            Settings.CurrentReport = new Report();
            Settings.CurrentReport.setUserId(data.getIntExtra("userId", -1));

            selectStore();
        } else {
            finish();
        }
        break;
    case Settings.SCREEN_PRODUCT: // Coming back from the product selection screen
        if (resultCode == RESULT_OK) {
            ShowActivity(ActionActivity.class, Settings.SCREEN_ACTION);
        } else if (resultCode == RESULT_CANCELED){
            ShowActivity(OptionsActivity.class, Settings.SCREEN_OPTIONS);
        }
        break;
    case Settings.SCREEN_ACTION: // Coming back from the action screen, regardless of result, show options screen.
        ShowActivity(OptionsActivity.class, Settings.SCREEN_OPTIONS);
        break;
    case Settings.SCREEN_OPTIONS: // All choices return result_ok.  Check the "mode" extra
        String mode = data.getStringExtra("mode");
        processOption(mode);
        break;
    case Settings.SCREEN_SESSION:
        if (resultCode == RESULT_CANCELED) {
            ShowActivity(OptionsActivity.class, Settings.SCREEN_OPTIONS);
        } else if (resultCode == RESULT_OK ){
            ShowActivity(ActionActivity.class, Settings.SCREEN_ACTION);
        }
        break;
    } // switch (requestCode)
} // protected void onActivityResult(int requestCode, int resultCode, Intent data) {

private void processOption(String mode) {
    if (mode.equals("select")) {
        ShowActivity(ProductActivity.class, Settings.SCREEN_PRODUCT);
    } else if (mode.equals("repeat")) {
        Settings.CurrentReport.repeatItem();
        ShowActivity(ActionActivity.class, Settings.SCREEN_ACTION);
    } else if (mode.equals("session")) {
        ShowActivity(SessionActivity.class, Settings.SCREEN_SESSION);
    } else { // mode equals "end"
        confirmFinish();
    }
}

private void ShowActivity(Class cls, int requestCode) {
    Intent activity = new Intent(this, cls);
    startActivityForResult(activity, requestCode);
}

次に、finish() イベントを処理する他のアクティビティの 1 つからのコード:


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setContentView(R.layout.options);

    Button btn;

    btn = (Button)findViewById(R.id.btnSelect);
    btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = getIntent();
            intent.putExtra("mode", "select");
            setResult(RESULT_OK, intent);
            finish();
        }
    });

    btn = (Button)findViewById(R.id.btnRepeat);
    btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = getIntent();
            intent.putExtra("mode", "repeat");
            setResult(RESULT_OK, intent);
            finish();
        }
    });
    btn.setEnabled(Settings.CurrentReport.hasPreviousItem());

    btn = (Button)findViewById(R.id.btnSession);
    btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = getIntent();
            intent.putExtra("mode", "session");
            setResult(RESULT_OK, intent);
            finish();
        }
    });

    btn = (Button)findViewById(R.id.btnEnd);
    btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = getIntent();
            intent.putExtra("mode", "end");
            setResult(RESULT_OK, intent);
            finish();
        }
    });

}

public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
            Intent i = getIntent();
            i.putExtra("mode", "end");
            setResult(RESULT_OK, i);
            finish();
            break;

    }
    return super.onKeyDown(keyCode, event);
}
4

1 に答える 1

0

推測ですがIntent intent = getIntent();、問題を引き起こしている可能性があります。あなたはそれを置き換えることができますIntent intent = new Intent();

getIntent() は、現在のアクティビティを開始したインテントを返します。結果として使用しないでください。

于 2012-11-13T14:01:28.693 に答える