文章目录

  • 一、 使用前台 Service 提高应用进程优先级
    • 1、 前台 Service 代码
    • 2、 前台 Service 代码
    • 3、 启动服务
  • 二、效果展示
  • 三、源码资源

一、 使用前台 Service 提高应用进程优先级


上一篇博客 【Android 进程保活】提升进程优先级 ( 1 像素 Activity 提高进程优先级 | taskAffinity 亲和性说明 | 运行效果 | 源码资源 ) 使用了前台 Activity , 提升整个进程的优先级 ;

前台进程中除了前台显示的 Activity 之外 , 还有前台服务 , 即调用 startForeground 方法启动的服务 ;

按下 Home 键后 , 通过前台服务 , 让后台进程仍然是前台进程 ;

1、 前台 Service 代码

package kim.hsl.keep_progress_alive.foreground_service;import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.IBinder;import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat;import kim.hsl.keep_progress_alive.R;import static androidx.core.app.NotificationCompat.PRIORITY_MIN;public class ForegroundService extends Service {public ForegroundService() {}@Overridepublic void onCreate() {super.onCreate();// 将该服务转为前台服务// 需要设置 ID 和 通知// 设置 ID 为 0 , 就不显示已通知了 , 但是 oom_adj 值会变成后台进程 11// 设置 ID 为 1 , 会在通知栏显示该前台服务//startForeground(1, new Notification());startForeground();}@Overridepublic IBinder onBind(Intent intent) {return null;}/*** 启动前台服务*/private void startForeground() {String channelId = null;// 8.0 以上需要特殊处理if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {channelId = createNotificationChannel("kim.hsl", "ForegroundService");} else {channelId = "";}NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId);Notification notification = builder.setOngoing(true).setSmallIcon(R.mipmap.ic_launcher).setPriority(PRIORITY_MIN).setCategory(Notification.CATEGORY_SERVICE).build();startForeground(1, notification);}/*** 创建通知通道* @param channelId* @param channelName* @return*/@RequiresApi(Build.VERSION_CODES.O)private String createNotificationChannel(String channelId, String channelName){NotificationChannel chan = new NotificationChannel(channelId,channelName, NotificationManager.IMPORTANCE_NONE);chan.setLightColor(Color.BLUE);chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);NotificationManager service = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);service.createNotificationChannel(chan);return channelId;}
}

2、 前台 Service 代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.keep_progress_alive"><uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Keep_Progress_Alive"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><!--设置最近任务列表中不显示该 Activity 组件 ( 不要被用户察觉 )android:excludeFromRecents="true"设置 Activity 亲和性让该界面在一个独立的任务栈中 , 不要与本应用的其它任务栈放在一起避免解除锁屏后 , 关闭 1 像素界面 , 将整个任务栈都唤醒android:taskAffinity="kim.hsl.keep_progress_alive.alive"--><activityandroid:name=".one_pixel_activity.OnePixelActivity"android:excludeFromRecents="true"android:taskAffinity="kim.hsl.keep_progress_alive.onepixel"android:theme="@style/OnePixelActivityTheme" /><!-- 用于提权的前台进程 --><serviceandroid:name=".foreground_service.ForegroundService"android:enabled="true"android:exported="true"/></application></manifest>

3、 启动服务

=package kim.hsl.keep_progress_alive;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;import kim.hsl.keep_progress_alive.foreground_service.ForegroundService;
import kim.hsl.keep_progress_alive.one_pixel_activity.KeepProgressAliveManager;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 1 像素 Activity 提升应用权限// 注册广播接收者 , 1 像素 Activity 启动的 广播接收者//KeepProgressAliveManager.getmInstance().registerReceiver(this);// 通过前台 Service 提升应用权限// 启动普通 Service , 但是在该 Service 的 onCreate 方法中执行了 startForeground// 变成了前台 Service 服务startService(new Intent(this, ForegroundService.class));}@Overrideprotected void onDestroy() {super.onDestroy();// 取消注册广播接收者, 也可以不取消注册//KeepProgressAliveManager.getmInstance().registerReceiver(this);}
}

二、效果展示


启动应用 ,

查看 Logcat 中的 PID 为 300143001430014 ,


查询进程 oom_adj 值 , 000 , 前台进程 ;

C:\Users\octop>adb shell
walleye:/ $ su
walleye:/ # cat /proc/30014/oom_adj
0
walleye:/ #

点击 Home 键 ,

查询 oom_adj 值 , 444 , 在 【Android 进程保活】oom_adj 值 ( oom_adj 值对应的进程优先级 | oom_adj 值动态改变 | 进程保活优化方向 ) 可以看到该进程是后台重量级进程 , 比后台进程 999 ~ 151515 优先级高 ;

C:\Users\octop>adb shell
walleye:/ $ su
walleye:/ # cat /proc/30014/oom_adj
0
walleye:/ # cat /proc/30014/oom_adj
4
walleye:/ #

