




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】Android中容易忽略的知識
四大組件相關:1.啟動一個Activity,在應用進程至少需要兩個Binder線程。2.啟動一個launchMode為singleTask的Activity,它并不一定會運行在新的Activity棧中。3.兩個不同應用的Activity,可以運行在同一個Activity棧中。4.同一個應用進程中的所有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.可以通過設置Activity主題android.R.style.Theme_NoDisplay,來啟動一個不顯示的Activity,在某些需要過渡的地方很實用。7.Activity、Service、Receiver在沒有配置intent-filter的action屬性時,exported默認為false,配置了intent-filter的action屬性時,exported默認為true。稍有不慎,很可能埋下越權、Intent等安全隱患。8.當從最近使用應用列表中移除某個App時,四大組件只有Service擁有神奇的onTaskRemoved回調,但是并不一定回調,還與stopWithTask屬性等有關。9.四大組件都運行在主線程,是因為它們在ActityThread中(或Instrumentation)實例化;它們的生命周期也運行在主線程,是因為通過ActivityThread.H將消息從Binder線程發(fā)送到主線程,然后執(zhí)行回調。10.TaskStackBuilder的出現(xiàn)基本上解決了所有構造Activity回退棧的問題。11.ContentProvider的onCreate()方法先于Application的onCreate()方法執(zhí)行,晚于Application的attachBaseContext()方法,所以在ContentProvider的onCreate()時候也是有辦法彈出一個AlertDialog的(參考5)。12.BroadCastReceiver回調onReceive(Contextcontext,Intentintent)中的context類型各種場景相差很大,靜態(tài)注冊的receiver回調的Context都是ReceiverRestrictedContext,動態(tài)注冊的receiver有可能是Activity或Application。13.ServiceRecord和BroadcastRecord自身就是Binder。14.同一個provider組件名,可能對應多個provider。1.MessageQueue.addIdleHandler可以用來在線程空閑的時候,完成某些操作,比較適合那種需要在將來執(zhí)行操作,卻又不知道需要指定多少延遲時間的操作。2.Message.what盡量不要設置成0,因為postRunnable的方式會生成Message.what為0的消息,如果刪除了what為0的Message,也會將runnable方式創(chuàng)建的Message刪掉。3.Handler可以設置同步異步(默認是同步的),他們的區(qū)別在于異步不會被Barrier阻塞,而同步會被阻塞。4.Handler的消息分發(fā)流程是如果Message的callback不為空,通過callback處理,如果Handler的mCallback不為空,通過mCallback來處理,如果前兩個都為空,才調用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級只能開不能關,View級只能關不能開。2.自android2.3刪除MidWindow后,PhoneWindow成了Window的唯一實現(xiàn)類。3.WMS管理Window的過程中涉及4個Binder,應用進程只有ViewRootImpl.W一個Binder服務端。4.MotionEvent、KeyEvent、DragEvent等具有相似的鏈式緩存,類似Message。5.在View的狀態(tài)保存、恢復過程中,ActionBar中所有View共享一個SparseArray容器,ContentView中所有View共享一個SparseArray容器。當前獲取焦點的View會額外存儲。6.設置ViewTreeObserver的系列監(jiān)聽方法需要確保View在attachToWindow之后,否則可能因為add監(jiān)聽和remove監(jiān)聽不是作用于同一個對象而引起內存泄漏等。1.可以通過文件鎖來實現(xiàn)進程間互斥(參考:RePlugin),在處理某些只需要單進程執(zhí)行的任務時很實用。2.Binder設計架構中,只有Binder主線程是由本進程主動創(chuàng)建,Binder普通線程都是由Binder驅動根據(jù)IPC通信需求被動創(chuàng)建。3.oneway與非oneway,都需要等待BinderDriver的回應消息(BR_TRANSACTION_COMPLETE),區(qū)別在于oneway不用等待BR_REPLY消息。4.mediaserver和servicemanager的主線程都是binde
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年寵物營養(yǎng)職業(yè)教育現(xiàn)狀試題及答案
- KPI設定與績效管理試題及答案
- 二手車評估中的文化差異分析試題及答案
- 汽車系統(tǒng)故障排除的三步法則試題及答案
- 心血管患者的心理護理
- 室內設計風格試題及答案
- 漢語言文學小自考考點分析與試題答案
- 2024年小自考公共管理考試特色試題及答案
- 美容師考試考生近期動態(tài)解讀試題及答案
- 護理成果改善報告
- 兒童發(fā)展問題的咨詢與輔導-案例1-5-國開-參考資料
- DG-TJ 08-2336-2020 綠道建設技術標準
- 安全生產(chǎn)法律法規(guī)匯編(2025版)
- 2024年晉中職業(yè)技術學院高職單招(英語/數(shù)學/語文)筆試歷年參考題庫含答案解析
- 論十大關系全文
- 員工食堂5月份菜譜
- 中國、俄羅斯、歐美電子管型號代換
- 基于語音信號去噪處理的FIR濾波器設計
- 會見筆錄(故意傷害審查起訴階段)
- 排污監(jiān)理實施細則
- 專業(yè)技術職務任職資格評審表模板
評論
0/150
提交評論