当前位置:首页 » 安卓系统 » android进程保活

android进程保活

发布时间: 2022-04-19 07:11:08

安卓手机“不保留活动”和“不允许后台进程”是什么意思

不保留活动指的是你手机所有程序切换后不保留,比方说你用扣扣然后去发短信,那么系统就会关闭扣扣,你再用扣扣就重新打开,重新加载缓存。不保留后台进程中后台进程限制的是缓存里的进程,而手机运行系统不可能不存在后台运行。

android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。所以为什么有的程序切出去重进会到主界面。

但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务。服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了。这个在进程管理软件里能看到,标签是service。至于广播什么的我就不涉及了。

所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。重启后才会变回标准限制,不用管的。

安卓(Android)是一种基于linux内核(不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。

2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。

第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机、智能手表等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。

2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。

㈡ android守护进程

Android中应该使用Service而不应该使用线程,Android中有提供后台运行的组件,叫Service。

servie是系统的组件,它由系统进程托管(servicemanager);它们之间的通信类似于client和server,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc。而thread是由本应用程序托管。

  1. Thread:Thread是程序执行的最小单元,它是分配CPU的基本单位。可以用Thread来执行一些异步的操作。

  2. Service:Service是android的一种机制,当它运行的时候如果是Local Service,那么对应的Service是运行在主进程的main线程上的。如:onCreate,onStart这些函数在被系统调用的时候都是在主进程的main线程上运行的。如果是RemoteService,那么对应的Service则是运行在独立进程的main线程上。


关于用户线程和守护线程:

java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)

Daemon的作用是为其他线程的运行提供便利服务,比如垃圾回收线程就是一个很称职的守护者。User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。

㈢ 怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死

