顯示具有 BroadcastReceiver 標籤的文章。 顯示所有文章
顯示具有 BroadcastReceiver 標籤的文章。 顯示所有文章

2015年5月15日 星期五

[Android] BroadcastReceiver - 開機就執行(RECEIVE_BOOT_COMPLETED)

有些時候,我們會希望某些程式或Service,隨時都在使用者的背景執行,

可是又不能要求使用者在每次重開機後就叫他去開我們的App,

此時就可以利用BroadcastReceiver來達成我們要的需求。

假設你對BroadcastReceiver還不太熟悉的話,可以參考上一篇文章來了解基本的運作方式

[Android] BroadcastReceiver - 廣播接收器

當設備重開機完成後,作業系統會發一個廣播說我已經重開囉

我們只要透過BroadcastReceiver來接收這則廣播,就可以達到我們要的效果。

首先先在AndroidManifest.xml加入這行

此時如果你去查看你應用程式的資訊,會多一個權限











如此一來就可以接收剛才提到的系統廣播。

BroadcastReceiver必須透過字串來辨識是哪則廣播,而重開機完成的字串是這個

android.intent.action.BOOT_COMPLETED

因此我們只要創建一個BroadcastReceiver,監聽到這則廣播,就可以了。

監聽到的時候,可以執行Activity,或Service。

如果你要啟動一個Activity,別忘了加入這行喔。
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
當然別忘了在你的AndroidManifest.xml註冊這個Receiver

如此一來,你就學會如何一開機就讓使用者執行一個程式了。

2015年5月14日 星期四

[Android] BroadcastReceiver - 廣播接收器

BroadcastReceiver 是一個相當常用的類別,它可以用來監聽廣播,並做一些事情。

如果你是熟悉Objective-C的開發者,這東西跟NSNotificationCenter有幾分相似。

大致說明一下如何使用這個類別。

我們可以先創建一個類別,並且繼承BroadcastReceiver這個類別,實作它要我們做的方法。

當有人發送廣播給這個BroadcastReceiver時,就會觸發onReceive方法。

別忘了在AndroidManifest.xml加入這個receiver。

<receiver android:name=".MyBroadcastReceiver"></receiver>

下一步,你必須把這個receiver註冊到背景之中。

此時你有兩種選擇。

第一種,在程式片段裡面註冊。

這種的好處是,你可以在特定的頁面裡面在註冊(register)接收器,而且可以註銷(unregister)你的接收器。

這個程式碼說明了如何註冊及發送廣播,在註銷這個接收器前,它會一直存在背景,

因此你可以在任意的頁面使用sendBroadcast()來發送廣播,在onReceive就會收到。

假如你背景有多個接收器(Receive),它們都會一起收到這個廣播,因此我們可以利用剛才設定的辨識字串來做判斷。

我們將MyBroadcastReceiver稍作修改。

當便是字串相符時,在來做一些事情。

也許這個廣播器我只想要在特定的頁面才會監聽,那我不要的時候只要輸入這個即可註銷。

第二種,在AndroidManifest.xml裡面註冊。

這種做法的好處是它會長時間在背景監聽,但是不能被註銷(unregister),只要安裝這個App就會一直在背景做監聽的動作。

程式碼片段就不需要registerReceiver了,而發送廣播一樣是使用sendBroadcast(),不過若是使用這種方法則不能使用unregisterReceiver來註銷。

簡單的說流程就是,註冊Receive並且設定辨識字串,發送廣播(Broadcast),最後接收器會收到廣播(onReceive),並執行你想做的事情。

有一點要特別注意,onReceive的生命週期大約只有十秒,超過會產生ANR,因此不要在這邊做太複雜的事情,可以啟動一個Service後,靠Service去執行一些較花時間的動作。

關於ANR可以參考官方的說明

http://developer.android.com/training/articles/perf-anr.html

裡面有提到

A BroadcastReceiver hasn't finished executing within 10 seconds.

請多加注意

繼續閱讀

一開機就執行某隻程式 - 使用BroadcastReceiver