Android APP切換到後臺接收不到推送消息

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

android原生系統用home鍵殺進程能夠起來,若是是強行中止就只能用戶本身手動開啓應用android

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

 

若是是原生系統,沒有root,只要不是強行中止,其餘系統自帶的中止方式均可以自啓動,通常10s內恢復瀏覽器


目前已知如下第三方系統會影響到應用:
小米【MIUI】
        自啓動管理:須要把應用加到【自啓動管理】列表,不然殺進程或從新開機後進程沒法開啓
        通知欄設置:應用默認都是顯示通知欄通知,若是關閉,則收到通知也不會提示

    華爲【Emotion】
        自啓動管理:須要把應用加到【自啓動管理】列表,不然殺進程或從新開機後進程不會開啓,只能手動開啓應用
        後臺應用保護:須要手動把應用加到此列表,不然設備進入睡眠後會自動殺掉應用進程,只有手動開啓應用才能恢復運行
        通知管理:應用狀態有三種:提示、容許、禁止。禁止應用則通知欄不會有任何提醒

    魅族【Flyme】
        自啓動管理:須要把應用加到【自啓動管理】列表,不然殺進程或從新開機後進程發開啓
        通知欄推送:關閉應用通知則收到消息不會有任何展現

    VIVO【Funtouch OS】
        內存一鍵清理:須要將應用加入【白名單】列表,不然系統自帶的「一鍵加速」,會殺掉進程
        自啓動管理:須要將應用加入「i管家」中的【自啓動管理】列表,不然重啓手機後進程不會自啓。但強制手動殺進程,即便加了這個列表中,後續進程也沒法自啓動。

    OPPO【ColorOS】
        凍結應用管理:須要將應用加入純淨後臺,不然鎖屏狀態下沒法及時收到消息緩存

        自啓動管理:將應用加入【自啓動管理】列表的同時,還須要到設置-應用程序-正在運行裏鎖定應用進程,不然殺進程或者開機後進程不會開啓,只能手動開啓應用安全

 

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

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

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

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

相關文章
相關標籤/搜索