qq_25658991 2016-09-05 12:30 采纳率: 50%
浏览 1559
已结题

Android在没有root权限的情况下清理内存

需要做一个android内存清理的功能。在网上查了好几个方法,都没有一个成功的。求路过的各位帮帮忙。。。

方法一:

 public static void clearnCrash1(Context context) {
        try {
            PackageManager pm = context.getPackageManager();
            Method localMethod = pm.getClass().getMethod("freeStorageAndNotify", Long.TYPE, IPackageDataObserver.class);
            Long localLong = Long.valueOf(getEnvironmentSize() - 1L);
            Object[] arrayOfObject = new Object[2];
            arrayOfObject[0] = localLong;
            localMethod.invoke(pm, localLong, new IPackageDataObserver.Stub() {
                @Override
                public void onRemoveCompleted(String packageName,
                                              boolean succeeded) throws RemoteException {
                }
            });
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

运行出来的时候,总是提示说

 java.lang.NoSuchMethodException:freeStorageAndNotify

所以总是调不起来freeStorageAndNotify这个方法。

方法二:

 public static void clearnCrash2(String packageName, Context context) {
        try {
            PackageManager pm = context.getPackageManager();
            Method method = pm.getClass().getMethod("deleteApplicationCacheFiles", String.class, IPackageDataObserver.class);
            method.invoke(pm, packageName, new IPackageDataObserver.Stub() {

                @Override
                public void onRemoveCompleted(String packageName,
                                              boolean succeeded) throws RemoteException {
                    // TODO Auto-generated method stub
                }

            });
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

网上说这个方法需要获取root权限,但是我现在要在不获取root权限的情况下清理内存,所以这个方法放弃了。

方法三:

 public static void onClearMemory(Context context) {
        ActivityManager activityManger = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> list = activityManger
                .getRunningAppProcesses();
        if (list != null)
            for (int i = 0; i < list.size(); i++) {
                ActivityManager.RunningAppProcessInfo apinfo = list.get(i);

                String[] pkgList = apinfo.pkgList;

                if (apinfo.importance >=
                        ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {

                    for (int j = 0; j < pkgList.length; j++) {

                        if (pkgList[j].equals(context.getPackageName())) {
                            continue;
                        }

                        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
                            activityManger.restartPackage(pkgList[j]);
                        } else {
                            activityManger.killBackgroundProcesses(pkgList[j]);
                        }
                    }
                }
            }
    }

方法三执行的时候没有报错,但是清理完毕以后调用

     public static long getAvailMemory(Context context) {
        // 获取android当前可用内存大小
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
        am.getMemoryInfo(mi);
        //mi.availMem; 当前系统的可用内存
        //return Formatter.formatFileSize(context, mi.availMem);// 将获取的内存大小规格化
        return mi.availMem / (1024 * 1024);
    }

查看内存的大小,发现清理前后没有任何的变化。这个方法是不是也要有root权限呢?

请问各位路过的大神,在不获取root权限的情况下,应该如何清理内存呢?
类似360手机助手的软件是怎么在没有root的情况下清理内存的呢?
还请各位路过的大神们帮帮忙,谢谢了。。。

  • 写回答

1条回答 默认 最新

  • devmiao 2016-09-05 16:04
    关注
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?