查看完整版本: 關於Android推播服務
頁: [1]

RainieYang 發表於 2018-11-22 05:12 PM

關於Android推播服務

安安,小弟想問一下關於FCM(Firebase Cloud Message)的推送服務。

事情是這樣,小弟目前寫的專案,會用到自己架的Server當中繼站,去接收某個手機(假設叫A)發出來的命令,然後經過Server處理後再去通知 "另一台手機"(假設叫B)去做事。

然後小弟目前的寫法,B那端要能順利收到通知,必須有一個Service保持存活,才能收到通知。
那個Server不能被殺掉,所以我把它設成Foreground Service,但好像還是無法在所有手機都保持他能永久存活。

聽說還有FCM推播服務可以用,那小弟想問的就是這個FCM的相關特性,主要問題有下面幾點:
1.FCM服務要能順利收到通知,是否需要自己寫的App保持存活?  (如果是的話就沒意義了,畢竟就是怕被殺才想換FCM)
2.FCM收到通知後,能否在那個時機點讓她幫我啟動我的APP?  還是真的單純就是只能顯示一個推播通知?
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

jackyo04 發表於 2018-11-23 08:23 AM

如果能儲存用戶的手機號碼,可以透過GCM來通知(不知道還有沒有...),FCM基本上是要你後台存在才行,所以你要透過一些方法,讓你的程式屬於系統程式,就可以讓它被殺掉後,還會自行產生..通常這種東西,是我很不願意做的,除非客戶要求,因為要了解各廠手機的設定{:40:}

mountainboy 發表於 2018-11-23 09:32 AM

FCM 是估狗的雲端簡訊系統(Firebase 是一家搞雲端簡訊的公司,2014被估狗併購)。
1.FCM服務要能順利收到通知,是否需要自己寫的App保持存活?  (如果是的話就沒意義了,畢竟就是怕被殺才想換FCM)->只要你寫的App成Service(不管前景或背景Service),都會接收到簡訊。如果是前景,你只要將程序寫在onMessageReceived()的方法即可。當收到FCM時,onMessageReceived()會先被呼叫執行。

2.FCM收到通知後,能否在那個時機點讓她幫我啟動我的APP?  還是真的單純就是只能顯示一個推播通知? 同上設計一個前景的service,你只要將啟動程序寫在onMessageReceived()的方法中就好了。

你原來自己架的Server也可以工作,只是有免費的估狗FCM 伺服器可用,不用自己架!Android 保證20秒內,簡訊會被顯示。而且,每則最大可到4K的資料。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

RainieYang 發表於 2018-12-1 12:54 PM

mountainboy 發表於 2018-11-23 09:32 AM static/image/common/back.gif
FCM 是估狗的雲端簡訊系統(Firebase 是一家搞雲端簡訊的公司,2014被估狗併購)。
1.FCM服務要能順利收 ...

感謝 但這麼說的話 是否app需要活著? 不能被系統殺掉?


mountainboy 發表於 2018-12-1 09:39 PM

RainieYang 發表於 2018-12-1 12:54 PM static/image/common/back.gif
感謝 但這麼說的話 是否app需要活著? 不能被系統殺掉?

Andriod 系統不會殺掉你的App!如果你開App後,按Home,那個App會跳到背景執行。
但FCM在前景和背景傳送略有不同。背景時,FCM會由System Tray 接收及通知。如果使用者按通知,系統開啟前景,所以你只要在onMessageReceived()處理訊息即可。背景轉前景時,你還要去讀在intent 的extras的訊息。先這樣去測試看看再說! ...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

RainieYang 發表於 2018-12-2 07:35 AM

mountainboy 發表於 2018-12-1 09:39 PM static/image/common/back.gif
Andriod 系統不會殺掉你的App!如果你開App後,按Home,那個App會跳到背景執行。
但FCM在前景和背景傳送 ...

