startActivityForResult的问题

时间:2012-10-29 10:57:51

标签: android android-activity

我使用Theme.Holo.Dialog编写了一个活动,因此它可以作为AlertDialog作为登录/密码通知。我使用我定义的请求代码使用startActivityForResult(...)启动了此活动。问题是,每当我开始活动onActivityResult(...)被立即触发时,按钮就被加载了所有东西,但是一旦我按下它们,即使我知道活动正在运行,因为登录确实发生了,没有结果发回到第一个Activity,我按下按钮后调用setResult(...)finish()。 提前谢谢,第一次使用startActivityForResult,所以我肯定我一定会遗漏一些东西。

主要活动:

.
.
.
   Intent startDialogIntent = new Intent(this,SetIdDialogAlertActivity.class);
   startDialogIntent.setAction(getString(R.string.ACTION_START_ALERT_DIALOG_ACTIVITY));
   startDialogIntent.putExtra(getString(R.string.parcelable_status));
   IntentParcelable.configurationToParcelable(configuration, getBaseContext()));
   startActivityForResult(startDialogIntent,getResources().getInteger(R.integer.CREATE_USER));

.
.
.

public void onActivityResult(int requestCode, int resultCode,Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        Toast.makeText(getBaseContext(),"returned from activity with request code " + requestCode + " and result code " + resultCode, Toast.LENGTH_SHORT).show();
        if(requestCode == getResources().getInteger(R.integer.CREATE_USER))
            switch (resultCode){
                case RESULT_NEW_USER:
                    Toast.makeText(getBaseContext(),getString(R.string.SU_CorrectPassword_message), Toast.LENGTH_SHORT).show();
                    refreshLabels(data);
                    break;
                case RESULT_WRONG_PASSWORD:
                    Toast.makeText(getBaseContext(),getString(R.string.SU_WrongPassword_message), Toast.LENGTH_SHORT).show();
                    break;
            }
    }

然后关于子活动:

public void onCreate(Bundle savedInstanceState){
        Logger.d(Messages.tag,System.nanoTime() + "_DIALOG_ALERT:_ON_CREATED");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.user_id_alertdialog);
        Logger.d(Messages.tag,System.nanoTime() + "_DIALOG_ALERT:_VIEW_INFLATED");

        SU_passwordEditText = (EditText)findViewById(R.id.SU_passwordEditText);
        Button okAlarmButton = (Button)findViewById(R.id.okAlarmButton);
        Button cancelAlarmButton = (Button)findViewById(R.id.cancelAlarmButton);

        Logger.d(Messages.tag,System.nanoTime() + "_DIALOG_ALERT:_OK_BUTTON_LOADED");
        okAlarmButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                Logger.d(Messages.tag,System.nanoTime() + "_DIALOG_ALERT:_OK_BUTTON_PRESSED");  
                String password = SU_passwordEditText.getText().toString();
                if(password.equals(getString(R.string.SU_password))){
                    Toast.makeText(getBaseContext(),getString(R.string.SU_CorrectPassword_message), Toast.LENGTH_SHORT).show();
                    userIdEditText = (EditText)findViewById(R.id.userIdEditText);
                    String newUserName = userIdEditText.getText().toString();
                    Logger.d(Messages.tag,System.nanoTime() + "_DIALOG_ALERT:_USERNAME_" + newUserName);                
                    Configuration configuration = IntentParcelable.parcelableToConfiguration((IntentParcelable)getIntent().getParcelableExtra(getString(R.string.parcelable_status))
                            , getBaseContext());
                    configuration.setId(newUserName);
                    Intent setUserIntent = new Intent();
                    setUserIntent.setAction(getString(R.string.ACTION_ACTIVITY_NEW_ID));
                    setUserIntent.putExtra(getString(R.string.INTENT_EXTRA_SENDER_NAME),"DIALOG_ACTIVITY");
                    setUserIntent.putExtra(getString(R.string.INTENT_EXTRA_NEW_CONFIG), IntentParcelable.configurationToParcelable(configuration, getBaseContext()));
                    exitActivity(RESULT_NEW_USER,setUserIntent);
                }else{
                    Toast.makeText(getBaseContext(),getString(R.string.SU_WrongPassword_message), Toast.LENGTH_SHORT).show();
                    exitActivity(RESULT_WRONG_PASSWORD);
                }
            }
        });

private void exitActivity(int exit_code, Intent data) {
    setResult(exit_code,data);
    finish();
}

private void exitActivity(int exit_code) {
    setResult(exit_code);
    finish();
}

对于发布代码的延迟表示歉意。

[UPDATE]

我已经尝试了所有我能想到的东西,而且子活动仍然表现得很奇怪。我认为这是因为父母的onActivityResult(...)触发而突然完成。它没有完成,因为它仍然在堆栈顶部,我可以看到它,并且它确实有效,因为我在Button中实现的任何内容都已完成。但是当它再次完成 时,它不会触发前一个onActivityResult(...)方法。

[UPDATE]

必须遗漏某些东西。我刚刚创建了一个全新的Activity,为了测试的缘故,除了创建自己,将结果设置为4并完成之外什么都不做。我在清单上声明它:

        <activity 
            android:name=".ActivityTest"
            android:screenOrientation="portrait"
            android:process=":gui_process"
            android:exported="false">
        </activity>

然后就这样开始了:

            Intent startDialogIntent = new Intent(this,ActivityTest.class);
            startActivityForResult(startDialogIntent,getResources().getInteger(R.integer.CREATE_USER));

在我的onActivityResult(...)上定义了一个新的案例陈述,它的行为与原始活动一样。

1 个答案:

答案 0 :(得分:0)

我在另一个thread中发现了这个问题。显然,为其启动模式定义具有singleInstance的活动会导致子活动在启动后立即将结果报告给父活动。我将父活动的启动模式恢复为标准,现在一切正常。在开发者指南中应该有一些国王的注释。