簡體   English   中英

Android startActivityForResult和onActivityResult具有不可預測的行為

[英]Android startActivityForResult and onActivityResult has unpredictable behaviours

我有一個應用程序,其中以一定順序顯示多個活動,這些活動可以根據當前活動中的事件進行更改。 我有一個“主”活動,可以管理顯示的活動。 每個atiti都以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()事件的活動之一的代碼:


@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);
}

我只是在猜測,但也許Intent intent = getIntent(); 造成了問題。 您可以嘗試將其替換為Intent intent = new Intent();

getIntent()返回啟動當前活動的意圖,因此不應用作結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM