WEEX 使用navigator跳轉Android系統出現ActivityNotFoundException報錯

最近在用 WEEX 作移動項目,出如今使用 navigator 的時候報ActivityNotFoundException 的錯誤,在網上沒有找到很準確的答案,因此記錄下來。java

問題

  • 在使用 weex 的 navigator 模塊進行頁面跳轉的時候出現 ActivityNotFoundException 的異常android

  • 若是安裝了 weex 的 Playground APP,那麼就會跳轉到 Playground 中去顯示 navigator 指向的頁面。git

navigator跳轉:github

navigator.push({
  url: ServeAddress + Bundle,
  animated: 'true'
}, event => {
  modal.toast({ message: '頁面跳轉' })
})

緣由

查閱了一些資料後,忽然明白了它的工做原理。apache

navigator 的跳轉是一個 Android 的 startActivity 的過程,所打開的 Activity 就是寫有攔截器的 Activity 。而攔截器是跨應用的,因此咱們在使用 navigator 模塊跳轉的時候會跳轉到 Playground 的 Activity 中去!並且當一個手機中有多個帶有相同攔截器的 Activity 的時候,Android 系統還會讓咱們去選擇進入到哪一個 Activity 中。
所謂的攔截器就是將一段標籤代碼放到 AndroidManifest 的 <activity> 標籤下。下面是 Playground 的AndroidManifest中攔截器的寫法。:weex

<activity
  android:name=".WXPageActivity"
  android:label="@string/app_name"
  android:screenOrientation="portrait"
  android:theme="@style/AppTheme.NoActionBar">
  <intent-filter>
    <action android:name="com.taobao.android.intent.action.WEEX"/>

    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="com.taobao.android.intent.category.WEEX"/>
    <action android:name="android.intent.action.VIEW"/>

    <data android:scheme="http"/>
    <data android:scheme="https"/>
    <data android:scheme="file"/>
    <data android:scheme="wxpage" />
  </intent-filter>
</activity>

解決方案

參照 Playground,建立一個帶有攔截器的 Activity。
好比 ActivityA 是用來渲染當前 weex 頁面的,在 weex 頁面中使用 navigator 來作頁面跳轉,若是你在 ActivityA 中添加攔截器,那麼 navigator 會再打開一個 ActivityA,這就是有些網友說的爲何老是打開重複的頁面的緣由。app

<activity
  android:name=".ActivityA">
  <intent-filter>
    <action android:name="com.taobao.android.intent.action.WEEX" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="com.taobao.android.intent.category.WEEX" />

    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="http" />
    <data android:scheme="https" />
    <data android:scheme="file" />
    <data android:scheme="wxpage" />
  </intent-filter>
</activity>

第一種方法:ActivityA 的攔截器不變,繼續跳轉到 ActivityA 頁面。可是在 ActivityA 中去獲取 Intent 數據,看看是否爲 navigator 跳轉過來的頁面,若是是則加載不一樣頁面。navigator 的跳轉 url 獲取方式爲 getIntent().getData().toString();url

String RenderPageUrl = SharedPreferencesUtil.getSP(context, Ips.KEY, "ERROR");
LogUtil.e(RenderPageUrl);
if (getIntent().getData() != null) {
  String navUrl = getIntent().getData().toString();
  if (null != navUrl) {
    LogUtil.e(navUrl);
    RenderPageUrl = navUrl;
  } else {
    LogUtil.e("a is null");
  }
} else {
  LogUtil.e("get data is null");
}
Map<String, Object> options = new HashMap<>();
options.put(WXSDKInstance.BUNDLE_URL, RenderPageUrl);
mWXSDKInstance.renderByUrl("WXSample", RenderPageUrl, options, null, WXRenderStrategy.APPEND_ONCE);

方法二:新建一個ActivityB,專門用來顯示navigator跳轉的頁面。頁面功能爲經過Intent獲取url,而後進行渲染。
經過Intent方法與方法一相同。
渲染頁面的Activity的寫法能夠參照這裏code

呃……其實兩個方法是一回事啦。只不過我不喜歡多寫一個Activity來承載新頁面~因此會選擇第一個方法。xml

一開始找不到問題解決方案還挺絕望的,後來想一想Playground能夠實現,因而就去看了看Playground的源碼,再配合上網上有一些零星的解決方案,才搞定。因此呢,看源碼仍是很能解決問題的~

相關文章
相關標籤/搜索