使用React-Navigation并且有多個ReactActivity交互遇到的問題

問題來源

1.我們的項目中用到了React-Navigation來處理路由默终,其中用的又是StackNavigation绢涡。
2.使用的是ActivityA橫屏承載ReactNative的js頁面猩谊,并且對Android的虛擬按鍵進行了統(tǒng)一處理
3.最近突然有一個需求尺碰,需要再搞一個ActivityB承載一個單頁面的豎屏視圖

問題暴露

上面的需求實現(xiàn)起來很簡單
1.定義一個ActivityB

public class ActivityB extends ReactActivity {
    @Override
    protected String getMainComponentName() {
        return "ActivityB";
    }

    @Override
    protected ReactActivityDelegate createReactActivityDelegate() {
        return new ReactActivityDelegate(this, getMainComponentName()) {
            @Override
            protected ReactRootView createRootView() {
                //處理手勢四啰,也可以不用實現(xiàn)這個
                return new RNGestureHandlerEnabledRootView(ActivityB.this);
            }

            @Nullable
            @Override
            protected Bundle getLaunchOptions() {
                Intent intent = getIntent();
                String flag="";
                Bundle bundle = new Bundle();
                if (intent.hasExtra("flag")){
                    flag = intent.getStringExtra("flag");
                    bundle.putString("flag",flag);
                }

                return bundle;
            }
        };
    }
}

2.在清單文件中聲明

<activity android:name=".ActivityB"
            android:screenOrientation="portrait"/>

3.實現(xiàn)橋接方法讓ReactNative調(diào)用,并且添加到package中记餐,最終注冊在Application中

public IntentModule(@NonNull ReactApplicationContext reactContext) {
       super(reactContext);

       reactContext.addActivityEventListener(new ActivityEventListener() {
           @Override
           public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
               if (requestCode==110&&resultCode==111){
                   if (data!=null){
                       WritableMap map = Arguments.createMap();
                       if (data.hasExtra("data")) {
                           String datas = data.getStringExtra("data");
                           map.putString("data",datas);
                       }

                       if (data.hasExtra("uri")) {
                           String uri = data.getStringExtra("uri");
                           map.putString("uri",uri);
                       }
                       reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                               .emit("ActivityB", map);
                   }
               }
           }

           @Override
           public void onNewIntent(Intent intent) {

           }
       });
   }

   @NonNull
   @Override
   public String getName() {
       return "IntentModule";
   }


   @ReactMethod
   public void jumpCameraActivityForResult(ReadableMap map){
       String flag = "";
      if (map.hasKey("flag")){
          flag = map.getString("flag");
      }

       Intent intent = new Intent(getCurrentActivity(), ActivityB.class);

      if (!TextUtils.isEmpty(flag)){
          intent.putExtra("flag",flag);
      }

      Objects.requireNonNull(getCurrentActivity()).startActivityForResult(intent,CAMERA_REQUEST_CODE);
   }

   @ReactMethod
   public void finish(ReadableMap map){
       String data="";
       if (map.hasKey("data")){
           data = map.getString("data");
       }

       String uri="";
       if (map.hasKey("uri")){
           uri=map.getString("uri");
       }
       Intent intent=new Intent();
       if (!TextUtils.isEmpty(data)) {
           intent.putExtra("data", data);
       }
       if (!TextUtils.isEmpty(uri)) {
           intent.putExtra("uri", uri);
       }
       Objects.requireNonNull(getCurrentActivity()).setResult(ACTIVITY_RESULT_CODE,intent);
       getCurrentActivity().finish();
   }

4.直接在首頁中點擊進入的二級頁面中加入跳轉驮樊,并且點擊返回
最終會發(fā)現(xiàn)除了ActivityB返回了,二級頁面也不在了。囚衔。挖腰。。练湿。猴仑。。

分析問題

