昨天晚上写了用系统服务等方法来实现应用保活。今天写一下用提高app的进程等级来实现应用保活。想看直接调用系统方法保活应用的可以点击Android进程守护,让APP在系统内存中常驻(一)进行跳转。

一:第一种实现思路,创建广播接收者来监听系统关屏亮屏操作。当手机关屏时,显示一个透明的一像素的activity,此时用户时看不见的;当手机亮屏时,把这个activity给finish掉。好了,有了思路就开始实现吧。

1.首先新建一个广播接收者:来判断当前的屏幕状态来进行一些操作。

public class AppBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())){AppReciver.getInstance().startApp(context);}else {AppReciver.getInstance().finishApp();}}
}

2.创建一个1像素的activity。

  @SuppressLint("RtlHardcoded")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_null);//设置1像素Window window = getWindow();window.setGravity(Gravity.LEFT | Gravity.TOP);WindowManager.LayoutParams params = window.getAttributes();params.x = 0;params.y = 0;params.height = 1;params.width = 1;window.setAttributes(params);//用来给单例传过去activity,能让它finish掉。AppReciver.getInstance().setActivity(this);}

3.为这个活动创建一个空的透明的主题。

<style name="KeepLive" parent="AppTheme"><item name="windowBackground">@null</item><item name="android:windowIsTranslucent">true</item></style>

4.为这个活动修改AndroidManifest中的内容,把它单独放入一个栈中。让他使用刚刚为他创建的主题。

 <activity android:name=".NullActivity"android:launchMode="singleInstance"android:theme="@style/KeepLive"/>

5.创建一个单例,用来完成开始和结束活动任务的逻辑操作。

class AppReciver {private static final AppReciver ourInstance = new AppReciver();private WeakReference<NullActivity> weakReference;private AppReciver() {}static AppReciver getInstance() {return ourInstance;}public void startApp(Context context) {context.startActivity(new Intent(context, NullActivity.class));}public void registerReceiver(Context context) {AppBroadcastReceiver appBroadcastReceiver = new AppBroadcastReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("android.intent.action.SCREEN_OFF");intentFilter.addAction("android.intent.action.SCREEN_ON");intentFilter.addAction("android.intent.action.USER_PRESENT");context.registerReceiver(appBroadcastReceiver, intentFilter);}public void finishApp() {if (weakReference != null && weakReference.get() != null) {weakReference.get().finish();}}public void setActivity(NullActivity activity) {weakReference = new WeakReference(activity);}
}

6.注意上面的单例中使用了WeakReference来保存activity。这里为了避免内存泄漏使用了弱引用。最后在活动中调用一下就完成了。

  @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//1.系统拉活service进程//startService(new Intent(this,StickService.class));//2.通过jobScheduler拉活//startJob();//3.通过bindService,通过ServiceConnection来拉活//bindService();//4.通过activity来提升app的进程等级AppReciver.getInstance().registerReceiver(this);}

二:service提升app的进程等级

1.首先新建一个服务。

public class ForegroundService extends Service {private static final int SERVICE_ID = 1;public ForegroundService() {}@Overridepublic IBinder onBind(Intent intent) {return null;}
}

2.如果是安卓4.0以下可以直接构建一个空的通知。安卓8.0以上,通知需要设置channel ,还需要设置通知的重要级别 ,安卓9.0以上,通知会直接显示出来。所以要进行版本的判断,来实现通知的设置方式。4.0以下的可以直接通过下面一行代码调用。