三、源码资源


源码资源 :

  • GitHub 地址 : https://github.com/han1202012/Keep_Progress_Alive
  • CSDN 源码快照 : https://download.csdn.net/download/han1202012/16581773

【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 效果展示 | 源码资源 )相关推荐

  1. 【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 启动相同 id 的第二个前台 Service 关闭通知 )

    文章目录 一. 前台 Service 通知问题 二. 设置 startForeground id 参数为 0 三. 启动相同 id 的第二个前台 Service 关闭通知 1. 前台服务 1 2. 关 ...

  2. 【Android 安全】Android 应用 APK 加固总结 ( 加固原理 | 应用加固完整的实现方案 | 源码资源 )

    文章目录 一. APK 加固原理 1. Android 应用反编译 2. ProGuard 混淆 3. 多 dex 加载原理 4. 代理 Application 开发 5.Java 工具开发 6.Ap ...

  3. 【Android 热修复】热修复原理 ( Dex 文件拷贝后续操作 | 外部存储空间权限申请 | 执行效果验证 | 源码资源 )

    文章目录 一.Dex 文件准备 二.外部存储空间权限申请 1.清单文件申请权限 2.动态申请权限 三.文件拷贝 1.文件拷贝 2.执行效果 四. 源码资源 一.Dex 文件准备 在 [Android ...

  4. 【Android 进程保活】应用进程拉活 ( 双进程守护保活 )

    文章目录 一. 双进程守护保活原理 二. 双进程守护保活完整源码 1.AIDL 接口 2.本地前台服务 Service 3.远程前台服务 Service 4.清单配置 5.启动两个服务 5.执行效果 ...

  5. Android进程保活

    Android进程回收机制 Low Memory Killer原理 微信团队原创分享:Android版微信后台保活实战分享(网络保活篇) 微信团队原创分享:Android版微信后台保活实战分享(进程保 ...

  6. 【Android 进程保活】提升进程优先级 ( 1 像素 Activity 提高进程优先级 | taskAffinity 亲和性说明 | 运行效果 | 源码资源 )

    文章目录 一.1 像素 Activity 提高进程优先级 1.主界面 MainActivity 2.1 像素 Activity 3.广播接收者 4.管理类 5.AndroidManifest.xml ...

  7. 【Android 进程保活】应用进程拉活 ( 系统 Service 机制拉活 | Service 组件 onStartCommand 方法分析 | 源码资源 )

    文章目录 一. Service 组件 onStartCommand 方法分析 1. onStartCommand 函数返回值分析 2. onStartCommand 函数 START_STICKY_C ...

  8. Android 系统(146)----Android进程保活招数概览

    Android进程保活招数概览 Android中的进程保活应该分为两个方面: 提高进程的优先级,减少被系统杀死的可能性 在进程已经被杀死的情况下,通过一些手段来重新启动应用进程 本文针对这两方面来进程 ...

  9. 【腾讯Bugly干货分享】Android进程保活招式大全

    [腾讯Bugly干货分享]Android进程保活招式大全 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ac4a0ea374 ...

最新文章

  1. 深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能...
  2. C# 移动窗口 适用于有标题栏和无标题栏窗体 超级简单版
  3. JSP EL表达式使用
  4. c语言程序设计第二版课后答案 机械工业出版社,C语言程序设计 第2版
  5. 刚装的matlab R2010a运行quad2d时提示找不到指定的程序! 提示信息: libmwblas: load error: csrot Caught
  6. 签约!睿铂与泰瑞数创共同助力实景三维中国建设
  7. python数组切片赋值_基于numpy中数组元素的切片复制方法
  8. OSS SSL 访问异常
  9. mysql触发器更新前触发_mysql触发器实例:更新前触发
  10. python弹窗炸弹
  11. android存储登录用户名密码,AndroidStudio实现账号密码保存功能
  12. Could not found global transaction xid
  13. 微星笔记本的神奇之处
  14. mysql dual表用法_mysql dual表的用途及案例
  15. c语言小蜜蜂编程题,小蜜蜂 pascal程序
  16. ros源码下载及编译
  17. UED设计流程和方法
  18. webstorm 安装激活破解方法
  19. Nginx在CDN加速之后,获取用户真实IP做并发访问限制的方法
  20. 挑战EUV光刻:NIL靠谱吗?一文秒懂

热门文章

  1. 心得体悟帖---12、志向还是太短浅,目光也是
  2. 【转载】如何学JavaScript?前辈的经验之谈
  3. 【学习笔记】树形结构基础
  4. 搞不懂的算法-排序篇1
  5. websocket在.net4.5中实现的简单demo
  6. Oracle Linux 6.1 说明
  7. weboffice 应用
  8. 文档知多少---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十五)[转]...
  9. 金蝶清空日志数据库脚本
  10. 洛谷P2312解方程