A. android的handler機制的原理
Android的handler機制的原理分為非同步通信准備,消息發送,消息循環,消息處理。
1、非同步通信准備
在主線程中創建處理器對象(Looper)、消息隊列對象(Message Queue)和Handler對象。
2、消息入隊
工作線程通過Handler發送消息(Message) 到消息隊列(Message Queue)中。
3、消息循環
消息出隊: Looper循環取出消息隊列(Message Queue) 中的的消息(Message)。
消息分發: Looper將取出的消息 (Message) 發送給創建該消息的處理者(Handler)。
4、消息處理
處理者(Handler) 接收處理器(Looper) 發送過來的消息(Message),根據消息(Message) 進行U操作。
handler的作用
handler是android線程之間的消息機制,主要的作用是將一個任務切換到指定的線程中去執行,(准確的說是切換到構成handler的looper所在的線程中去出處理)android系統中的一個例子就是主線程中的所有操作都是通過主線程中的handler去處理的。
Handler的運行需要底層的 messagequeue和 looper做支撐。
B. 怎麼利用android的Handler和message機制實現view中發送消息來實現view頁面跳轉
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what == 0){
//界面跳轉代碼。。。。。
}
};
};
view 的事件 {
.....
Message msg = new Message();
msg.what = 0; (值隨意定義,和handlemessage 匹配就可以)
msg.obj = "";//(傳遞的參數, 可不加)
handler.sendMessage(msg);
}
C. Android 非同步消息處理機制的幾種實現
public class Calcul { public static void main(String[] args) { circularArea(); } public static void circularArea(){ int r=2; float π=3.14f; float circularArea = π*r*r; System.out.println(circularArea); }
D. 請簡述什麼是android事件處理,並分析兩種android事件處理機制的實現過程和區別
UI編程通常都會伴隨事件處理,Android也不例外,它提供了兩種方式的事件處理:基於回調的事件處理和基於監聽器的事件處理。
對於基於監聽器的事件處理而言,主要就是為Android界面組件綁定特定的事件監聽器;對於基於回調的事件處理而言,主要做法是重寫Android組件特定的回調函數,Android大部分界面組件都提供了事件響應的回調函數,我們主要重寫它們就行。
一 基於監聽器的事件處理
相比於基於回調的事件處理,這是更具「面向對象」性質的事件處理方式。在監聽器模型中,主要涉及三類對象:
1)事件源Event Source:產生事件的來源,通常是各種組件,如按鈕,窗口等。
2)事件Event:事件封裝了界面組件上發生的特定事件的具體信息,如果監聽器需要獲取界面組件上所發生事件的相關信息,一般通過事件Event對象來傳遞。
3)事件監聽器Event Listener:負責監聽事件源發生的事件,並對不同的事件做相應的處理。
基於監聽器的事件處理機制是一種委派式Delegation的事件處理方式,事件源將整個事件委託給事件監聽器,由監聽器對事件進行響應處理。這種處理方式將事件源和事件監聽器分離,有利於提供程序的可維護性。
舉例:
View類中的OnLongClickListener監聽器定義如下:(不需要傳遞事件)
[java] view plainprint?
public interface OnLongClickListener {
boolean onLongClick(View v);
}
public interface OnLongClickListener {
boolean onLongClick(View v);
}
View類中的OnLongClickListener監聽器定義如下:(需要傳遞事件MotionEvent)
[java] view plainprint?
public interface OnTouchListener {
boolean onTouch(View v, MotionEvent event);
}
public interface OnTouchListener {
boolean onTouch(View v, MotionEvent event);
}
二 基於回調的事件處理
相比基於監聽器的事件處理模型,基於回調的事件處理模型要簡單些,該模型中,事件源和事件監聽器是合一的,也就是說沒有獨立的事件監聽器存在。當用戶在GUI組件上觸發某事件時,由該組件自身特定的函數負責處理該事件。通常通過重寫Override組件類的事件處理函數實現事件的處理。
舉例:
View類實現了KeyEvent.Callback介面中的一系列回調函數,因此,基於回調的事件處理機制通過自定義View來實現,自定義View時重寫這些事件處理方法即可。
[java] view plainprint?
public interface Callback {
// 幾乎所有基於回調的事件處理函數都會返回一個boolean類型值,該返回值用於
// 標識該處理函數是否能完全處理該事件
// 返回true,表明該函數已完全處理該事件,該事件不會傳播出去
// 返回false,表明該函數未完全處理該事件,該事件會傳播出去
boolean onKeyDown(int keyCode, KeyEvent event);
boolean onKeyLongPress(int keyCode, KeyEvent event);
boolean onKeyUp(int keyCode, KeyEvent event);
boolean onKeyMultiple(int keyCode, int count, KeyEvent event);
}
public interface Callback {
// 幾乎所有基於回調的事件處理函數都會返回一個boolean類型值,該返回值用於
// 標識該處理函數是否能完全處理該事件
// 返回true,表明該函數已完全處理該事件,該事件不會傳播出去
// 返回false,表明該函數未完全處理該事件,該事件會傳播出去
boolean onKeyDown(int keyCode, KeyEvent event);
boolean onKeyLongPress(int keyCode, KeyEvent event);
boolean onKeyUp(int keyCode, KeyEvent event);
boolean onKeyMultiple(int keyCode, int count, KeyEvent event);
}
三 比對
基於監聽器的事件模型符合單一職責原則,事件源和事件監聽器分開實現;
Android的事件處理機制保證基於監聽器的事件處理會優先於基於回調的事件處理被觸發;
某些特定情況下,基於回調的事件處理機制會更好的提高程序的內聚性。
四 基於自定義監聽器的事件處理流程
在實際項目開發中,我們經常需要自定義監聽器來實現自定義業務流程的處理,而且一般都不是基於GUI界面作為事件源的。這里以常見的app自動更新為例進行說明,在自動更新過程中,會存在兩個狀態:下載中和下載完成,而我們的程序需要在這兩個狀態做不同的事情,「下載中」需要在UI界面上實時顯示軟體包下載的進度,「下載完成」後,取消進度條的顯示。這里進行一個模擬,重點在說明自定義監聽器的事件處理流程。
4.1)定義事件監聽器如下:
E. Android QQ消息實時接收機制
QQ的消息推送就是後台開啟一個推送服務,這個服務會常駐內存,並且會不定時的發送心跳包來保持連接,像tcp傳輸一樣,傳輸的協議qq用的是XMPP協議,基於XML解析的。主要是加了些消息檢驗、出錯機制等,如果像自己了解推送的詳細內容,可以去看看A...
F. android 狀態欄接收通知,然後點擊通知進入app,這個機制是怎麼做到
1.添加軟體部分推送程序(模塊)到系統服務
2.推送模塊常駐系統後台,只能把整個應用完全停止才會沒有,這也是有的安卓機很卡的原因,應用裡面自己寫,也可以通過其他軟體鏈式喚醒
3.平台統一推送服務,好比小米ov那個啥
4.點擊進入的那個應用,多數是廠商作了專門適配的,進入特定頁面,但這個也是可以通過代碼實現的
G. Android中消息推送有哪幾種方式
Android中消息推送有如下幾種方式:H. 安卓 View層 和 Activity層 消息傳遞機制和焦點問題
其實是activity派送出來的事件,不是無人知曉。而是這種問題不容易弄出一個關鍵字來搜索。
一個activity的touch事件先由activity的dispatchtouchevent來處理,負責派送。
dispatchtouchevent把ACTION_DOWN事件首先交給view,然後view返回false再傳遞回activity的onTouchEvent中處理。
具體的部分代碼如下:
if(ev.getAction()==MotionEvent.ACTION_DOWN){
onUserInteraction();
}
如果用戶需要這個ACTION_DOWN,應該在自身的onTouchEvent中對 ACTION_DOWN採取return true的響應,表示這個ACTION_DOWN歸我了。只有在dispatchtouchevent為ACTION_DOWN事件找到一個歸屬,也即是target之後,後面的ACTION_MOVE和ACTION_UP才會對這個target傳送。
如果你這個頁面就僅僅有一個這樣需要捕捉事件的view,你是可以直接在dispatchtouchevent中直接傳送給這個view然後return true的。
I. Android中輪詢機制是怎麼用的
這里使用service。
後台service進行定時的輪詢,如果有新消息,獲取後推送給自己的頁面。