方法:对于一个service,可以首先把它设为在前台运行:publicvoidMyService.onCreate(){super.onCreate();Notificationnotification=newNotification(android.R.drawable.my_service_icon,"my_service_name",System.currentTimeMillis());PendingIntentp_intent=PendingIntent.getActivity(this,0,newIntent(this,MyMainActivity.class),0);notification.setLatestEventInfo(this,"MyServiceNotification,"!",p_intent);Log.d(TAG,String.format("notification=%s",notification));startForeground(0x1982,notification);//notificationID:0x1982,youcannameitasyouwill.}重要设置-------------------------------相较于/data/app下的应用,放在/system/app下的应用享受的特权,比如若在其Manifest.xml文件中设置persistent属性为true,则可使其免受out-of-memorykiller的影响。如应用程序'Phone'的AndroidManifest.xml文件:设置后app提升为系统核心级别,任何情况下不会被kill掉,settings->applications里面也会屏蔽掉stop操作。这样设置前的log:Proc#19:adj=svc/B4067b028255:com.xxx.xxx/10001(started-services)#cat/proc/255/oom_adj设置后的log:PERS#19:adj=core/F406291f0155:com.xxx.xxx/10001(fixed)#cat/proc/155/oom_adj-12#这是CORE_SERVER_ADJ注:init进程的oom_adj为-16(即SYSTEM_ADJ):cat/proc/1/oom_adjAndroid相关部分分析:在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代码:(ApplicationInfoinfo){ProcessRecordapp=getProcessRecordLocked(info.processName,info.uid);if(app==null){app=newProcessRecordLocked(null,info,null);mProcessNames.put(info.processName,info.uid,app);updateLruProcessLocked(app,true,true);}if((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))==(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)){app.persistent=true;app.maxAdj=CORE_SERVER_ADJ;//这个常数值为-12。}if(app.thread==null&&mPersistentStartingProcesses.indexOf(app)/sys/mole/lowmemorykiller/parameters/minfree这样当可用内存低于90MB的时候便开始杀死"空进程",而当可用内存低于60MB的时候才开始杀死"内容供应节点"类进程。具体的回收实现在ActivityManagerService.java中的函数trimApplications():1.首先移除package已被卸载的无用进程;2.基于进程当前状态,更新oom_adj值,然后进行以下操作:1)移除没有activity在运行的进程;2)如果AP已经保存了所有的activity状态,结束这个AP。3.最后,如果目前还是有很多activities在运行,那么移除那些activity状态已经保存好的activity。更新oom_adj的值:在ActivityManagerService.java文件的ComputeOomAdjLocked()中计算出进程的oom_adj,例如:if(app==TOP_APP){//.adj=FOREGROUND_APP_ADJ;app.adjType="top-activity";}Androidkernel中的lowmemorykillerAndroid的LowMemoryKiller根据需要(当系统内存短缺时)杀死进程释放其内存,源代码在kernel/drivers/misc/lowmemorykiller.c中。简单说,就是寻找一个最合适的进程杀死,从而释放它占用的内存。最合适的进程是:•oom_adj越大•占用物理内存越多一旦一个进程被选中,内核会发送SIGKILL信号将之杀死:for_each_process(p){……if(selected==NULL||p->oomkilladj>selected->oomkilladj||(p->oomkilladj==selected->oomkilladj&&tasksize>selected_tasksize)){selected=p;}}if(selected!=NULL){force_sig(SIGKILL,selected);}查看LRU列表:adbshellmpsysactivity当activitydemo在前台时:包含Service的进程的优先级比较高,在computeOomAdjLocked中将其分为了两小类:staticfinalintMAX_SERVICE_INACTIVITY=30*60*1000;if(nowSECONDARY_SERVER_ADJ){adj=SECONDARY_SERVER_ADJ;app.adjType="started-services";app.hidden=false;}}if(adj>SECONDARY_SERVER_ADJ){app.adjType="started-bg-services";}完全让进程不被kill是不可能的,我们可以通过一些操作,使进程被kill的几率变小:1)提高进程的优先级:*后台操作采用运行于前台的Service形式,因为一个运行着service的进程比一个运行着后台activity的等级高;*按back键使得进程中的activity在后台运行而不是destory,需重载back按键(没有任何activity在运行的进程优先被杀).*依赖于其他优先级高的进程;2)强制修改进程属性:*在进程中设置:setPersistent(true);*在Manifest文件中设置(如上)。

㈣ Android 7.0 和8.0 如何保活

1.控制onStartCommand函数的返回值。

我对这个函数的理解是:当服务被异常终止时,是否重启服务?

有些文章里面在用这个做保活时,修改的是flag,在我实际测试中是无效。有效的做法是直接返回参数。另外默认的flags值为0,是START_STICKY_COMPATIBILITY。如下:

[java]view plain

  • @Override

  • publicintonStartCommand(Intentintent,intflags,intstartId){

  • //TODOAuto-generatedmethodstub

  • returnSTART_STICKY;

  • //returnsuper.onStartCommand(intent,flags,startId);

  • }

  • 测试结果:

    魅族的机子:无效,不管默认还是修改参数,在DDMS里面直接结束进程后都不会重启服务。

    其它三台机子(9100没测):默认参数的情况下就会重启服务,return START_STICKY 会重启,return START_NOT_STICKY 不会重启。

    其它:1.用360一键清理,或者360超级ROOT的手机优化,会杀死进程,过会儿还是会重启,只是会慢很多,大概是在排队重启服务。

    2.一次测试完后确保服务重启后,执行了onStartCommand函数。

    2.在service 的onDestory里面重启服务

    这个在所有能触发onDestory的情况下都是有效的。4台测试机都测试过。直接startService 或者发送广播重启都可以 。

    但能触发onDestory的情况,我不知道内存回收会不会触发。另外两种情况(2,3)是不触发的。我的测试方法是在“设置”-》应用管理-》正在运行-》停止服务。(这个是正常停止服务,会触发onDestory,所以上面的onStartCommand效果不会触发。)

    3.提高服务的优先级

    这个主要是针对第一种kill服务的情况,内存回收机制。由于这个测试比较难搭建。360清理什么把后台的进程都杀的,体现不出优先级这样的概念。我的建议是能提高就提高。下面例几种。

    通知--前台service

    创建一个通知使自己成为前台service

    测试结果:

    360一键清理和手机优化,不会把该service结束掉。

    对于后台保护:华为G730不结束service,魅族和华为TL00H都会结束service。

    通知栏的保活效果还是可以的,一般的应用要求基本能满足了。

    若有root权限:

    android:persistent="true",并放入system/app中

    测试结果:效果一般,三星9100上用360等清理工具杀不掉进程,在华为G730上没什么效果.(这个测试跟onStartCommand有点干扰)

    4.守护进程

    双服务

    360会同时杀掉两个服务,分两个apk也一样。

    native守护进程

    360不会杀掉native的守护进程,但在魅族和华为TL00H中待机一段时间后还是会被杀掉。

    结论和待续

    1.一般的应用添加到后台保护进程后,改个onStartCommand返回值,再加个通知。基本上大部分都能保活了。

    2.双服务我觉得没有native守护进程来的好,虽然360,微信什么的都有几个进程服务,但如果不添加到后台保活的话,效果一样不能保活,也会进入停止状态。

    3.但是.360手机助手会创建双natice守护进程做相互的看守。存活的效果会高一点点。“没添加到后台保活”一般只会杀一次,(魅族是屏幕关闭后5分钟,华为TL00H是屏幕关闭时)

㈤ android 如何让一个apk的进程不被自动杀死,让它一直运行。

APK怎么被运行就看当时内存的情况了。如果内存不够,原来就被KILL掉,重新切到它就只有重新创建了,如果内存够就只是PAUSE一下,重新切回就RESUME就OK了。

㈥ 怎么让Android程序一直后台运行,像QQ一样不被杀死

强烈建议不要这么做,不仅仅从用户角度考虑,作为Android开发者也有责任去维护Android的生态环境。现在很多Android开发工程师,主力机居然是iPhone而不是Android设备,感到相当悲哀。

从技术角度概括一下现在普遍的防杀方法Service设置成START_STICKY,kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别,除非在系统内存非常缺,否则此进程不会被 kill双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用(Android4.0系列的一个漏洞,已经确认可行)Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android-Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以下可行)用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。联系厂商,加入白名单

㈦ 面试android高级开发工程师具备哪些技能

1、关于团队:对内:能提升团队内聚力和执行力,注重个人成长,能快速提高团队战斗力;对外:能住区更多的资源,使项目和组内成员获得更好的成长和发展。
2、关于技术:领导项目优化,架构变更、核心模块的修改,也能不断引入新技术、对标竞品,不但技术上领先,也能做出更优秀的作品。
一、了解系统核心机制
1. 了解SystemServer的启动过程
2. 了解主线程的消息循环模型
3. 了解AMS和PMS的工作原理
4. 能够回答问题”一个应用存在多少个Window?“
5. 了解四大组件的大概工作流程
二、基本知识点的细节
1. Activity的启动模式以及异常情况下不同Activity的表现
2. Service的onBind和onReBind的关联
3. onServiceDisconnected(ComponentName className)和binderDied()的区别
4. AsyncTask在不同版本上的表现细节
5. 线程池的细节和参数配置
6.熟悉设计模式,有架构意识
三、技术要求
1.稍微深入的知识点
2.系统核心机制
3.基本知识点的细节
4.设计模式和架构
当然,除了上面的知识点和技能外,你还要能玩转RxJava、掌握自定义view 、要会进程间通信与进程保活、热修复等知识点。

㈧ Android无线开发的几种常用技术(阿里巴巴资深

完整的开发一个android移动App需要经过从分解需求、架构设计到开发调试、测试、上线发布等多个阶段,在发布后还会有产品功能上的迭代演进,此外还会面对性能、安全、无线网络质量等多方面的问题。
移动App的产品形态各不相同,有的是内容类,有的是工具类,有的是社交类,所以它们的业务逻辑所偏重的核心技术有些差别,但它们都会用到一些常用的技术方案。今天我们就先来简单介绍一下这些常用技术,以后会专门分专题来详细介绍这些技术的原理和使用场景。

1. Multidex
在Dalvik虚拟机所使用的dex文件格式中,用原生类型short来索引文件中的方法数,也就是最多只能有4个字节65536个method,在打包apk的过程中会把工程所需要的全部class文件都合并压缩到一个dex文件中,也就是说自己开发的代码加上外部引用的库的方法总数不能超过65535。
随着业务逻辑的不断增长,很容易就会超过这个限制,在编译期间就会遇到这样一个错误:

还好google官方给出了一个解决方案Multidex,它会把dex文件拆成两个或多个,第二个dex文件叫classes2.dex,在Application实例化后会从apk中解压出classes2.dex并将其拷贝到应用的目录下,通过反射将其注入到当前的ClassLoader中。但是这个方案非但不能解决一切问题也不能直接拿来用,而要加入自己的一些改造,来解决NoClassDefFoundError、INSTALL_FAILED_DEXOPT等问题,以保证自己的dex被顺利的加载流畅的执行。

2. Plugin
Multidex虽然可以解决方法数的限制,但随着业务逻辑越来越多,apk的大小也变得越来越多,而且有一些功能并非全部用户都想用的,所以会把一些功能模块独立出来做成插件,让用户可以按需下载更新,这样既减小了包大小,又改善了用户体验。

插件类似于windows的dll文件,放在某个特定目录,应用程序主框架会用LoadLibrary加载各dll文件,按插件接口去访问插件。Android的插件技术也是这样,利用一个进程可以运行多个apk的机制,用ClassLoader将宿主apk之外的类加载进来,插件的context可以通过createPackageContext方法创建。因为插件中的activity,service等组件如果没有在AndroidManifest.xml中声明将不能运行,所以需要预先在AndroidManifest.xml中声明一个代理类(ProxyActivity),将这个ProxyActivity传给插件,让插件的activity也有访问资源的能力。

3. Hot Patch
有时一些严重的crash bug或漏洞需要紧急修复,但有些用户不会或不愿意立即升级,而且频繁升级,没有特别的功能更新只是修复bug的升级,对活跃用户是一种伤害。热补丁就可以解决这样的窘境,它是一种可以线上修复的技术方案,有动态改变方法的能力,一般大型的移动应用都会使用热补丁来处理紧急事件。

Hot Patch可以通过hook来修改java的method,注入自己的代码,实现非侵入式的runtime修改,或者采用正向编程,通过工具生成patch文件,通过jni bridge指向补丁文件中的方法。还有就是利用ClassLoader,在dex中查找class时,如果找到类则返回,找不到就从下一个dex文件中继续查找,由此可以想到,在把问题修复后,可以单独生成一个dex,通过反射插入到dexElements数组的最前面,这样就能让dalvik加载补丁里的类了。

4. Push通道
Push是移动App常用的一种无线技术,基础是基于TCP的心跳机制,和客户端维持一个长连接。用处是向客户端推送消息,或者代替客户端定时去从服务器pull的策略,改为客户端接收到push消息后再去pull。
如果每个应用都自己实现push通道的话,cpu就会不定时地经常被唤醒,耗电量达到难以容忍的程度,而且自己搭建push平台的成本也很大,实时性和效率也存在问题,一般都直接使用一些服务商提供的push方案,这些push平台一般都经过了优化设计,在跨平台和网络穿透性、长连接心跳包、多客户端App链路复用、服务和连接保活等技术上做了优化。比如Agoo最初是淘宝无线事业部开发的push服务,在逐渐完善和支撑淘系其他app后,通过服务端容量、通讯协议优化、业务和开放能力的拓展改进后,与友盟等合作,开始向第三方提供推送服务。

5. 应用加固
一款热门的移动app或游戏发布后会受到很多的关注,经常会遇到二次打包的盗版行为,破解者要么修改游戏的资源文件、道具、分值甚至直接把访问的站点指向自己架设的服务器,损害了开发者的利益;要么偷偷植入自己的恶意代码,表面上看起来跟正版的app完全一样,在后台却盗取用户隐私,植入木马;要么通过反向工程学习原app的核心技术,打破技术上的竞争壁垒。
为了防止被破解只通过混淆是远远不够的,即使是在native层混淆也还是会被人熟练的反编译,所以需要一套对apk的保护方案来反调试、防逆向和防篡改。一般的加固方法都是对原apk先进行加密,然后和壳合并生成新的apk。壳是用来解密apk的dex文件。当应用启动时,壳先解密原apk,准备好自己定义的ClassLoader,然后获取源程序中的Application名称,通过反射找到正确的Application对象,运行它的onCreate方法,这样原apk才能被真正运行。其他一些反调试的方法有针对反编译工具,在源程序中加入一些无效的指令或无效的指针,引发反编译工具的崩溃,还有就是加花指令,利用一些跳转,堆栈操作等指令,让破解者无法清楚地理解反汇编后的内容。

6. 其他
除了上述几点外,在服务端还会涉及灰度策略、链路流量优化、动态更新配置、防DNS劫持等技术,在客户端会涉及用户埋点上报、在线监控、进程保活、H5和native混合开发、注入框架等。

㈨ 如何让一个应用程序一直在后台运行

1、保活手段

1 业界保活手段:黑色保活,灰色保活,白色保活

2 黑色保活:

1 不同的APP进程,用广播相互唤醒,包括利用系统广播进行唤醒

2 常见手段:

1 开机,网络切换,拍照,拍视频等利用系统广播唤醒APP

此场景Google已经意识到,在Android N 取消了 拍照,视频,网络切换的广播

2 接入第三方的SDK也会唤醒相应的APP进程

3 假如你手机里装了支付宝,淘宝,UC等阿里系的APP,那么你打开任何一个,都有可能唤醒其他的阿里系的APP

3 白色保活:

就是调用系统的API启动一个前台Service进程,这样会在通知栏生成一个Notification,用户知道哪些进程正在运行

4 灰色保活

1 保活领域应用最为广泛,利用系统的漏洞来启动一个前台的Service进程,与“白色保活”不同的是,它不会在通知栏生成一个Notification,用户无法察觉,但是优先级要高于普通的后台进程。

2 实现思路

思路一:当API<18,启动前台的Service直接传入new Notification();

思路二:当API >= 18,同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理
代码这样写:

[java]view plain

  • importandroid.app.Notification;

  • importandroid.app.Service;

  • importandroid.content.Intent;

  • importandroid.os.Build;

  • importandroid.os.IBinder;

  • /**

  • *APP灰色保活

  • *Createdbyfflinon2016/4/23.

  • */

  • {

  • privatefinalstaticintGRAY_SERVICE_ID=1001;

  • @Override

  • publicIBinderonBind(Intentintent){

  • returnnull;

  • }

  • @Override

  • publicintonStartCommand(Intentintent,intflags,intstartId){

  • //API<18,此方法能有效地隐藏notification的图标

  • if(Build.VERSION.SDK_INT<18){

  • startForeground(GRAY_SERVICE_ID,newNotification());

  • }else{

  • Intentintent1=newIntent(this,GrayInnerService.class);

  • startService(intent1);

  • startForeground(GRAY_SERVICE_ID,newNotification());

  • }

  • returnsuper.onStartCommand(intent,flags,startId);

  • }

  • //给API>=18的平台上做灰色保护手段

  • {

  • @Override

  • publicIBinderonBind(Intentintent){

  • returnnull;

  • }

  • @Override

  • publicintonStartCommand(Intentintent,intflags,intstartId){

  • startForeground(GRAY_SERVICE_ID,newNotification());

  • stopForeground(true);

  • stopSelf();

  • returnsuper.onStartCommand(intent,flags,startId);

  • }

  • }

  • }



  • 3 检验方法:

    首先看系统通知栏有没有Notification,如果没有,就进入手机adb shell模式,输入命令mpsys activity services PackageName

    打印出指定包名的所有进程中的service信息,看下有没有isForground=true的信息,如果有,就说明了该APP使用了灰色保活

    4 使用灰色保活手段并不意味着你的应用就能永生不死,只能说提高了进程的优先级,如果应用占用了很大的内存,还是会被回收的

    2、进一步理解保活

    1 进程回收机制

    系统出于体验和性能上的考虑,APP在退出后台时系统并不会真正的kill掉这个进程,而是将其缓存起来,打开的应用越多,后台缓存的进程也就越多。在系统内存不足的情况下,系统开始根据自身的一套进程回收机制来判断要回收掉哪些进程,这套杀死进程回收内存的机制叫 Low Memory Killer,它是基于Linux内核的OOM killer机制诞生的,该机制为每个系统分配了一个值,叫做oom_adj,代表了进程的优先级,oom_adj越大,代表优先级越低,越容易被回收,普通APP进程的oom_adj >=0,系统的可能会小于0.

    2 查看oom_adj的值,需要用到两个shell命令

    ps | grep 包名

    $cat /proc/进程id/oom_adj

    3 结果发现,APP推到后台,UI进程的值降低最为明显,因为它占用的内存资源最多,因此,为了避免后台UI进程被杀,需要尽可能的释放一些不用的图片,音频资源

㈩ 如何提PUSH的达到率

首先,先明确为什么要优化推送?

最直接原因就是提升DAU,让用户更多打开App,这背后隐含的目的是希望激活新用户、召回流失用户,让业务长期健康增长。因此,务必注意这不是一次性的事儿,要通盘考虑,KPI导向的数据提升一定会引起反弹的。

OK,接下来进入正题,聊下提升PUSH到达率的一些手段。

为了帮大家理解PUSH原理,先放一张业务架构图:

在此基础上,可以适当增加一些打开推送开关的引导,一般可以有如下场景:

  • App升级后,用户打开App,跳出弹窗提醒用户打开消息提醒;

  • 某些个性化功能,为了提醒用户,引导打开推送开关。比如:关注某个作者提醒他打开开关以接收作者最新文章;比如:买完商品后提醒打开开关以跟踪物流进展等;

  • 通过某些有利于用户的消息,提醒用户打开。比如:财经类App打开开关以接收最新股市行情;比如:电商类App打开开关以接收优惠信息等;

  • 给用户提供一些利益以促使他打开,比如:打开开关有积分,送优惠券之类的。

  • 但真正最合适的引导方式还是让用户体验到你产品的价值后,给一个利他的理由,自然引导,而不是一上来就弹窗。这点很多大厂App都做的很好,建议多参考。

    以上就是今天想和大家分享的,有关推送到达率提升的一些观点总结,信息量有点大,部分也参考了其他文章和书籍,希望能对你有帮助。同时,如果有我没提到的,也欢迎你留言告诉我,我也会再和大家分享~

    参考文献

  • 《关于 Android 进程保活,你所需要知道的一切》,来自简书:D_clock爱吃葱花。

  • 《APP消息推送(Push),竟然还有这么多你不知道的》,来自简书:大城小胖Chris。

  • 《我不是产品经理》,作者:岳建雄。

  • 热点内容
    libx264编译 发布:2025-04-23 00:13:37 浏览:219
    access的web数据库 发布:2025-04-23 00:08:29 浏览:46
    安卓上面的谷歌搜索框怎么去除 发布:2025-04-23 00:07:27 浏览:171
    c判断文件夹是否存在 发布:2025-04-22 23:56:36 浏览:941
    精确测算法 发布:2025-04-22 23:54:09 浏览:287
    安卓如何更换开机画面 发布:2025-04-22 23:49:10 浏览:889
    知道ID密码怎么定位 发布:2025-04-22 23:34:16 浏览:253
    c语言采样 发布:2025-04-22 23:30:03 浏览:916
    数据库服务器修改了ip地址 发布:2025-04-22 23:25:36 浏览:7
    c语言基础案例 发布:2025-04-22 23:23:28 浏览:693