導航:首頁 > 操作系統 > android監聽事件處理

android監聽事件處理

發布時間:2025-05-02 02:52:11

『壹』 在android中怎樣給整個頁面設置監聽事件

您可以類似這樣,先實例化子頁面中的Button控制項,然後將實例化後的控制項綁定監聽事件 View view=LayoutInflater.from(context).inflate(R.layout.abc_action_bar_view_list_nav_layout,null); Button button= (Button) view.findViewById(R.id.action_bar); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //寫上點擊後要執行的事件 } }); 當然了,您要在不同頁面實現不同的功能的話,您可以將以上代碼寫在viewPager.setOnPageChangeListener的滾動回調方法當中進行頁面滾動的判斷,從而執行不同的點擊事件。希望能幫到您,如果還有什麼問題,歡迎您繼續追問。謝謝。

『貳』 android程序如何監聽到自己被卸載這個事件。

手段略曲折

首先給你的程序注冊讀取log許可權,

<uses-permissionandroid:name="android.permission.READ_LOGS"/>

然後在你的程序里開一個後台線程,不停的讀取log,當你的應用(包括其他任何應用)被卸載時,系統的ActivityManager會列印出一行log,大概是removing:你的包名。這個時機是在卸載界面點擊確定後的一瞬間觸發的,如下圖


但是不能保證用戶就會點確定真把你的卸載了。。所以自己權衡吧。

這是我在網上找到的唯一方法

代碼如下:

privatevoidListenLog(){

Threadt=newThread(newRunnable(){

publicvoidrun(){

//TODOAuto-generatedmethodstub

Log.v("Fuck","Startlisteninglog");

String[]cmds={"logcat","-c"};

StringshellCmd="logcat";

Processprocess=null;

InputStreamis=null;

DataInputStreamdis=null;

Stringline="";

Runtimeruntime=Runtime.getRuntime();

try{

intwaitValue;

waitValue=runtime.exec(cmds).waitFor();

process=runtime.exec(shellCmd);

is=process.getInputStream();

dis=newDataInputStream(is);

while((line=dis.readLine())!=null&&mKeepListenFlag){

if(!line.contains("Fuck")){

Log.v("Fuck",line);

//這里只是把每個log都列印了一遍,可以再此判斷line里是否有removing字樣,然後做些處理

}

}

Log.v("Fuck","finishedlisten");

}catch(InterruptedExceptione){

e.printStackTrace();

}catch(IOExceptionie){

ie.printStackTrace();

}finally{

try{

if(dis!=null){

dis.close();

}

if(is!=null){

is.close();

}

if(process!=null){

process.destroy();

}

}catch(Exceptione){

e.printStackTrace();

}

}

}

});

//mKeepListenFlag是個成員變數,是為了讓程序結束時終止線程的,否則可能產生程序多次啟動,然後這個線程就啟動了多個。Android線程可不會因為Activity的退出而終止。

mKeepListenFlag=true;

t.start();

}

『叄』 Framework事件機制——手撕Android事件處理的三種方法

Android的事件處理的三種方法:

setOnClickListener,setOnLongClickListener、setOnTouchListener

注意:如果onTouchEvent方法return true,則單擊事件和長摁事件不再執行;若onLongClick方法返回true,則單擊事件不再處理。

需要定義繼承組件的類,重寫回調方法Touch方法執行時,先被Activity捕獲,DispatchTouchEvent方法處理。return false,交給上層的onTouchEvent方法處理;return super.dispatchTouchEvent(ev),則傳遞給最外層的View。

View用Dispatch方法處理,return false,由上層的onTouchEvent方法處理。如果返回super.dispatchTouchEvent(ev),則本層的onInterceptTouchEvent攔截,如果攔截true,則攔截,false不攔截,傳遞給子View的DispatchTouchEvent處理。

常用的回調方法:onKeyDown,onKeyLongPress,onKeyUp,onTouchEvent,onTrackballEvent(軌跡球事件)監聽和回調同時存在時,先調用監聽。

流程模型圖:

Event source 事件源
Event 事件
Event Listener 事件監聽器
下面我們來看一下點擊事件和觸摸事件的監聽三要素具體是那部分:

由於點擊事件比較簡單,系統已經幫我們處理了,並沒有找到具體事件是哪個。

View.OnClickListener 單擊事件監聽器必須實現的接⼝
View.OnCreateContextMenuListener 創建上下⽂菜單事件
View.OnFocusChangeListener 焦點改變事件
View.OnKeyListener 按鍵事件監聽器
View.OnLongClickListener 長按事件監聽器
View.OnTouchListener 觸摸屏事件監聽器

⾸先,事件監聽機制中由事件源,事件,事件監聽器三類對象組成。
事件監聽器處理流程:

在此以OnClickListener單擊事件為例使用intent來實現頁面的跳轉

監聽事件處理是事件源與事件監聽器分開的而基於回調的事件處理UI組件不但是事件源,而且還是事件監聽器,通過組件的相關回調方法處理對應的事件。

Ⅰ. 自定義View類,繼承自需要的View UI類。ex :自定義 MyButton按鈕類 extends 基礎Button類

Ⅱ. 復寫回調函數。ex:public boolean onTouchEvent(MotionEvent event)

每一個事件回調方法都會返回一個boolean值,①.如果返回true:表示該事件已被處理,不再繼續向外擴散,②.如果返回false:表示事件繼續向外擴散

而說到基於回調就離不開監聽機制

幾乎所有基於回調的事件處理方法都有一個boolean類型的返回值,該返回值用於表示該處理方法是否能完全處理該事件。
如果處理事件的回調方法返回true,表明該處理方法已經完全處理改事件,該事件不會傳播出去。
如果處理事件的回調方法返回false,表明該處理方法並未完全處理該事件,該事件會傳播出去。
對於基於回調的時間傳播而言,某組件上所發生的事件不僅會激發該組件上的回調方法,也會觸發該組件所在Activity的回調方法——只要事件能傳播到該Activity。

這里是在模擬器里進行的測試,這里按下鍵盤(而不是點擊),會看到 logcat 中的輸出,如下:

View類實現了KeyEvent.Callback介面中的一系列回調函數,因此,基於回調的事件處理機制通過自定義View來實現,自定義View時重寫這些事件處理方法即可。

Handler是一個消息分發對象。

Handler是Android系統提供的一套用來更新UI的機制,也是一套消息處理機制,可以通過Handler發消息,也可以通過Handler處理消息。

在下面介紹Handler機制前,首先得了解以下幾個概念:

在子線程執行完耗時操作,當Handler發送消息時,將會調用 MessageQueue.enqueueMessage ,向消息隊列中添加消息。 當通過 Looper.loop 開啟循環後,會不斷地從消息池中讀取消息,即調用 MessageQueue.next , 然後調用目標Handler(即發送該消息的Handler)的 dispatchMessage 方法傳遞消息, 然後返回到Handler所在線程,目標Handler收到消息,調用 handleMessage 方法,接收消息,處理消息。

從上面可以看出,在子線程中創建Handler之前,要調用 Looper.prepare() 方法,Handler創建後,還要調用 Looper.loop() 方法。而前面我們在主線程創建Handler卻不要這兩個步驟,因為系統幫我們做了。

初始化Looper

從上可以看出,不能重復創建Looper,每個線程只能創建一個。創建Looper,並保存在 ThreadLocal 。其中ThreadLocal是線程本地存儲區(Thread Local Storage,簡稱TLS),每個線程都有自己的私有的本地存儲區域,不同線程之間彼此不能訪問對方的TLS區域。

開啟Looper

發送消息

post方法:

send方法:

在子線程中,進行耗時操作,執行完操作後,發送消息,通知主線程更新UI。

本文講解了三個方面;Android事件機制;基於監聽、基於回調以及Handler消息處理。還有許多沒有講解到的知識點,我總結在了整理的一套Android進階筆記裡面;需要學習進階的同學可以前往獲取: Frame Work源碼解析手冊 、 Android核心技術進階手冊、實戰筆記、面試題綱資料

閱讀全文

與android監聽事件處理相關的資料

熱點內容
解壓小熊手機殼 瀏覽:342
成都市區建成面積演算法 瀏覽:658
智能家居單片機 瀏覽:95
買男裝用什麼app好 瀏覽:853
文件夾合並了怎麼拆開 瀏覽:257
波段副圖源碼無未來函數 瀏覽:86
livecn伺服器地址 瀏覽:257
程序員這個工作真的很吃香嗎 瀏覽:844
程序員和數學分析師待遇 瀏覽:678
壓縮氣彈簧怎麼拆 瀏覽:321
華為公有雲伺服器添加虛擬ip 瀏覽:209
程序員和運營哪個累 瀏覽:24
抖音安卓信息提示音怎麼設置 瀏覽:454
光速虛擬機的共享文件夾 瀏覽:248
程序員培訓機構發的朋友圈真實性 瀏覽:742
天乾地支簡單演算法 瀏覽:299
下載個壓縮文件 瀏覽:300
普通人電腦關機vs程序員關機 瀏覽:628
米酷建站源碼 瀏覽:115
氫氣app怎麼搜搭配 瀏覽:619