Android核心元件之廣播接收器與繫結服務

2021-10-16 02:02:38 字數 2687 閱讀 1959

以下內容**:

學習了活動與服務後,你會發現服務對於活動而言似乎就是透明的,相反活動對於服務也是透明的,所以我們還需要一中機制能夠將服務和活動之間架起一座橋梁,通過本節的學習,你將會學到廣播與繫結服務,這兩種方式恰恰是解決上面問題的關鍵。

實現乙個最簡單的廣播接收器需要繼承broadcastreceiver類

[activity(label = "broadcaststudy", mainlauncher = true, icon = "@drawable/icon")]

public class mainactivity : activity

protected override void onresume()

protected override void onpause()

}

註冊好了廣播接收器,我們還需要乙個能夠傳送廣播的地方,既然我們說了這節重點解決的是服務與活動的通訊,那麼我們就實現乙個服務來傳送廣播。為了能夠貼近現實,我們的服務中將會新建乙個執行緒,讓這個執行緒傳送乙個廣播給這個廣播接收器。

[service]

public class mainservice : service

).start();

return startcommandresult.sticky;

}public override ibinder onbind(intent intent)

}

這裡我們通過意圖傳遞了乙個引數,而在服務中傳送廣播的方法是sendbroadcast。其實我們可以看到在建立意圖的時候傳入了乙個字串,而這個字串必須與註冊廣播接收器時指定的字串一致,否則對應的廣播接收器是無法接收到這個廣播的,下面我們修改廣播接收器的onreceive方法,以便獲取傳遞過來的字串並顯示。

public override void onreceive(context context, intent intent)

);}

其中我們通過意圖的get***x方法獲取傳遞過來的引數,然後建立了乙個handler物件並使用toast傳送了乙個提示,這裡使用handler是為了與ui執行緒同步。因為前面講過只用ui執行緒才能夠訪問控制項等等物件,而這裡並沒有runonuithread方法,所以我們需要使用handler物件的post方法來實現。

最後有了服務還不行,我們還需要開啟這個服務。當然我們依然還是要在onresume中開啟,在onpause中暫停。

protected override void onresume()

protected override void onpause()

上面的例子我們僅僅只是打通了服務與廣播接收器的通訊,而我們今天的主題是服務與活動的雙向通訊,但是為了能夠循序漸進學習,所以我們先學習了服務與廣播接收器怎麼通訊,而這節我們將學習廣播接收器如何與活動通訊。

首先修改mainreceiver類:

public class mainreceiver : broadcastreceiver

}}

在這裡我們定義了乙個委託(actionalert)以便活動可以重寫,同時還修改了onreceive中的**,從而使用活動的方法來顯示提示,有了介面之後,我們就可以回到活動中進行重寫了。因為廣播被例項化的步驟是在onresume中,所以我們這裡直接給出這個方法中的**(這裡我們使用了乙個textview控制項tv讀者可以需要自行新增下)。

protected override void onresume());}

};registerreceiver(receiver, new intentfilter("xamarin-cn.main.receiver"));

startservice(new intent(this, typeof(mainservice)));

}

現在我們就打通了廣播接收器與活動的橋梁,如果有多個方法也是一樣的道理,我們現在執行程式可以發現一切正常,下面筆者還要介紹另一種使用介面的方法,首先我們需要乙個介面去規定活動需要實現哪些方法,然後在初始化廣播接收器的同時將活動的例項賦廣播接收器的對應介面變數。下面我們將上面的例子改寫,先定義個含有alert的介面。

public inte***ce imaininte***ce

然後讓活動實現該介面

public class mainactivity : activity, imaininte***ce

);}

接著我們修改廣播接收器,公開乙個該接收的屬性,一遍在廣播接收器被初始化的時候可以複製。

public class mainreceiver : broadcastreceiver

}}

回到mainactivity中修改onresume方法。

protected override void onresume()

;registerreceiver(receiver, new intentfilter("xamarin-cn.main.receiver"));

startservice(new intent(this, typeof(mainservice)));

}

最後效果一樣的,讀者可以根據實際的情況選擇。畢竟他們各自都有或多或少的缺點。

Android核心元件之活動

以下內容全部或部分 或參考於網路。這個方法是開啟活動後第乙個執行的事件,當然也是我們必須重寫的乙個方法,其中它大致負責如下的事情 l 建立檢視 l 初始化變數 l 將靜態變數繫結到列表 oncreate擁有乙個bundle型別的引數bundle,這個引數至關重要,因為我們知道應用的生命週期不歸自己管...

Android四大元件之廣播

有序廣播 普通廣播不能中斷,所有監聽這個廣播的都能收到資訊。有序廣播可以中斷。粘性廣播 粘性廣播要為了解決,在傳送廣播,在傳送廣播之後,動態註冊的接收者,也能收到廣播。生命週期 廣播收者的生命週期是非常短暫的,在接收到廣播的時候建立,onreceive 方法結構之後銷毀。開機啟動 android.i...

NGUI核心元件之UIAtlas

uiatlas是乙個容器,他包含了許多sprite的座標資訊。如果你對這個概念不是很熟悉,你可以這樣理解 與使用很多小的貼圖來渲染ui相比,使用一張包含了所有小貼圖的大貼圖的效率要高許多。這些小的貼圖就被叫做sprite,這個大的貼圖就被叫做atlas。在使用ngui渲染任何東西之前,首先需要建立乙...