android系统应用保活_详解Android 8.0以上系统应用如何保活

最近在做一个埋点的sdk,由于埋点是分批上传的,不是每次都上传,所以会有个进程保活的机制,这也是自研推送的实现技术之一:如何保证Android进程的存活。对于Android来说,保活主要有以下一些方法:开启前台Service(效果好,推荐)Service中循环播放一段无声音频(效果较好,但耗电量高,谨慎使用)双进程守护(Android 5.0前有效)JobScheduler(Android 5.0...
摘要由CSDN通过智能技术生成

最近在做一个埋点的sdk,由于埋点是分批上传的,不是每次都上传,所以会有个进程保活的机制,这也是自研推送的实现技术之一:如何保证Android进程的存活。

对于Android来说,保活主要有以下一些方法:

开启前台Service(效果好,推荐)

Service中循环播放一段无声音频(效果较好,但耗电量高,谨慎使用)

双进程守护(Android 5.0前有效)

JobScheduler(Android 5.0后引入,8.0后失效)

1 像素activity保活方案(不推荐)

广播锁屏、自定义锁屏(不推荐)

第三方推送SDK唤醒(效果好,缺点是第三方接入)

下面是具体的实现方案:

1.监听锁屏广播,开启1个像素的Activity

最早见到这种方案的时候是2015年,有个FM的app为了向投资人展示月活,在Android应用中开启一个1像素的Activity。

由于Activity的级别是比较高的,所以开启1个像素的Activity的方式就可以保证进程是不容易被杀掉的。

具体来说,定义一个1像素的Activity,在该Activity中动态注册自定义的广播。

class OnePixelActivity : AppCompatActivity() {

private lateinit var br: BroadcastReceiver

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

//设定一像素的activity

val window = window

window.setGravity(Gravity.LEFT or Gravity.TOP)

val params = window.attributes

params.x = 0

params.y = 0

params.height = 1

params.width = 1

window.attributes = params

//在一像素activity里注册广播接受者 接受到广播结束掉一像素

br = object : BroadcastReceiver() {

override fun onReceive(context: Context, intent: Intent) {

finish()

}

}

registerReceiver(br, IntentFilter("finish activity"))

checkScreenOn()

}

override fun onResume() {

super.onResume()

checkScreenOn()

}

override fun onDestroy() {

try {

//销毁的时候解锁广播

unregisterReceiver(br)

} catch (e: IllegalArgumentException) {

}

super.onDestroy()

}

/**

* 检查屏幕是否点亮

*/

private fun checkScreenOn() {

val pm = this@OnePixelActivity.getSystemService(Context.POWER_SERVICE) as PowerManager

val isScreenOn = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {

pm.isInteractive

} else {

pm.isScreenOn

}

if (isScreenOn) {

finish()

}

}

}

2, 双进程守护

双进程守护,在Android 5.0前是有效的,5.0之后就不行了。首先,我们定义定义一个本地服务,在该服务中播放无声音乐,并绑定远程服务

class LocalService : Service() {

private var mediaPlayer: MediaPlayer? = null

private var mBilder: MyBilder? = null

override fun onCreate() {

super.onCreate()

if (mBilder == null) {

mBilder = MyBilder()

}

}

override fun onBind(intent: Intent): IBinder? {

return mBilder

}

override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {

//播放无声音乐

if (mediaPlayer == null) {

mediaPlayer = MediaPlayer.create(this, R.raw.novioce)

//声音设置为0

mediaPlayer?.setVolume(0f, 0f)

mediaPlayer?.isLooping = true//循环播放

play()

}

//启用前台服务,提升优先级

if (KeepLive.foregroundNotification != null) {

val intent2 = Intent(applicationContext, NotificationClickReceiver::class.java)

intent2.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值