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

相关文章
相关标签/搜索