調用startActivityForResult,onActivityResult無響應的問題

三種狀況:ide

1、執行startActivityForResult,沒等到被調用的 Activity 返回,onActivityResult() 就被執行了。測試

這與 Activity 的加載模式(launchMode)有關,該屬性能夠在 AndroidManifest.xml 中設置。this

 原先將其設爲 singleInstance,經測試,全部須要傳遞或接收的 Activity 不容許設置該屬性,或只能設爲標準模式,不然系統將在 startActivityForResult() 後直接調用 onActivityResult()。.net

 

Note that this method should only be used with Intent protocolsdebug

      * that are defined to return a result.  In other protocols (such as調試

      * {@link  Intent#ACTION_MAIN} or {@link  Intent#ACTION_VIEW}), you maycode

      * not get the result when you expect.  For example, if the activity youxml

      * are launching uses the singleTask launch mode, it will not run in your接口

      * task and thus you will immediately receive a cancel result.get

 

2、兩個activity傳遞數據和返回數據時,請求方的onActivityResult始終無響應,經過debug調試模式也沒見調用該方法。查看了 各類配置和程序代碼,均未發現有錯誤之處。後來仔細閱讀API說明,恍然大悟,原來是調用startActivityForResult的參數問題,即調 用時這樣:

startActivityForResult(intent, 0);

 是第二個參數的問題,該參數必須大於0才能在返回值,並激活onActivityResult方法。

 我最開始是用的一個activity默認的常量:RESULT_OK,跟蹤了代碼後發現,該常量的值爲-1,固然無法激活 onActivityResult方法了,隨後隨便修改成一個大於0的整數,程序即通跑成功。

 startActivityForResult(intent, 1); //這樣就好了

API描述:

 @requestCode If >= 0, this code will be returned in  onActivityResult() when the activity exits.


3、在TabHost的子Activity中startActivityForResult調用其餘Activity時候遭遇到onActivityResult方法不響應的問題.

能夠經過調用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.

舉個列子,有兩個ActivityA和B,A中執行startActivityForResult(1,new Intent(A,B.class));

即由A調到B,再B執行setResult後執行getCallingActivity(),顯示A。

解決辦法以下:

1.經過父Activity啓動其餘Activity;

2.實現父Activity的onActivityResult方法,將該處接收到的請求轉發給當前活動的子Activity;

3.自定義一個轉發接口用來實現第2步中的轉發功能;

4.子Activity中實現第3步接口中的方法用來接收返回信息;

代碼以下:

經過父Activity啓動其餘Activity

1 getParent().startActivityForResult(new Intent(...), REQUEST_CODE); 

2.實現父Activity的onActivityResult方法

@Override

     protected void onActivityResult(int requestCode, int resultCode, Intent data) {

         // 獲取當前活動的Activity實例

         Activity subActivity = getLocalActivityManager().getCurrentActivity();

         //判斷是否實現返回值接口

         if (subActivity instanceof OnTabActivityResultListe) {

             //獲取返回值接口實例

             OnTabActivityResultListe listener = (OnTabActivityResultListe) 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須要實現onTabActivityResult方法

 @Override

    public void onTabActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {

            //實現該處邏輯

         ...

        }

    }

 以上第三中方法一樣適用於ViewPager

總結:凡是Activity自己含有上次父類的狀況都不能直接使用startActivityForResult,而要經過getParent(),經過父類調用此方法。

相關文章
相關標籤/搜索