【移動應(yīng)用開發(fā)技術(shù)】Android中容易忽略的知識_第1頁
【移動應(yīng)用開發(fā)技術(shù)】Android中容易忽略的知識_第2頁
【移動應(yīng)用開發(fā)技術(shù)】Android中容易忽略的知識_第3頁
【移動應(yīng)用開發(fā)技術(shù)】Android中容易忽略的知識_第4頁
【移動應(yīng)用開發(fā)技術(shù)】Android中容易忽略的知識_第5頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】Android中容易忽略的知識

四大組件相關(guān):1.啟動一個Activity,在應(yīng)用進(jìn)程至少需要兩個Binder線程。2.啟動一個launchMode為singleTask的Activity,它并不一定會運行在新的Activity棧中。3.兩個不同應(yīng)用的Activity,可以運行在同一個Activity棧中。4.同一個應(yīng)用進(jìn)程中的所有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默認(rèn)為false,配置了intent-filter的action屬性時,exported默認(rèn)為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è)置同步異步(默認(rèn)是同步的),他們的區(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)用進(jìn)程只有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)進(jìn)程間互斥(參考:RePlugin),在處理某些只需要單進(jìn)程執(zhí)行的任務(wù)時很實用。2.Binder設(shè)計架構(gòu)中,只有Binder主線程是由本進(jìn)程主動創(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論