需求:需要开发一个 android app, 长时间保持后台,并建立 /保持 websocket 连接,服务端不定时从 ws 向客户端推送消息,客户端收到消息后进行语音播报(soundpool)。
目前实现:
然而存在的问题:
已知的一些应用的解决方案及优化点:
另外还需要实现开机自启动,自动连接,无需每次开机都要打开 app 这样的功能。
如上所述,考虑 3,4 优化点,每个点的收益如何?或者诸位大佬有无更好的解决方案?
PS: 不要说应用流氓,用户的需求就是要常驻进程,但是应用总是被系统各种限制导致播报不及时,国产 OS 和应用的相爱相杀-。-,没有 GMS 或者类似统一推送平台的东西,最后就是是双输的局面。
     1 
                    
                    lfzyx      2019-03-04 11:30:00 +08:00    用 FCM 推送不就行了 
                 | 
            
     2 
                    
                    TomVista      2019-03-04 11:38:52 +08:00    同纠结这个,我用的 ajax 轮询~,插眼看结果. 
                我现在就是提示用户加入白名单,但是我的用户大部分不会这个操作(年龄段),很尴尬. 平常内存占用 6m 左右,4g 运存手机,基本不杀,除非用户打游戏,手机自带游戏模式,或者用户开了大量大厂应用导致内存不足.  | 
            
     3 
                    
                    MetalCore      2019-03-04 11:48:24 +08:00    1.监听息屏,息屏时是尽量保持应用能置顶(不能置顶,应用很快就 gg ) 
                2.建议用户使用爱国牌手机,使用爱国牌推送唤醒 3.有些手机未阉割小部件,能用小部件 30 分钟唤醒一次  | 
            
     4 
                    
                    codehz      2019-03-04 14:19:25 +08:00    可以考虑阻止屏幕关闭,显示一个全屏黑色悬浮窗代替关闭屏幕 
                 | 
            
     5 
                    
                    HongJay      2019-03-04 14:29:06 +08:00    当 ws 检测到连接断开后,通过厂商通道拉起 app 
                 | 
            
     6 
                    
                    torchmu      2019-03-04 15:03:49 +08:00    这个不会是支付平台的收款到账语音播报吧。 
                目前支付宝都没法代码层面解决,详情可以参考支付宝设置到账提醒里的引导手册 doge  | 
            
     7 
                    
                    yukiww233      2019-03-04 15:49:21 +08:00    基本没办法,现在还有完美保活方案的话卖给国内互联网公司都可以财富自由了 
                 | 
            
     8 
                    
                    gam2046      2019-03-04 15:59:22 +08:00    把自己的应用包名改成白名单内的?(比如支付宝、微信、QQ ?)副作用就是当用户安装这些应用的时候,你的应用与被顶包的应用,后安装的将无法安装,原因是签名校验失败。 
                 | 
            
     9 
                    
                    bertsir      2019-03-04 17:27:23 +08:00    考虑一下厂商通道的推送 
                 | 
            
     10 
                    
                    shenhb      2019-03-04 17:32:45 +08:00    每个手机的厂商,集成一套推送 
                 | 
            
     11 
                    
                    yemoluo      2019-03-04 18:11:40 +08:00    我也是 3 和 4,4 通过监听所有的通知 ( 爱用不用 )   3. 开启一个单独的进程,很小很小 
                 | 
            
     12 
                    
                    snowspace      2019-03-04 20:19:27 +08:00    推必达 
                NotificationListenerService 坚持长连接 JobService 等等 不过在高版本上基本无效 接厂商通道吧  | 
            
     13 
                    
                    hanbing135      2019-03-04 20:25:15 +08:00 via Android    可以短信推送吧 
                 | 
            
     14 
                    
                    lerp   PRO 后台循环播放无声音频 
                 | 
            
     15 
                    
                    sampeng      2019-03-04 22:51:59 +08:00 via iPhone    虽然我是研发…但真的特别反感这个需求…始终让 cpu 无法休息。。产品是爽了。 
                 | 
            
     17 
                    
                    nanaw      2019-03-05 01:49:18 +08:00    可以如楼上所说,使用“特殊手段”保持手机唤醒状态,会很大的影响待机,需要用户允许,否则算是流氓了。 
                别的不说,开机自启对用户来说也算很流氓的了。 被 kill 的问题,一般是内存不足,不运行其他应用保持前台应该不会出现  | 
            
     18 
                    
                    luckylo      2019-03-05 08:02:42 +08:00 via Android    给引导,让用户自己去添加白名单。别替用户做选择。 
                 | 
            
     19 
                    
                    ksssdh123      2019-03-05 10:28:53 +08:00    最好的方式,还是引导用户,主动去开启,一般都是在电池这设置里去开启 
                 | 
            
     20 
                    
                    banixc   OP  | 
            
     23 
                    
                    banixc   OP  | 
            
     24 
                    
                    ksssdh123      2019-03-05 10:52:14 +08:00    @banixc  
                对于这个问题 我们是这么做的(有点暴力,但我们这边的用户能接受,因为我们是某一行业领域的 app,用户群体很确定) 产品经理 根据市场 根据用户等等因素 ,整理出一份需要适配的名单,最后让用户去选择这些机型去采购,开发只需要对这些名单上的机型做适配,每隔一段时间再对新机型做适配  | 
            
     25 
                    
                    2bab      2019-03-05 11:45:23 +08:00    这种用户允许下的保活,可以在 App 里给个设置,打开后起个前台的 Service,解决大部分的问题。 
                 | 
            
     26 
                    
                    2bab      2019-03-05 11:46:26 +08:00 
                    
                    补一下,前台可以自己做 Polling 或者建个自己的 Socket Channel。 
                 | 
            
     27 
                    
                    ysc3839      2019-03-05 13:02:51 +08:00 via Android    MIUI 挺坑的,用户开启了自启动和运行后台运行之后,一般情况下程序并不会被杀死。但是用户从最近任务里面划掉的话就会被杀死。不过程序开了自启动的话可以在后台再启动起来。 
                 | 
            
     29 
                    
                    banixc   OP @2bab 目前的做法就是起一个前台 Service,然后里面建立 websocket。但是会有网络断开 /进程被 kill/代码执行缓慢的问题。网络断开一般都是自动重连的,进程被 kill 就看怎么能恢复或者重新拉起。 
                 | 
            
     30 
                    
                    banixc   OP @ysc3839 通常我们的用户不会手动干掉这个进程的,自启动不是在手机开机的时候启动吗?难道被系统杀掉之后过一段时间还会拉起来? 
                 | 
            
     31 
                    
                    boboliu      2019-03-05 17:39:21 +08:00    要不……来个悬浮窗+持续亮屏? 
                 | 
            
     32 
                    
                    ronaldong      2019-03-05 17:51:11 +08:00    之前做即时通讯的应用的时候,研究过这个问题,基本无解 
                 | 
            
     33 
                    
                    pubby      2019-03-05 17:55:50 +08:00    加点其他触发几率比较大的一些广播事件监听,再加个定时器,然后在这些监听处理里面检查这个 Service 的状态。 
                息屏的问题,你 WakeLock 也处理一下 我这边一个类似需求的 app,分布在不同的地方,长时间插电运行,websocket 和服务器连接随时接收指令做出响应。 在 vivo,小米,华为几款手机都工作正常,基本上运行几周都不用管。 当然开机自启权限,电源白名单之类的要手工设置好。  | 
            
     34 
                    
                    0x8192dd      2019-03-05 18:04:30 +08:00    起一个前台 Service,保持运行,同时警告用户不要杀进程,反正明确一点,常驻后台不是没法做,但是“不经用户同意常驻后台”,在目前的高版本系统上是做不到的,也不要浪费时间去尝试了 
                 | 
            
     35 
                    
                    ysc3839      2019-03-05 18:19:51 +08:00 via Android 
                    
                    @banixc 但是你不能保证用户不会不小心划掉。 
                自启动开了之后是可以在程序被杀死后重新启动的,不需要用户点开就能启动。  | 
            
     36 
                    
                    whitev2      2019-03-05 19:07:45 +08:00    不用花心思在保活上,我一般都是直接 小黑屋 /冰箱 冻结不需要后台的应用的。这个操作对于应用基本是无解的 
                 | 
            
     37 
                    
                    luwies      2019-03-05 19:54:42 +08:00    不考虑耗电还是可以的吧,WakeLock 防止系统休眠,同时让你要保活的进程播放一个静音的音频... 
                 | 
            
     38 
                    
                    unknowngas      2019-03-06 05:53:43 +08:00    Play soundless sound, so your app will be a music player which always play something (either voice message or soundless sound) 
                 | 
            
     39 
                    
                    ivanchou      2019-03-06 09:54:29 +08:00 
                    
                    想了解下已经实现里的 2、3 是怎么做的 
                 | 
            
     41 
                    
                    banixc   OP  | 
            
     43 
                    
                    banixc   OP  |