Android显式意图结果

时间:2013-08-01 16:17:03

标签: android android-intent explicit onactivityresult

我有两个独立的应用程序。应用程序A和应用程序B.我想从应用程序A开始应用程序B中的活动并返回结果。我可以使用Action在A中调用应用程序B中的活动但是在完成活动后无法返回到应用程序A.永远不会调用A中的OnActivityResult。以下是代码。

public void onClickBtnToApplicationB(View v) {
        try {
            final Intent intent = new Intent(Intent.ACTION_MAIN, null);
            final ComponentName cn = new ComponentName("pakacagename","package.class");
            intent.setComponent(cn);
            intent.setAction(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);

            startActivityForResult(intent, REQUEST_CODE);
        } catch (ActivityNotFoundException e) {
        //handle Exception
        } 
    }

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        switch (requestCode) {
            case REQUEST_CODE:
               handleResult(resultCode, intent);
               break;
        }
    }

    public void handleResult(int resultCode, Intent intentResult) {
        switch (resultCode) {
            case RESULT_OK:
                String Result = intentResult.getStringExtra("RESULT");
                // I need Results from Application B here..
                break;

             case RESULT_CANCELED:
                break;
        }
      }

申请表B:

Intent s = new Intent(1.this,2.class);
startActivityForResult(s, REQUEST_CODE_B);
protected void onActivityResult(int requestCode, int resultCode, Intent intentResult) {     
    switch(requestCode){
        case REQUEST_CODE_B:
            handleResult(resultCode, intentResult);
    }
}

public void handleResult(int resultCode, Intent intentResult) {
    switch (resultCode) {
    case RESULT_OK:
        String scanResult = intentResult.getStringExtra("RESULT");
        Intent newintent = new Intent();
        newintent.putExtra("RESULT", scanResult);
        setResult(Activity.RESULT_OK, newintent);
        finish();
        break;

    case RESULT_CANCELED:
        break;
}

1 个答案:

答案 0 :(得分:1)

也许我错过了什么。应用程序A似乎在应用程序B中为结果启动一个活动并实现onActivityResult。你构建Intent发送方式有一些问题,但让我们暂时忽略它。

据我所知,你发送的意图的形式并不重要,因为应用程序B从不看它。接收活动应该调用getIntent()。根据传入的ACTION,它设置一个结果代码并返回Intent,调用setResult(),然后调用finish()。你的代码没有这样做;相反,看起来你正试图通过调用startActivityForResult()来启动应用程序A.

我明白为什么你可能尝试过这个,但顺序应该是:

  1. 活动A想要启动活动B(无论活动B的应用程序如何)。
  2. 活动A构造与活动B匹配的意图 X
  3. 活动A调用startActivityForResult( X )。
  4. 活动B出现在前台。
  5. Activity B中的onResume()方法调用getIntent()。这确保了活动B可以查看Intent X ,即使B已经在运行。
  6. 活动B执行活动A请求的操作。
  7. 完成后,活动B将其结果放入Intent Y
  8. 活动B调用setResult(result_code, Y );
  9. 活动B调用finish(),将结果发送回活动A.
  10. 触发Activity中的onActivityResult()方法。
  11. 结果Intent Y 不是由startActivityForResult发送的;相反,它是由setResult()和finish()的组合发送的。