嗯 但之前寫app測試的時候,  service是可能被殺的,不同手機行為不同,有的能活久一點,但很難撐過7天,有些手機甚至3天就掛了,不是crash 也不是anr(沒有跳出crash or anr訊息 ),但總之app看來是被終止了,重點會全部重啟,目前似乎很難保證app長時間絕對不被系統殺掉,所以才有所謂的雙進程保活手段,或是有些開發者甚至考慮把app弄成系統層級吧?(但需root )...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

mountainboy 發表於 2018-12-2 08:46 AM

Android 其實是跑Linux核心,所以應該從 process 的管理著手。
首先確定系統可跑20個背景程式,在系統設定中開發者模式有。如果都沒有動過,預設值為20。也就是跑第21個背景程式,其中一個會被殺掉。
再來,就是在你的服務程式裡,蓋掉 onStartCommand() 並傳回  START_STICKY。這樣可以告訴系統,如果記憶體容量不夠時,可以殺掉,但在記憶體足夠時,必須自動重啓回復。
最後一招,用AlarmManager來重啟你的服務程式。例如每隔60秒,確認你的服務程式有在執行。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

codewice 發表於 2018-12-11 11:20 PM

RainieYang 發表於 2018-12-2 07:35 AM static/image/common/back.gif
嗯 但之前寫app測試的時候,  service是可能被殺的,不同手機行為不同,有的能活久一點,但很難撐過7天, ...

Android 系統的設計,每個 App 都有機會被砍掉,包括裡面的 Activity 跟 Service,因為 Android 砍 app 的時候是從 Linux kernel 的角度切入,針對某一個 process 去砍,而 Activity/Service 都跑在 process 之下。

理論上在設計 Android app 的架構時,就要假設自己的 Activity / Service 隨時會被砍掉,在這個前提下去設計架構與流程。

甚至在 Developer options 裡面就有一個「Don't keep activity」的選項,讓開發者隨時模擬記憶體不足而被砍掉的情況,確保自己開發的產品不會在這一點上出大問題。

幾年前看的心得,但是很久沒看原始碼了所以不清楚有沒有大的變動,還請熟悉這塊的網友糾正。基本上系統會針對每個 process 去排定優先權,記憶體不夠的時候從優先權最低的開始砍。一般來說 foreground activity (使用者正在看的畫面) 有最高的優先權,其次差不多是 foreground service, launcher, background activity/service,順序可能有誤,但原則是 1) 看得見得最重要 2) 系統的 app 次之 3) launcher 次之 4) 除此之外看不見的 app 最不重要。記憶體不足的時候就從優先權低的開始砍起。

有時候一個 app 開久了,按 Home 鍵跳回去桌面,看到一堆圖示重新跳出來,多半就是 Launcher 剛剛被砍掉了。

中國那邊滿多在研究「保活」的人,所以中國的程式很多為了「做到最好的用戶體驗」,每個都死不願意被系統砍掉。Android 官方也一直努力在改進這一塊,我覺得這應該會是貓捉老鼠的遊戲,一邊拼命想打死,一邊拼命想活下來。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

codewice 發表於 2018-12-11 11:20 PM

本帖最後由 codewice 於 2018-12-11 11:22 PM 編輯

(不小心 reload,竟然重複張貼了文章。找不到刪除鈕,所以把文章內容修掉)

codewice 發表於 2018-12-11 11:20 PM

本帖最後由 codewice 於 2018-12-11 11:23 PM 編輯

(不小心 reload,竟然重複張貼了文章。找不到刪除鈕,所以把文章內容修掉)<br><br><br><br><br><div></div>

sheauren 發表於 2018-12-20 03:57 PM

用FCM推android app有data段與notification段兩段資料
notification段會在手機上面那排banner跳提示
data段是直接送到app的fcm接收的service上
你只丟data段不要寫notificaiton的情況
手機收到fcm的時候,就算app停止執行狀態,會主動把你的app service啟動起來處理該message
不過記得servce當時可能沒有任何activity是可以使用的,只有context

hughor181 發表於 2018-12-21 11:35 AM

在部份中國手機如果不把應用設為能在背景運行很常會被殺掉service
頁: [1]