最近在用 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的源碼,再配合上網上有一些零星的解決方案,才搞定。因此呢,看源碼仍是很能解決問題的~