前言 Rxjava由于其基于事件流的鏈?zhǔn)秸{(diào)用、邏輯簡潔 & 使用簡單的特點(diǎn),深受各大 Android開發(fā)者的歡迎。本文主要: 面向 剛接觸Rxjava的初學(xué)者 提供了一份 清...
前言 Rxjava由于其基于事件流的鏈?zhǔn)秸{(diào)用、邏輯簡潔 & 使用簡單的特點(diǎn),深受各大 Android開發(fā)者的歡迎。本文主要: 面向 剛接觸Rxjava的初學(xué)者 提供了一份 清...
看樓主在文章里描述的context和Activity,Service還有Application的關(guān)系,就可以看出這里其實(shí)用了裝飾者模式。雖然它們都是Context的子類,但實(shí)際很多執(zhí)行邏輯都交給了ContextImpl,比如startActivity()這個(gè)函數(shù)。Activity自己實(shí)現(xiàn)了startActivity(),但Service和Application交由ContextImpl處理了。我們在看ContextImpl源碼中startActivity這個(gè)函數(shù):
public void startActivity(Intent intent, Bundle options) {
warnIfCallingFromSystemProcess();
if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
throw new AndroidRuntimeException(
"Calling startActivity() from outside of an Activity "
+ " context requires the FLAG_ACTIVITY_NEW_TASK flag."
+ " Is this really what you want?");
}
mMainThread.getInstrumentation().execStartActivity(
getOuterContext(), mMainThread.getApplicationThread(), null,
(Activity)null, intent, -1, options);
}
就明白了為什么要加這個(gè)Flag了。
Android面試一天一題(10 Day)有些東西,大家天天都能看到,但并不一定了解和在意它。在Android開發(fā)中,加載資源,啟動(dòng)一個(gè)新的Activity,獲取系統(tǒng)服務(wù),獲取數(shù)據(jù)庫路徑,創(chuàng)建一個(gè)View等都會(huì)使用到...
因?yàn)镠andler執(zhí)行的是異步任務(wù),當(dāng)一個(gè)Message還在MessageQueue中等待執(zhí)行的時(shí)候,有可能Activity已經(jīng)finish。所以整個(gè)內(nèi)存泄漏的關(guān)系鏈應(yīng)該是這樣的:
Message.mTarget指向Handler,而Handler又是一個(gè)非靜態(tài)內(nèi)部類,持有了當(dāng)前Activity實(shí)例。所以會(huì)引發(fā)暫時(shí)性的內(nèi)存泄漏,如果Message被執(zhí)行了就會(huì)釋放,這是Activity的內(nèi)存泄露也就解除了。
Android面試一天一題(8 Day)Android應(yīng)用程序是通過消息來驅(qū)動(dòng)的,系統(tǒng)為每一個(gè)應(yīng)用程序維護(hù)一個(gè)消息隊(duì)例(MessageQueue),應(yīng)用程序的主線程不斷地從這個(gè)消息隊(duì)例中獲取消息(Looper),然...
@SuperLino // How long we allow a receiver to run before giving up on it.
static final int BROADCAST_FG_TIMEOUT = 10*1000;
static final int BROADCAST_BG_TIMEOUT = 60*1000;
前臺(tái)進(jìn)程的廣播 ANR是10秒,后臺(tái)進(jìn)程是60秒。
可以看下ActivityManagerService源碼
Android面試一天一題(2 Day)面試題:用廣播來更新UI界面好嗎? 做為Android四大組件之一的,廣播被很多人所熟知,可算是一種非常方便的解耦組件的手段。常用的方式是直接調(diào)用Context的接口(sen...
Input系統(tǒng)會(huì)通過socket pair 跨進(jìn)程通知到ViewRootImpl中類型為WindowInputEventReceiver對象,WindowInputEventReceiver是ViewRootImpl的內(nèi)部類,繼承自InputEventReceiver。所以樓主說的從硬件到j(luò)ava層,事件最開始的應(yīng)該是進(jìn)入WindowInputEventReceiver中的dispatchInputEvent方法,接著會(huì)進(jìn)入onInputEvent方法,最后調(diào)用了ViewRootImpl的enqueueInputEvent方法。到這里就和樓主說的一致了。
ViewRootImpl源碼分析事件分發(fā)前面講到View與WindowManager與ViewRootImpl中只講到了ViewRootImpl是如何觸發(fā)View的繪制的,但ViewRootImpl的功能可不只是繪...