




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】Android中容易忽略的知識
四大組件相關(guān):1.啟動一個Activity,在應(yīng)用進程至少需要兩個Binder線程。2.啟動一個launchMode為singleTask的Activity,它并不一定會運行在新的Activity棧中。3.兩個不同應(yīng)用的Activity,可以運行在同一個Activity棧中。4.同一個應(yīng)用進程中的所有Activity,共享一個WindowSession。5.彈出一個AlertDialog,不一定需要Activity級別的Context,而且任何地方都有辦法彈出一個AlertDialog,只要是在Application的attachBaseContext之后。下面是一個簡單的demo演示:首先看DemoApplication,然后看Alert類:在Application中初始化:在Application中初始化:import
android.app.Application;public
class
DemoApplication
extends
Application
{
@Override
public
void
onCreate()
{
Alert.alertAnyWhere();
super.onCreate();
}}下面這個類是對AlertDialog的封裝類:下面這個類是對AlertDialog的封裝類:import
android.app.AlertDialog;import
android.content.Context;import
android.content.DialogInterface;import
android.os.Build;import
android.os.Handler;import
android.os.Looper;import
android.view.WindowManager;import
java.lang.reflect.Method;public
class
Alert
{
public
static
void
alertDialog()
{
Context
mAppContext
=
null;
try
{
Class<?>
clazz
=
Class.forName("android.app.ActivityThread");
Method
method
=
clazz.getDeclaredMethod("currentApplication",
new
Class[0]);
mAppContext
=
(Context)
method.invoke(null,
new
Object[0]);
}
catch
(Throwable
e)
{
e.printStackTrace();
return;
}
AlertDialog.Builder
builder
=
new
AlertDialog.Builder(mAppContext);
builder.setTitle("Hi")
.setMessage("Hello
World");
.setPositiveButton("確定",
new
DialogInterface.OnClickListener()
{
@Override
public
void
onClick(DialogInterface
dialog,
int
which)
{
dialog.dismiss();
}
})
.setNegativeButton("取消",
new
DialogInterface.OnClickListener()
{
@Override
public
void
onClick(DialogInterface
dialog,
int
which)
{
}
});
AlertDialog
dialog
=
builder.create();
if
(Build.VERSION.SDK_INT
>=
Build.VERSION_CODES.KITKAT)
{
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
}
else
{
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_PHONE);
}
dialog.show();
}
private
static
Handler
handler;
public
static
void
alertAnyWhere()
{
if
(Looper.myLooper()
==
Looper.getMainLooper())
{
alertDialog();
}
else
{
if
(handler
==
null)
{
handler
=
new
Handler(Looper.getMainLooper());
}
handler.post(new
Runnable()
{
@Override
public
void
run()
{
alertDialog();
}
});
}
}}6.可以通過設(shè)置Activity主題android.R.style.Theme_NoDisplay,來啟動一個不顯示的Activity,在某些需要過渡的地方很實用。7.Activity、Service、Receiver在沒有配置intent-filter的action屬性時,exported默認為false,配置了intent-filter的action屬性時,exported默認為true。稍有不慎,很可能埋下越權(quán)、Intent等安全隱患。8.當(dāng)從最近使用應(yīng)用列表中移除某個App時,四大組件只有Service擁有神奇的onTaskRemoved回調(diào),但是并不一定回調(diào),還與stopWithTask屬性等有關(guān)。9.四大組件都運行在主線程,是因為它們在ActityThread中(或Instrumentation)實例化;它們的生命周期也運行在主線程,是因為通過ActivityThread.H將消息從Binder線程發(fā)送到主線程,然后執(zhí)行回調(diào)。10.TaskStackBuilder的出現(xiàn)基本上解決了所有構(gòu)造Activity回退棧的問題。11.ContentProvider的onCreate()方法先于Application的onCreate()方法執(zhí)行,晚于Application的attachBaseContext()方法,所以在ContentProvider的onCreate()時候也是有辦法彈出一個AlertDialog的(參考5)。12.BroadCastReceiver回調(diào)onReceive(Contextcontext,Intentintent)中的context類型各種場景相差很大,靜態(tài)注冊的receiver回調(diào)的Context都是ReceiverRestrictedContext,動態(tài)注冊的receiver有可能是Activity或Application。13.ServiceRecord和BroadcastRecord自身就是Binder。14.同一個provider組件名,可能對應(yīng)多個provider。1.MessageQueue.addIdleHandler可以用來在線程空閑的時候,完成某些操作,比較適合那種需要在將來執(zhí)行操作,卻又不知道需要指定多少延遲時間的操作。2.Message.what盡量不要設(shè)置成0,因為postRunnable的方式會生成Message.what為0的消息,如果刪除了what為0的Message,也會將runnable方式創(chuàng)建的Message刪掉。3.Handler可以設(shè)置同步異步(默認是同步的),他們的區(qū)別在于異步不會被Barrier阻塞,而同步會被阻塞。4.Handler的消息分發(fā)流程是如果Message的callback不為空,通過callback處理,如果Handler的mCallback不為空,通過mCallback來處理,如果前兩個都為空,才調(diào)用handleMessage來處理。在DroidPlugin中,便是利用ActivityThread.H的這一特性,攔截了部分消息,實現(xiàn)Activity的插件化。5.Java層和Native層Looper、MessageQueue的創(chuàng)建時序,Java層Looper—>Java層MessageQueue—>Native層NativeMessageQueue—>Native層Looper。6.Java層通過Handler去發(fā)送消息,而Native層是通過Looper發(fā)消息。1.硬件加速在Window級只能開不能關(guān),View級只能關(guān)不能開。2.自android2.3刪除MidWindow后,PhoneWindow成了Window的唯一實現(xiàn)類。3.WMS管理Window的過程中涉及4個Binder,應(yīng)用進程只有ViewRootImpl.W一個Binder服務(wù)端。4.MotionEvent、KeyEvent、DragEvent等具有相似的鏈?zhǔn)骄彺?,類似Message。5.在View的狀態(tài)保存、恢復(fù)過程中,ActionBar中所有View共享一個SparseArray容器,ContentView中所有View共享一個SparseArray容器。當(dāng)前獲取焦點的View會額外存儲。6.設(shè)置ViewTreeObserver的系列監(jiān)聽方法需要確保View在attachToWindow之后,否則可能因為add監(jiān)聽和remove監(jiān)聽不是作用于同一個對象而引起內(nèi)存泄漏等。1.可以通過文件鎖來實現(xiàn)進程間互斥(參考:RePlugin),在處理某些只需要單進程執(zhí)行的任務(wù)時很實用。2.Binder設(shè)計架構(gòu)中,只有Binder主線程是由本進程主動創(chuàng)建,Binder普通線程都是由Binder驅(qū)動根據(jù)IPC通信需求被動創(chuàng)建。3.oneway與非oneway,都需要等待BinderDriver的回應(yīng)消息(BR_TRANSACTION_COMPLETE),區(qū)別在于oneway不用等待BR_REPLY消息。4.mediaserver和servicemanager的主線程都是binde
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 陜西省西安市新城區(qū)2024-2025學(xué)年八年級上學(xué)期期末生物學(xué)試題(含答案)
- 投資理財借款合同
- 城市公園建設(shè)與管理合作協(xié)議
- 教育培訓(xùn)領(lǐng)域在線教育平臺內(nèi)容優(yōu)化策略研究
- 客戶關(guān)系管理解決方案實施報告
- 農(nóng)業(yè)產(chǎn)業(yè)鏈延伸作業(yè)指導(dǎo)書
- 干砌擋土墻現(xiàn)場質(zhì)量檢驗報告單
- 國際貿(mào)易術(shù)語題庫
- 院感知識崗前培訓(xùn)
- 特色漁業(yè)資源經(jīng)營合同
- 品管圈PDCA案例-介入中心提高手術(shù)患者交接記錄書寫合格率醫(yī)院品質(zhì)管理成果匯報
- 第十七屆山東省職業(yè)院校技能大賽中職組“西式烹飪”賽項規(guī)程
- 華東師范大學(xué)《外國人文經(jīng)典(下)》2022-2023學(xué)年第一學(xué)期期末試卷
- 儲能電池模組PACK和系統(tǒng)集成項目可行性研究報告
- 2024年安徽省公務(wù)員錄用考試《行測》真題及解析
- 2024年陜西省中考數(shù)學(xué)試題含答案
- 牙慢性損傷-楔狀缺損
- JTJ034-2000 公路路面基層施工技術(shù)規(guī)范
- 2024-2030年中國光伏建筑一體化(BIPV)市場規(guī)模預(yù)測與競爭格局分析研究報告
- 零售業(yè)視覺營銷與商品展示技巧考核試卷
- 民營醫(yī)院并購合同范本
評論
0/150
提交評論