我的手机管家(2) 进程管理
(1)获取进程信息:所有的进程信息, 正在运行的进程信息, 剩余可用内存
(2)获取进程信息是一个耗时的操作,
首先在使用子线程获取进程信息的时候显示缓冲界面,缓冲加载完成后,
通知LIstView展示数据,加载适配器, 同时缓冲结束
获取进程信息的提供者:
package com.ejob.phonesafe.provider; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.List; import android.R; import android.R.drawable; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo; import android.app.ActivityManager.RunningAppProcessInfo; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.Debug; import com.ejob.phonesafe.entity.ProcessInfo; /** *进程信息的提供者 */ public class ProcessInfoProvider { /** * 获取正在运行的所有的进程 */ public static List<ProcessInfo> getRunningProcess(Context ctx){ List<ProcessInfo> list= new ArrayList<ProcessInfo>(); //获取activity引用管理器 ActivityManager manager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); //获取正在运行的app应用 List<RunningAppProcessInfo> runninglist = manager.getRunningAppProcesses(); //获取包 PackageManager packageManager = ctx.getPackageManager(); for(RunningAppProcessInfo p : runninglist){ //获取应用的名,图标,应用进程/系统进程,所占内存,报名 ProcessInfo info = new ProcessInfo(); //包名 String pm = p.processName; info.setPackageName(pm); //根据进程id(pid)获得内存信息 Debug.MemoryInfo[] memoryInfos= manager.getProcessMemoryInfo(new int[]{p.pid}); //所占内存 long totalPrivateDirty = memoryInfos[0].getTotalPrivateDirty()*1024;//当前应用所占的内存长度 单位是kb info.setMomery(totalPrivateDirty); try { //根据包名获取app信息 ApplicationInfo pInfo=packageManager.getApplicationInfo(pm, 0); //获取应用图标 Drawable icon=pInfo.loadIcon(packageManager); info.setIcon(icon); //应用程序名 String appName = pInfo.loadLabel(packageManager).toString(); info.setName(appName); //系统应用/用户应用 int flags=pInfo.flags; if((flags&ApplicationInfo.FLAG_SYSTEM)==ApplicationInfo.FLAG_SYSTEM){ info.setUserProcess(false);//系统应用 }else{ info.setUserProcess(true);//用户应用 } } catch (Exception e) { e.printStackTrace(); //某些系统级别的应用获取不了图标,应用名 info.setIcon(ctx.getResources().getDrawable(R.drawable.progress_horizontal)); info.setPackageName(pm); info.setUserProcess(false); } list.add(info); } return list; } /** * 获取正在运行应用程序的个数 */ public static int getRunningProcessNumber(Context ct){ ActivityManager manager = (ActivityManager) ct.getSystemService(ct.ACTIVITY_SERVICE); return manager.getRunningAppProcesses().size(); } /** * 获取剩余内存 */ public static long getAvailMenory(Context ctx){ ActivityManager manager = (ActivityManager) ctx.getSystemService(ctx.ACTIVITY_SERVICE); MemoryInfo info = new MemoryInfo();//空对象 manager.getMemoryInfo(info);//该对象在给我们的空对象复制 return info.availMem; } /** * 获取总内存 */ public static long getAllAvailMenory(Context ctx){ /*ActivityManager manager = (ActivityManager) ctx.getSystemService(ctx.ACTIVITY_SERVICE); MemoryInfo info = new MemoryInfo(); info.totalMem;//获取从内存,但是4.1一下的系统不支持,只能读取proc/meminfo */ try { /** * adb devices; * adb -s 设备名 shell; * ls * cd proc * cat meminfo * * * cat /proc/meminfo * MemTotal: 3266180 kB * MemFree: 17456 kB * Buffers:111328 kB * Cached: 2664024 kB * SwapCached: 0 kB * Active: 467236 kB */ FileReader reader = new FileReader("proc/meminfo"); BufferedReader br = new BufferedReader(reader); String line=br.readLine(); char []arrChar=line.toCharArray(); StringBuffer sr = new StringBuffer(); for(char c:arrChar){ if(c>=‘0‘&c<=‘9‘){ sr.append(c); } } String str = sr.toString(); long allNum=Long.parseLong(str)*1024; return allNum; } catch (Exception e) { e.printStackTrace(); } return 0; } /** * 杀死后台所有进程 */ public static void killAll(Context ctx){ ActivityManager manager = (ActivityManager) ctx.getSystemService(ctx.ACTIVITY_SERVICE); List<RunningAppProcessInfo> list = manager.getRunningAppProcesses(); for (RunningAppProcessInfo info : list) { if(ctx.getPackageName().equals(info.processName)){ continue;//跳过本应用程序,继续杀掉其他进程 }else{ manager.killBackgroundProcesses(info.processName); } } } }
进程管理界面:
一个Fragment布局包含一个缓冲加载布局
和一个ListView布局
用于缓冲和listview展示切换
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- 进程管理界面 --> <TextView android:id="@+id/apm_header" style="@style/title_style" android:text="进程管理" > </TextView> <RelativeLayout android:id="@+id/apm_rl1" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="3dp" > <TextView android:id="@+id/apm_rl1_tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="运行中的进程:" /> <TextView android:id="@+id/apm_rl1_tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="剩余内存/总内存:" /> </RelativeLayout> <FrameLayout android:id="@+id/apm_pl1" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > <ListView android:id="@+id/amp_pl1_lv1" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> <LinearLayout android:id="@+id/apm_pl1_ll1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:orientation="vertical" > <ProgressBar android:id="@+id/apm_pl1_ll1_pb1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="正在加载请稍后..." /> </LinearLayout> <TextView android:id="@+id/tv_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffff" android:padding="5dp" android:text="用户进程(0)" android:textColor="#bcbcb5" android:textSize="18sp" /> </FrameLayout> <LinearLayout android:id="@+id/amp_ll1" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/amp_ll1_btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="selectAll" android:background="@drawable/btn_light_green_selector" android:text="全选" /> <Button android:id="@+id/amp_ll1_btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="unSelect" android:background="@drawable/btn_light_green_selector" android:text="反选" /> <Button android:id="@+id/amp_ll1_btn3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/btn_light_green_selector" android:onClick="cleanAllSelect" android:text="一键清理" /> <Button android:id="@+id/amp_ll1_btn4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/btn_light_green_selector" android:onClick="onSettings" android:text="设置" /> </LinearLayout> </LinearLayout>
时间: 2024-11-08 13:01:23