Cactus

Project Url: gyf-dev/Cactus
Introduction: Android Keep Alive(安卓保活),keeplive 集成双进程前台服务,JobScheduler,onePix(一像素),WorkManager,无声音乐
More: Author   ReportBugs   
Tags:

注意!注意!注意!写在前面

如果你项目里使用了 Thread.UncaughtExceptionHandler 或者第三方异常捕获库,比如友盟,bugly 等,Cactus 请在 Thread.UncaughtExceptionHandler 或者第三方异常捕获库,比如友盟,bugly 等之后注册使用,并且建议在 Application 里注册使用。 为什么要这样操作?因为如果 android 8.0 以上设备隐藏了通知栏信息,当您的 app 崩溃重启后会出现 invalid channel for service notification 异常,而该异常属于系统级别的,没法捕获,所以 Cactus 对该异常进行了杀死 app 的操作,但是并不能保证第三方异常监控还是能捕获它。 如果第三方后台还是有该异常信息,你又觉得该异常影响你的 app 崩溃率,请调用 hideNotificationAfterO(false)方法,打开通知栏信息。

使用

android studio

  • androidx
    implementation 'com.gyf.cactus:cactus:1.1.3-beta13'
    
    • android support
      implementation 'com.gyf.cactus:cactus-support:1.1.3-beta13'
      

用法(具体 api 请参考 api 说明)

java 用法

  • 注册
      Cactus.getInstance()
            .isDebug(true)
            .setPendingIntent(pendingIntent)
            .addCallback(new CactusCallback())
            ... //其他 api 等
            ...
            .register(this)
    
  • 注销
      Cactus.getInstance().unregister(this)
    
  • 重启

      Cactus.getInstance().restart(this)
    

    kotlin 用法

  • 注册

      cactus {
         setPendingIntent(pendingIntent)
         setMusicId(R.raw.main)
         isDebug(true)
         ... //其他 api 等
         ...
         addCallback({
            //onStop 回调,可以省略
         }) { 
            //doWork 回调
         }
      }
    
  • 注销
      cactusUnregister()
    
  • 重启
      cactusRestart()
    

    混淆规则(proguard-rules.pro)

      -keep class com.gyf.cactus.entity.* {*;}
    

api 说明,★ 标识的建议用户修改,而不是使用默认值

api 说明 api 说明
★ setChannelId 渠道 Id,默认是 Cactus,建议用户修改,非必传 ★ setChannelName 渠道名,用于设置里通知渠道展示,默认是 Cactus,建议用户修改,非必传
★ setTitle 通知栏标题,默认是 Cactus,建议用户修改,非必传 ★ setContent 通知栏内容,默认是 Cactus is running,建议用户修改,非必传
★ setSmallIcon 通知栏小图标,默认是库里的图标,建议用户修改,非必传 setLargeIcon 通知栏大图标,默认没有大图标,非必传
★ setServiceId 服务 Id,默认是 1 到 Int.MAX_VALUE 随机数,非必传 setPendingIntent 设置 PendingIntent,用来处理通知栏点击事件,非必传
addCallback 增加回调,用于处理一些额外的工作,非必传 addBackgroundCallback 前后台切换回调,用于处理 app 前后台切换,非必传
setWorkerEnabled 是否可以使用 WorkManager,默认可以使用,非必传 setCrashRestartUIEnabled 奔溃是否可以重启用户界面,默认为 false,google 原生 rom android 10 以下可以正常重启,非必传
setRemoteViews 设置 RemoteViews(自定义布局),非必传 setBigRemoteViews 设置 BigRemoteViews(自定义布局),非必传
hideNotification 是否隐藏通知栏,经测试,除了 android 7.1 手机之外都可以隐藏,默认隐藏,非必传 hideNotificationAfterO 是否隐藏 Android 8.0 以上通知栏,默认隐藏
setMusicEnabled 是否可以播放音乐,默认可以播放音乐,非必传 setBackgroundMusicEnabled 后台是否可以播放音乐,默认不可以后台播放音乐,非必传
setMusicId 设置自定义音乐,默认是无声音乐,该 api 只要在 isDebug 为 true 才会有生效,非必传 ★ setMusicInterval 设置音乐间隔时间,时间间隔越长,越省电,默认间隔时间是 0,非必传
setOnePixEnabled 是否可以使用一像素,默认可以使用,只有在 android p 以下可以使用,非必传 isDebug 是否 Debug 模式,默认没有调试信息,非必传
setNotification 设置 notification,非必传,如果不传,将使用用户根据其他 api 设置的信息构建 Notification setNotificationChannel 设置 NotificationChannel,非必传,如果不传,将使用默认的 NotificationChannel
register 必须调用,建议在 Application 里初始化,使用 Kotlin 扩展函数不需要调用此方法 unregister 注销,并不会立马停止,而是在 1s 之后停止,非必须调用,比如可以在 app 完全退出的时候可以调用,根据你的需求调用
restart 重启,与 register 区别在于不会重新配置 CactusConfig 信息,而是使用上一次配置的信息 isRunning 是否在运行

流程图

框架流程图

保活效果,仅供参考(数字代码 oom_adj 优先级,优先级数字越小越不容易被杀)

维度 android 6.0 以下虚拟机 android 7.1 虚拟机 android 7/8/8.1/9/10 虚拟机 vovo x23 (android 9) 华为 mate20 /OnePlus (android 9) 华为 mate30 pro (android 10)
前台 0 0 0 0 0 0
后台(优化前) 6 立马死了 11 8 11 11
后台(优化后) 1 3 3 4 3 0
息屏(优化前) 6 立马死了 11 9 11 11
息屏(优化后) 0 3 3 4 3 0
  • 说明:oom_adj 优先级数字越小越不容易被杀

    | oom_adj | 说明 | oom_adj | 说明 | | :-------------: |:-------------:| :-------------:| :-------------:| | 0 | 前台进程 | 1 |可见进程 | | 2 | 可感知的进程,比如那种播放音乐 | 3 |正在备份的进程 | | 4 | 高权重进程 | 5 |有 Service 的进程 | | 6 | 与 Home 交互的进程 | 7 |切换进程 | | 8 | 不活跃的进程 | 9 |缓存进程,也就是空进程 | | 11 | 缓存进程,也就是空进程 | 15 |缓存进程,空进程,在内存不足的情况下就会优先被 kill | | 16 | 预留的最低级别,一般对于缓存的进程才有可能设置成这个级别 | | |

更新说明

1.1.2

  • 增加注销和重启功能
  • 增加判断服务是否是在运行中
  • 增加 hideNotificationAfterO 方法(是否隐藏 Android 8.0 以上通知栏)
  • 优化代码

1.1.1

  • 重点:修复 1.1.0 版本由于新增设置渠道 api(setNotificationChannel)忘记做渠道判断,导致在 8.0 以下手机奔溃,1.0.8 版本不受影响

1.1.0

  • 除了 android7.1 手机都可以隐藏通知栏了
  • 增加一些通知栏相关 api,比如可以自定义 view 了
  • 优化代码

1.0.8

  • 解决设置后台可以播放音乐,奔溃重启后无法继续播放音乐的问题

1.0.7

  • 增加前后台切换监听
  • 增加设置后台是否可以播放音乐的 api

联系我

  • QQ 群 314360549(问题交流)
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools