0

2 つのスタンドアロン アプリケーションがあります。アプリケーション A とアプリケーション B。アプリケーション A からアプリケーション B のアクティビティを開始し、結果を取得したいと考えています。アクションを使用して 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;
}
4

1 に答える 1

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. アクティビティ B のメソッド onResume() が getIntent() を呼び出します。これにより、アクティビティ Bが既に実行されている場合でも、アクティビティ B はインテントXを見ることができます。
  6. アクティビティ B は、アクティビティ A によって要求されたアクションを実行します。
  7. 完了すると、Activity B はその結果を Intent Yに入れます。
  8. アクティビティ B は setResult(result_code, Y );を呼び出します。
  9. アクティビティ B が finish() を呼び出し、結果がアクティビティ A に返されます。
  10. Activity のメソッド onActivityResult() がトリガーされます。

結果 Intent Yは startActivityForResult によって送信されません。代わりに、setResult() と finish() の組み合わせによって送信されます。

于 2013-08-01T20:30:07.200 に答える