1.首先在跳轉ActivityB之前我打印了路由棧中的所有路由
2.在ActivityB退出之后我又打印了路由棧中的所有路由
經(jīng)過對比確實發(fā)現(xiàn)二級頁面不見了(不在棧中了)

3.我在路由的pop肥哎,rest等頁面分別打了日志辽俗,發(fā)現(xiàn)并沒有被調(diào)用
排除了方法誤調(diào)導致的問題

4.去github的issuse里面去看看有沒有別人遇到過這個問題
5.百度(無果)
查了一圈發(fā)現(xiàn)沒有人提到這個問題(得嘞,還得自己排查)

6.我后來就琢磨是不是把ActivityB的虛擬返回去掉篡诽,并且ActivityB顯示全屏是不是可以解決這個問題
嘗試后發(fā)現(xiàn)果然可以崖飘。。霞捡。

7.那沒毛病坐漏,肯定是ReactNative的返回處理和原生的返回處理都被執(zhí)行了,導致不僅ActivityB退出了碧信,ReactNative中的二級頁面也退出了
8.去看看ReactActivity是如何處理返回的赊琳,果不其然發(fā)現(xiàn)優(yōu)先處理ReactNative內(nèi)部的返回

  @Override
  public void onBackPressed() {
    if (!mDelegate.onBackPressed()) {
      super.onBackPressed();
    }
  }

到這里就簡單了我不讓他走ReactNative內(nèi)部的返回不就行了,返回false給他


到這里本次的問題就圓滿解決了砰碴。
附上ActivityB的整體源碼

public class ActivityB extends ReactActivity {

    @Override
    protected String getMainComponentName() {
        return "ActivityB";
    }

    @Override
    protected ReactActivityDelegate createReactActivityDelegate() {
        return new ReactActivityDelegate(this, getMainComponentName()) {

            @Override
            public boolean onBackPressed() {
                return false;
            }

            @Nullable
            @Override
            protected Bundle getLaunchOptions() {
                Intent intent = getIntent();
                String flag="";
                Bundle bundle = new Bundle();
                if (intent.hasExtra("flag")){
                    flag = intent.getStringExtra("flag");
                    bundle.putString("flag",flag);
                }

                return bundle;
            }
        };
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躏筏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呈枉,更是在濱河造成了極大的恐慌趁尼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猖辫,死亡現(xiàn)場離奇詭異酥泞,居然都是意外死亡,警方通過查閱死者的電腦和手機啃憎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門芝囤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辛萍,你說我怎么就攤上這事悯姊。” “怎么了贩毕?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵悯许,是天一觀的道長。 經(jīng)常有香客問我辉阶,道長先壕,這世上最難降的妖魔是什么瘩扼? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮启上,結果婚禮上邢隧,老公的妹妹穿的比我還像新娘店印。我一直安慰自己冈在,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布按摘。 她就那樣靜靜地躺著包券,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炫贤。 梳的紋絲不亂的頭發(fā)上溅固,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音兰珍,去河邊找鬼侍郭。 笑死,一個胖子當著我的面吹牛掠河,可吹牛的內(nèi)容都是我干的亮元。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼唠摹,長吁一口氣:“原來是場噩夢啊……” “哼爆捞!你這毒婦竟也來了?” 一聲冷哼從身側響起勾拉,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤煮甥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后藕赞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體成肘,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年斧蜕,在試婚紗的時候發(fā)現(xiàn)自己被綠了双霍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡惩激,死狀恐怖店煞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情风钻,我是刑警寧澤顷蟀,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站骡技,受9級特大地震影響鸣个,放射性物質(zhì)發(fā)生泄漏羞反。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一囤萤、第九天 我趴在偏房一處隱蔽的房頂上張望昼窗。 院中可真熱鬧,春花似錦涛舍、人聲如沸澄惊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掸驱。三九已至,卻和暖如春没佑,著一層夾襖步出監(jiān)牢的瞬間毕贼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工蛤奢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鬼癣,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓啤贩,卻偏偏與公主長得像待秃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瓜晤,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345