雖然startactivity正常了,但是這不是要啟動的activity,豈不是做了無用功。然而事情往往沒那麼簡單,既然系統服務那關已經過了,我們得自己做點事情了。activity的建立及生命週期都是在自己程序中完成的,所以activitythread這個類似乎可以幫我們做事情。
注意到activitythread中mh完成了activity的建立和生命週期的事件處理,所以我們只需要在mh處理事件前,把殼activity又替換為要啟動的activity不就可以了。所以這又涉及到訊息攔截了,我們來看下handlemessage如何攔截:
public
void
dispatchmessage(message msg) else
}handlemessage(msg);
}}
正常情況mcallback為null,我們只需要設定乙個mcallback就可以攔截訊息,把msg中intent取出來替換為新的intent,接著交給handlemessage繼續處理就可以了。如下:
public void invokeactivitythread() catch (classnotfoundexception e) catch (nosuchmethodexception e) catch (illegalacces***ception e) catch (invocationtargetexception e) catch (nosuchfieldexception e)
}private handler.callback mcallback = new handler.callback()
} catch (classnotfoundexception e) catch (illegalacces***ception e) catch (nosuchfieldexception e)
}return false;
}};
由於我們只是替換了intent中的component內容,系統照樣會幫助我們完成activity的生命週期,到這裡有些大功告成的感覺,但是一執行,馬上就是資源報錯,宿主可不知道還有外掛程式的資源存在。 Android實現免安裝APK外掛程式(四)
在獲取資源時,有三個重要的類resources,assetmanager,theme,我們通過context獲取它們的物件 override public assetmanager getassets override public resources getresources override p...
Android實現免安裝外掛程式 二
在啟動activity中出現activitynotfoundexception有兩種可能,一種是該activity的應用未安裝,一種是該activity未在androidmanifest中申明。在外掛程式化中,屬於情況一。所以在startactivity中需啟動activity實際是系統中不能找到的...
android中跳轉安裝apk
在android中跳轉安裝apk 需要先新增許可權 在跳轉的過程中分為三種情況 android版本低於等於6.0 intent intent new intent intent.action view intent.setflags intent.flag activity new task sta...