if (Build.VERSION.SDK_INT < 18) {//安卓4.0以下可以直接构建一个空的通知。//设置成前台服务,并且去除通知栏消息startForeground(SERVICE_ID,new Notification());}

3.安卓8.0以下的就需要先设置成前台服务,然后再去通过新的服务去除通知栏的消息。好了,废话不说,直接上代码。

else if (Build.VERSION.SDK_INT < 26) {//设置成前台服务startForeground(SERVICE_ID,new Notification());//并且去除通知栏消息startService(new Intent(this,InnerService.class));}

4.InnerService直接写一个内部服务就行。在里面进行去除通知栏的消息。

 private class InnerService extends Service{@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {startForeground(SERVICE_ID,new Notification());stopForeground(true);stopSelf();return super.onStartCommand(intent, flags, startId);}}

5.下面是这个服务的完整代码。

public class ForegroundService extends Service {private static final int SERVICE_ID = 1;public ForegroundService() {}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {if (Build.VERSION.SDK_INT < 18) {//安卓4.0以下可以直接构建一个空的通知。//设置成前台服务,并且去除通知栏消息startForeground(SERVICE_ID,new Notification());} else if (Build.VERSION.SDK_INT < 26) {//设置成前台服务startForeground(SERVICE_ID,new Notification());//并且去除通知栏消息startService(new Intent(this,InnerService.class));} else {//安卓8.0以上,通知需要设置channel//还需要设置通知的重要级别//安卓9.0以上,通知会直接显示出来。NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);if (manager!=null){NotificationChannel channel = new NotificationChannel("channel","xxx",NotificationManager.IMPORTANCE_NONE);manager.createNotificationChannel(channel);Notification notification = new NotificationCompat.Builder(this,"channel").build();startForeground(SERVICE_ID,notification);}}return super.onStartCommand(intent, flags, startId);}private class InnerService extends Service{@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {startForeground(SERVICE_ID,new Notification());stopForeground(true);stopSelf();return super.onStartCommand(intent, flags, startId);}}
}

6.在活动中启动一下就大功告成了。

 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//1.系统拉活service进程//startService(new Intent(this,StickService.class));//2.通过jobScheduler拉活//startJob();//3.通过bindService,通过ServiceConnection来拉活//bindService();//4.通过activity来提升app的进程等级//AppReciver.getInstance().registerReceiver(this);//5.通过Service来提升app的进程等级startService(new Intent(this,ForegroundService.class));}

好了,就说到这吧,有什么补充的或者哪里说的不对的欢迎在下面评论,一期交流,相互学习。

Android进程守护,让APP在系统内存中常驻(二)相关推荐

  1. Android Studio开发安卓app 安卓与webview中的js交互

    Android Studio开发安卓app 安卓与webview中的js交互 1.webview中的页面调用android中的方法 在Android Studio开发安卓app 封装WEB(H5,UR ...

  2. 如何让你的App永远在后台存活:对Android进程守护、闹钟后台被杀死的研究

    相关阅读: 吊炸天!74款APP完整源码! 123个微信小程序源码分享(附下载) [干货]2017已来,最全面试总结--这些Android面试题你一定需要 公众号:Java和Android架构 关注回 ...

  3. android进程守护 失效,保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护 1...

    本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ?Android.content.Context ?and ...

  4. android java 打开snd,使用SndPlaySound从内存中播放WAV

    有些时候,我们写的程序需要播放音乐,一般大家会采用以下几种方式:1.把音乐文件放置在某个特定的目录,例如Sound,WAV,Music供程序读取播放:2.使用资源来存放音乐.有些人估计也是使用这个方法 ...

  5. 【工具篇】float值在不同系统内存中的数值转换工具

    一.原理 float在内存中如何存储? float为浮点型,32位机器中占4字节共32bit,下标0-31. 31 位:符号位,正数为0,负数为1. 30 位:方向位.小数点左移位1,右移为0. 23 ...

  6. android内置第三方APP为系统应用,第三方APP内置到/system/app目录下报错java.lang.UnsatisfiedLinkError,so文件不加载

    项目场景: 在无系统签名的情况下,将第三方APP内置到/system/app目录下,可以将第三方应用变为系统应用,用户无法直接卸载.不过前提是手机需要root. 问题描述 使用es文件管理工具将第三方 ...

  7. Android客户端之“微服私访”App的系统学习(一) 本地服务端环境的搭建和部署

    前言: 每晚睡觉前都会去看看微信公众号中来自各位大神的干货分享,偶然看到鸿洋大神推荐的一篇有关课工厂的一个公开课 高效Android工程师6周培养计划,根据学习内容,整理成笔记.本系列文章意在详细介绍 ...

  8. Android客户端之“微服私访”App的系统学习(八)调用系统摄像头拍照并管理照片并使用Okhttp上传文件至后台

    纤云弄巧,飞星传恨,银汉迢迢暗度.金风玉露一相逢,便胜却.人间无数.柔情似水,佳期如梦,忍顾鹊桥归路.两情若是久长时,又岂在.朝朝暮暮.明天就是七夕了,在此吟诗一首,然而和我并木有什么关系,所以还是静 ...

  9. 【创新项目实训】Android移动开发教学app案例之飞花令(二)

    上一篇完成了查询活动,本篇将继续完成过渡部分和飞花令游戏. 活动之间的参数传递 在两个Activity之间传递数据,最终都是通过Intent传递,但设置数据和保存数据方式有两种(使用Intent 和 ...

最新文章

  1. DHCP在企业网中的应用
  2. 在Eclipse中创建Maven多模块工程的例子
  3. c语言最小元素下标怎么看,查找最小的k个元素 (C语言代码)
  4. SAP Commerce Cloud 2011装好之后,访问Accelerator时遇到错误
  5. python rowspan_Python tkinter rowspan未正确调整元素大小
  6. UART协议驱动设计
  7. 某法院HP-P4500存储数据恢复案例
  8. mysql删除用户账号和密码_mysql添加、删除用户和授权用户
  9. java 文件inputstream_java – 如何在InputStream中接收多个文件并相应地处理它?
  10. 高等代数中的名词解析-No1
  11. 这个大学生开发者用技术解决收入问题,乡亲们都回村了
  12. centos 7 开放指定端口
  13. 联想换机助手_三星S换机助手
  14. Unity 动态修改材质球
  15. 2021年N1叉车司机考试及N1叉车司机考试试卷
  16. 架构师之路读书会 | 15分钟一本,让我为你精读100本好书,快来加入吧!
  17. 【Greenplum走遍全国】济南技术研讨会
  18. 假设某台式计算机的内存容量为256,计算机二级试题与答案
  19. flutter 九宫格菜单_flutter GridView 九宫格
  20. 机器视觉、模式识别库

热门文章

  1. 黑白帽子问题(又名杀狗问题)
  2. java 每月的第一个周一,找出第一个周日/周一每月的日期等
  3. 通过TeamViewer 进行连接三种不同的方式
  4. Mach-O详解(一) - 破题
  5. 山石网科杨庆华:边界防御已死?网络安全永远需要防护叠加而非取代
  6. 视频转换器 Wondershare Video Converter Ultimate v11.5.1 中文便携版
  7. 零基础 学 python开发 (Genius套餐A) 二十九
  8. Go语言正/反向代理的姿势
  9. QIIME 2教程. 02插件工作流程Plugin Workflows(2021.2)
  10. 上传服务器上的视频不能在线播放的解决方案合集