首页 > 系统相关 >[Android][客需]内存释放

[Android][客需]内存释放

时间:2022-09-19 19:57:10浏览次数:81  
标签:gu ActivityManager 客需 double long 内存 wenjie return Android

客户无感知的杀后台机制,当RAM使用率超过60%,自动关闭5分钟未使用的APP

直接上源码 懒得解析 有空再写

    //SW wenjie.gu add for sth start     private void RamListener(){             new Thread() {                 public void run(){                     while(ProjectConfig.DEFAULT_SUPPORT_RAMCLEAN){                     try {                         getTotalRam();                     } catch (Exception e) {                         e.printStackTrace();                     }                     }                 }             }.start();         }     private void getTotalRam() throws Exception {         IsKillingPg=true;         ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);         ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();         manager.getMemoryInfo(info);         long afterMem = getAvailMemory(mContext);         double a= info.availMem/1024/1024;         double b= info.totalMem/1024/1024;         double Tatal = MyMath.percentage(a, b, 2);         if (Tatal < 40) {             Log.e("wenjie.gu", "getTotalRam ClearUP!");             ClearUP();             Log.w("wenjie.gu", "清理后可用内存百分比为---->: " + Tatal);             Thread.sleep (180000);         }         IsKillingPg=false;     }     public static class MyMath {         private MyMath() {         }         public static double percentage(double d1, double zs, int dot) {             double bs = Math.pow(10.0, toDouble(dot + 2, 0.0));             double cs = Math.pow(10.0, toDouble(dot, 0.0));             double num = 0.0;             if (zs > 0) {                 num = Math.floor(d1 * bs / zs) / cs;             }             return num;         }         public static double percentage(int d1, int zs, int dot) {             double bs = Math.pow(10.0, toDouble(dot + 2, 0.0));             double cs = Math.pow(10.0, toDouble(dot, 0.0));             double num = 0.0;             if (zs > 0) {                 num = Math.floor(d1 * bs / zs) / cs;             }             return num;         }         private static Double toDouble(Object value, Double defaultValue) {             if (null == value) {                 return defaultValue;             }             return Double.parseDouble(value.toString());         }     }     private void ClearUP()throws ParseException{         long oneday =86400000;         long fivemin =300000;         UsageStatsManager usageManager=(UsageStatsManager) mContext.getSystemService(Context.USAGE_STATS_SERVICE);         if (usageManager != null && IsKillingPg) {             int intervalType = UsageStatsManager.INTERVAL_BEST;             List<UsageStats> applicationList = usageManager.queryUsageStats(intervalType,System.currentTimeMillis()-86400000, System.currentTimeMillis());             Log.w("wenjie.gu","现在的时间 ---> "+longToDate(System.currentTimeMillis()));             Log.w("wenjie.gu","现在的时间 ---> "+System.currentTimeMillis());             for (UsageStats usageStats : applicationList) {                 long UnusedTime=(System.currentTimeMillis()-usageStats.getLastTimeUsed());                 if(UnusedTime>fivemin && UnusedTime<oneday){                     String unusePkname=usageStats.getPackageName();                     mList.add(unusePkname);                     Log.w("wenjie.gu", "最后使用时间为---->"+unusePkname+"时间为--->"+longToDate(usageStats.getLastTimeUsed()));                     Log.w("wenjie.gu", "最后使用时间为---->"+unusePkname+"时间为--->"+usageStats.getLastTimeUsed());                                     }             }         }         ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);         List<ActivityManager.RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses();         long beforeMem = getAvailMemory(mContext);         Log.i("wenjie.gu", "清理前可用内存为 ---->: " + beforeMem);         for (ActivityManager.RunningAppProcessInfo appProcessInfo:appProcessInfos) {             if(appProcessInfo.processName.contains("com.android.system") ||appProcessInfo.pid==android.os.Process.myPid())                 continue;             String[] pkNameList=appProcessInfo.pkgList;             for(int i=0;i<pkNameList.length;i++){                 String pkName=pkNameList[i];                 Method method = null;                 if(!mList.contains(pkName)||isRunningForeground(pkName)){                     Log.e("wenjie.gu","进程--->"+pkName+"被排除!不被清理!");                     continue;                 }                 if(mList.contains(pkName)&&(!pkName.equals("com.huace.landstar"))&&(!pkName.contains("com.android.system"))){                     try {                         method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class);                         method.invoke(activityManager, pkName);                         Log.e("wenjie.gu","进程--->"+pkName+"被清理!");                     } catch (Exception e) {                         e.printStackTrace();                     }                 }             }         }         Log.i("wenjie.gu", "清理后可用内存为 ---->: " + beforeMem);     }     private long getAvailMemory(Context context) {         ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);         ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();         am.getMemoryInfo(mi);         return mi.availMem;     }     private String formatFileSize(long number){         return Formatter.formatFileSize(mContext, number);     }     public static Date longToDate(long lo) throws ParseException {         SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");         //long转Date         Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sd.format(new Date(lo)));         return date;     }     private boolean isRunningForeground(String packkname) {         ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);         ComponentName cn = am.getRunningTasks(1).get(0).topActivity;         String currentPackageName = cn.getPackageName();         if (currentPackageName != null && currentPackageName.equals(packkname)){             return true;         }         return false;     }     //SW wenjie.gu add for sth end

