Android APP切換到后台接收不到推送消息


1.   Android端進程被殺死后,目前自帶的保護后台接收消息活躍機制。暫時沒有什么好的機制保持任何情況下都活躍

android原生系統用home鍵殺進程可以起來,如果是強行停止就只能用戶自己手動開啟應用

如果是miui等第三方應用,殺了進程默認無法自啟動
如果是root過的原生系統,殺了進程也是沒有辦法起來的,這個時候推送是收不到的

 

如果是原生系統,沒有root,只要不是強行停止,其他系統自帶的停止方式都可以自啟動,一般10s內恢復


目前已知以下第三方系統會影響到應用:
小米【MIUI】
        自啟動管理:需要把應用加到【自啟動管理】列表,否則殺進程或重新開機后進程無法開啟
        通知欄設置:應用默認都是顯示通知欄通知,如果關閉,則收到通知也不會提示

    華為【Emotion】
        自啟動管理:需要把應用加到【自啟動管理】列表,否則殺進程或重新開機后進程不會開啟,只能手動開啟應用
        后台應用保護:需要手動把應用加到此列表,否則設備進入睡眠后會自動殺掉應用進程,只有手動開啟應用才能恢復運行
        通知管理:應用狀態有三種:提示、允許、禁止。禁止應用則通知欄不會有任何提醒

    魅族【Flyme】
        自啟動管理:需要把應用加到【自啟動管理】列表,否則殺進程或重新開機后進程發開啟
        通知欄推送:關閉應用通知則收到消息不會有任何展示

    VIVO【Funtouch OS】
        內存一鍵清理:需要將應用加入【白名單】列表,否則系統自帶的“一鍵加速”,會殺掉進程
        自啟動管理:需要將應用加入“i管家”中的【自啟動管理】列表,否則重啟手機后進程不會自啟。但強制手動殺進程,即使加了這個列表中,后續進程也無法自啟動。

    OPPO【ColorOS】
        凍結應用管理:需要將應用加入純凈后台,否則鎖屏狀態下無法及時收到消息

        自啟動管理:將應用加入【自啟動管理】列表的同時,還需要到設置-應用程序-正在運行里鎖定應用進程,否則殺進程或者開機后進程不會開啟,只能手動開啟應用

 

目前推送的保活機制基本上都是

一.依賴於系統廣播的接收調用

常用的有:1.鎖屏解鎖廣播2.網絡狀態改變廣播3.安裝包廣播,卸載包廣播4.存儲器掛載卸載廣播

android.intent.action.USER_PRESENT
android.net.conn.CONNECTIVITY_CHANGE
android.net.wifi.RSSI_CHANGED
android.net.wifi.STATE_CHANGE
android.net.wifi.WIFI_STATE_CHANGED

android.intent.action.MEDIA_UNMOUNTED
android.intent.action.MEDIA_REMOVED
android.intent.action.MEDIA_CHECKING
android.intent.action.MEDIA_EJECT

二.依賴於同一個手機上不同APP使用相同的SDK來相互拉起對方

通過LBE安全大師看QQ能通過個推,JPUSH,小米推送,微信開放平台接口廣播,新浪SAE雲推送,qq瀏覽器推送狀態廣播,手機QQ廣播接收等多種推送方式相互喚醒

是否可以嘗試按照QQ方式去實現。

嘗試用com.tencent.mm包名,在魅族NOTE2上,在另外zzh中創建了個服務,服務里每隔一秒打印test,發現正常通過菜單關閉都可以繼續執行,此時例子APP到緩存進程中繼續運行,關閉緩存進程才徹底關閉。

QQ當我在魅族NOTE2上,把正在運行和緩存進程中的QQ殺掉后,並且沒有其他QQ能喚醒的情況下,QQ也無法收到推送消息。

三.是否可以嘗試依賴於某個手機自身的推送服務

逐個判斷當前推送方式是否能成功,如果不能成功就換下種推送方式推送

或者在用戶登陸APP后反饋登陸信息,根據反饋信息來首先使用當前手機得推送服務。

魅族沒有自己的推送服務,此路不通

四.看到360手機助手怎么殺都殺不死

找到一個root的手機,如果不行就找個360一鍵root,adb shell進入后,執行su命令,當時root權限后,就進入到data/app中,把我需要的com.qihoo.appstore文件中base.apk復制到某個可以用文件夾(例如/mnt/sdcard/tmp)中,然后adb pull /mnt/sdcard/tmp c:\ 中,再通過反編譯編譯出代碼,看看實現。

發現它有個deamon守護進程的庫,libCoreDaemon.so看看怎么使用,發現一直無法加載該庫,System.loadLibrary("CoreDaemon");報錯,無法加載

 

 

1.嘗試在魅族上使用微信的包名,發現通過菜單關閉APP,后台服務依然存在可以執行
2.反編譯出360的JAVA代碼,查看保活機制,沒看懂,嘗試使用它的第三方,發現無法加載
3.嘗試集成了信鴿和JPUSH兩個推送,發現存活率依然不高
4.嘗試集成多個手機系統的消息推送,發現VIVO,魅族等沒有推送服務
5.嘗試鬧鍾喚醒,鬧鍾在5.1隨着APP關閉也無效
6.GITHUB上找例子  JNI開啟服務不行     前台服務也不行    雙JAVA服務也不行
7.嘗試ROOT后使用系統權限   沒有ROOT方式,暫時沒嘗試
8.兩個APP采用不同用戶,一個關閉去拉起另外一個     暫時沒有嘗試
9.嘗試微信或者QQ是否有廣播,可以喚醒我們APP      沒有發現什么廣播可以喚醒
10.嘗試單獨起個接收器,接收所有推送的守護進程廣播,來啟動我們自己的服務  LBE顯示有相互喚醒路徑,但是沒有喚醒服務   沒有喚醒

 

 

在上面基本上又做了新的嘗試

問題點1.JNI運行在哪里   啟動服務  確認下通過任務管理器關閉掉APP后C進程是否存在
動態鏈接庫文件,是一種不可執行的二進制程序文件,它允許程序共享執行特殊任務所必需的代碼和其他資源,只是加載到內存一種資源文件,僅測試和java屬於同一個進程,不同線程
java虛擬機類似於一個沙箱,應用程序進程共享zygote的同一套JAVA核心庫,Android的進程和線程其實是和liunx進程管理保持一致,Android里fork創建進程,clone創建線程
am startservice -n com.uhealth.member/cn.jpush.android.service.DaemonService 包名/類名
推送是通過
am startservice -a cn.jpush.android.intent.DaemonService 相互喚醒
魅族把靜態注冊廣播接收器進程沒啟動時,不給啟動,也就是自啟動管理設置的
服務:
packageManagerService解析APK,負責安裝,及/data下目錄生產,並在內存存儲了所有組件的信息(Acitivity,Service),並對外提供數據查詢
ActivityManagerService  管理ActivityRecord和TaskRecord,processRecord,並根據uid和processname去看是否需要創建新的進程,創建新進程是發消息給zygote,給新進程綁定Application,然后最后啟動Activity或Service
問題點2.自啟動試試是否可以      
Flyme3.1設置開機自啟:可以在設置—應用控制—開機啟動進行設置。
Flyme4.0設置開機自啟:可以在設置—應用管理—(點擊需設置的軟件)—權限管理—自啟動,點擊即可關閉或打開。  打開自啟動確實可以重啟
所謂的自啟動管理,就是把靜態注冊的廣播接收器進程沒啟動時無法接收廣播,當DEMO程序自啟動打開時,收到發送廣播也會自動啟動
對外暴露的服務是可以通過廣播啟動

問題點3:

嘗試生成子進程的子進程,然后把子進程殺掉,看是否可以形成360的依賴於init的子進程特例
360並不是通過生成子進程,然后殺掉父進程來連接上的
通過JAVA層新建2個進程,2個進程里2個JAVA服務,一個java服務service1去喚醒另外一個JAVA服務service2,service2里會啟動一個C線程,並創建其子進程,然后通過命令殺掉service2所在的進程,此時子進程就成為了init的子進程,子進程一直在運行,然后通過任務管理器關閉DEMO程序,沒有自啟動

轉自:http://blog.csdn.net/z157794218/article/details/51657444


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM