startActivity ForResultを呼び出し、onActivity Resultが応答しない解決策

4097 ワード

3つのケース:
 
1、startActivity ForResultを実行し、呼び出されたActivityが戻るまで待たずにonActivity Result()が実行されます.長い間探していたが、これはActivityのロードモード(launchMode)と関係があり、AndroidManifestで使用できることが分かった.xmlで設定します.以前はsingleInstanceとして設定していましたが、転送または受信が必要なすべてのActivityでは設定できません.または、標準モードに設定するしかありません.そうしないと、startActivity ForResult()の後にonActivity Result()が直接呼び出されます.
Note that this method should only be used with Intent protocols     * that are defined to return a result.  In other protocols (such as     * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may     * not get the result when you expect.  For example, if the activity you     * are launching uses the singleTask launch mode, it will not run in your     * task and thus you will immediately receive a cancel result.
 
2、2つのactivityがデータを転送し、データを返すと、リクエスト側のonActivity Resultは常に応答せず、debugデバッグモードでも呼び出されません.さまざまな構成とプログラムコードが表示され、エラーは見つかりませんでした.その後、APIの説明をよく読むと、startActivity ForResultを呼び出すパラメータの問題だった.つまり、呼び出すときはこうだった.startActivity ForResult(intent,0);値を返し、onActivity Resultメソッドをアクティブにするには、2番目のパラメータの問題です.私が最初に使ったactivityのデフォルト定数:RESULT_OK、コードを追跡したところ、この定数の値は-1で、もちろんonActivity Resultメソッドをアクティブにすることはできません.その後、0より大きい整数に勝手に変更すると、プログラムは成功します.startActivityForResult(intent, 1);//これでいい
API説明:@requestCode If>=0,this code will be returned in onActivity Result()when the activity exits.
3、TabHostのサブActivityでstartActivity ForResultが他のActivityを呼び出すときにonActivity Resultメソッドが応答しないという問題に遭遇する.
ActivityのgetCallingActivity()を呼び出すことで、データを受け入れるActivityを表示できます.
APIは次のように説明しています.
Return the name of the activity that invoked this activity.  This is     * who the data in {@link #setResult setResult()} will be sent to.
列を挙げると、2つのActivity AとBがあり、AにはstartActivity ForResult(1,new Intent(A,B.class))が実行されます.
AからBへ、BからsetResultを実行してgetCallingActivity()を実行し、Aを表示します.
 
解決策は次のとおりです.
1.親Activityで他のActivityを起動する.
2.親ActivityのonActivity Resultメソッドを実装し、そこで受信したリクエストを現在アクティブな子Activityに転送する.
3.転送インタフェースをカスタマイズして、第2ステップの転送機能を実現する.
4.サブActivityにおける第3ステップインタフェースを実装する方法は、戻り情報を受信するために使用される.
コードは次のとおりです.
1.親Activityによる他のActivityの起動
getParent().startActivityForResult(new Intent(...), REQUEST_CODE);

 
2.親Activityを実現するonActivity Resultメソッド
@Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         //  Activity 
         Activity subActivity = getLocalActivityManager().getCurrentActivity();
         // 
         if (subActivity instanceof OnTabActivityResultListe<wbr>ner) {
             // 
             OnTabActivityResultListe<wbr>ner listener = (OnTabActivityResultListe<wbr>ner) subActivity;
             // Activity
             listener.onTabActivityResult(requestCode, resultCode, data);
         }
         super.onActivityResult(requestCode, resultCode, data);
     }

 
3.カスタムインタフェース
public interface OnTabActivityResultListener {
public void onTabActivityResult(int requestCode, int resultCode, Intent data);
}

 
4.サブActivityはonTabActivity Resultメソッドを実装する必要がある
@Override
public void onTabActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
// 
        ...
}
}

 
まとめ:Activity自体に前回の親が含まれている場合はstartActivity ForResultを直接使用することはできませんが、getParent()を使用して親からこのメソッドを呼び出します.