标签:gu,ActivityManager,客需,double,long,内存,wenjie,return,Android
From: https://www.cnblogs.com/gwj0424/p/16708823.html

相关文章

  • 虚拟人实时互动之基于Android驱动表情随动
    ZEGOAvatar表情随动功能简介ZEGOAvatarSDK提供了表情随动功能,基于领先的人脸关键点精准识别,结合面部、舌头、眼球在内的52种基础面部表情维度,实时捕获用户脸部的表......
  • 2 Java内存层面的对象认识
    目录1对象的创建2对象的内存布局3对象的访问定位3.1句柄访问3.2直接指针访问说明:此分析基于HotSpot虚拟机1对象的创建Java对象的创建方式有三种:通过new创建通过......
  • linux命令操作android手机
    目的通过一台linux机器操作android手机做一些常用的操作复杂的操作都是由简单操作开始的,可以自行发掘环境笔记本:thinkpadt480操作系统:archlinuxadb版本:31......
  • Android13的适配内容
    Android的13需要适配的内容Android13即将发布,对于这个版本的发版内容,记录一下Android开发者需要做的工作内容。通知权限的适配上一次的通知大改动是Android8.0,增夹的......
  • Android最强布局——ConstraintLayout约束布局
    ConstraintLayout首先,现附上官方文档:ConstraintLayout官方文档约束布局ConstraintLayout是一个ViewGroup,可以在Api9以上的Android系统使用它,它的出现主要是为了解决布局......
  • Android代码实现view的背景渐变色
    设置view的背景颜色,有两种方法,一种是通过代码写的形式,一种是通过写一个xml的形式先说第一种,用代码实现view的背景渐变色:intcolors[]={0xff2D0081,0xff8B3097,0xf......
  • Android compose使文本垂直居中
    仅使用Text()无法垂直居中。需要将Box()与contentAlignment=Alignment一起使用。居中还有用于对齐的CenterStart和CenterEnd选项。Box(contentAlignment=Alignmen......
  • 034每个进程占用内存排序
    一、  #ps-aux|head-n2  USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND  root10.00.019633213704?......
  • 34. 在Android中集成高德地图
    34.在Android中集成高德地图34.1高德地图开放平台创建新应用点击“添加”按钮新建一个工程34.2获取安全码这个工具是jdk自带的使用命令keytool-list-......
  • MAUI+Android调试报错:XABLD7000: Xamarin.Tools.Zip.ZipException: Renaming temporar
    调试报错:严重性 代码 说明 项目 文件 行 禁止显示状态错误 XABLD7000:Xamarin.Tools.Zip.ZipException:Renamingtemporaryfilefailed:Permissiondenied在Xam......