手機安全衛士——進程管理

来源:http://www.cnblogs.com/mengxiao/archive/2017/02/08/6379147.html
-Advertisement-
Play Games

首先看一下界面: SharedPreferencesUtils.java ...


首先看一下界面:

TaskManagerActivity .java
//進程管理
public class TaskManagerActivity extends Activity {
    @ViewInject(R.id.tv_task_process_count)
    private TextView tv_task_process_count;
    @ViewInject(R.id.tv_task_memory)
    private TextView tv_task_memory;
    @ViewInject(R.id.list_view)
    private ListView list_view;
    private long totalMem;
    private List<TaskInfo> taskInfos;
    private List<TaskInfo> userTaskInfos;
    private List<TaskInfo> systemAppInfos;
    private TaskManagerAdapter adapter;
    private int processCount;
    private long availMem;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);        
        initUI();
        initData();

    }
    
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();        
        if(adapter != null){
            adapter.notifyDataSetChanged();
        }
    }

    private class TaskManagerAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            //判斷當前用戶是否需要顯示系統進程,需要就顯示,不需要就不顯示            
            boolean result = SharedPreferencesUtils.getBoolean(TaskManagerActivity.this, "is_show_system", false);
            if(result){
                return userTaskInfos.size() + 1 + systemAppInfos.size() + 1;
            }else{
                return userTaskInfos.size() + 1;
            }        
        }

        @Override
        public Object getItem(int position) {

            if (position == 0) {
                return null;
            } else if (position == userTaskInfos.size() + 1) {
                return null;
            }

            TaskInfo taskInfo;

            if (position < (userTaskInfos.size() + 1)) {
                // 
                taskInfo = userTaskInfos.get(position - 1); 
                                                            
            } else {
                // 
                int location = position - 1 - userTaskInfos.size() - 1;
                taskInfo = systemAppInfos.get(location);
            }
            return taskInfo;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            if (position == 0) {
                // 
                TextView tv = new TextView(getApplicationContext());
                tv.setBackgroundColor(Color.GRAY);
                tv.setTextColor(Color.WHITE);
                tv.setText("用戶進程:" + userTaskInfos.size() + "個");
                return tv;
            } else if (position == (userTaskInfos.size() + 1)) {
                TextView tv = new TextView(getApplicationContext());
                tv.setBackgroundColor(Color.GRAY);
                tv.setTextColor(Color.WHITE);
                tv.setText("系統進程" + systemAppInfos.size() + "個");
                return tv;
            }
            ViewHolder holder;
            View view;
            if (convertView != null && convertView instanceof LinearLayout) {
                view = convertView;

                holder = (ViewHolder) view.getTag();

            } else {
                view = View.inflate(TaskManagerActivity.this,
                        R.layout.item_task_manager, null);

                holder = new ViewHolder();

                holder.iv_app_icon = (ImageView) view
                        .findViewById(R.id.iv_app_icon);

                holder.tv_app_name = (TextView) view
                        .findViewById(R.id.tv_app_name);

                holder.tv_app_memory_size = (TextView) view
                        .findViewById(R.id.tv_app_memory_size);

                holder.tv_app_status = (CheckBox) view
                        .findViewById(R.id.tv_app_status);

                view.setTag(holder);
            }

            TaskInfo taskInfo;

            if (position < (userTaskInfos.size() + 1)) {
                // 
                taskInfo = userTaskInfos.get(position - 1);
                                                                        } else {
                // 
                int location = position - 1 - userTaskInfos.size() - 1;
                taskInfo = systemAppInfos.get(location);
            }
           
            holder.iv_app_icon.setImageDrawable(taskInfo.getIcon());

            holder.tv_app_name.setText(taskInfo.getAppName());

            holder.tv_app_memory_size.setText("占用記憶體:"
                    + Formatter.formatFileSize(TaskManagerActivity.this,
                            taskInfo.getMemorySize()));

            if (taskInfo.isChecked()) {
                holder.tv_app_status.setChecked(true);
            } else {
                holder.tv_app_status.setChecked(false);
            }
            //
            if(taskInfo.getPackageName().equals(getPackageName())){
                //
                holder.tv_app_status.setVisibility(View.INVISIBLE);
            }else{
                //
                holder.tv_app_status.setVisibility(View.VISIBLE);
            }
            
            return view;
        }

    }

    static class ViewHolder {
        ImageView iv_app_icon;
        TextView tv_app_name;
        TextView tv_app_memory_size;
        CheckBox tv_app_status;
    }

    private void initData() {
        new Thread() {

            public void run() {
                taskInfos = TaskInfoParser
                        .getTaskInfos(TaskManagerActivity.this);

                userTaskInfos = new ArrayList<TaskInfo>();

                systemAppInfos = new ArrayList<TaskInfo>();

                for (TaskInfo taskInfo : taskInfos) {

                    if (taskInfo.isUserApp()) {
                        userTaskInfos.add(taskInfo);
                    } else {
                        systemAppInfos.add(taskInfo);
                    }

                }

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        adapter = new TaskManagerAdapter();
                        list_view.setAdapter(adapter);
                    }
                });

            };
        }.start();

    }

   

    private void initUI() {
        setContentView(R.layout.activity_task_manager);
        ViewUtils.inject(this);
                //SystemInfoUtils下文定義
        processCount = SystemInfoUtils.getProcessCount(this);

        tv_task_process_count.setText("運行中進程:" + processCount + "個");

        availMem = SystemInfoUtils.getAvailMem(this);

        totalMem = SystemInfoUtils.getTotalMem(this);

        tv_task_memory.setText("剩餘/總記憶體:"
                + Formatter.formatFileSize(TaskManagerActivity.this, availMem)
                + "/"
                + Formatter.formatFileSize(TaskManagerActivity.this, totalMem));

        list_view.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                //
                Object object = list_view.getItemAtPosition(position);

                
                if (object != null && object instanceof TaskInfo) {

                    TaskInfo taskInfo = (TaskInfo) object;

                    ViewHolder holder = (ViewHolder) view.getTag();
                    
                    if(taskInfo.getPackageName().equals(getPackageName())){
                        return;
                    }
                    
                 
                    if (taskInfo.isChecked()) {
                        taskInfo.setChecked(false);
                        holder.tv_app_status.setChecked(false);
                    } else {
                        taskInfo.setChecked(true);
                        holder.tv_app_status.setChecked(true);
                    }

                }

            }

        });
    }

    /**
     * 全選
     * 
     * @param view
     */

    public void selectAll(View view) {

        for (TaskInfo taskInfo : userTaskInfos) {

            if (taskInfo.getPackageName().equals(getPackageName())) {
                continue;
            }

            taskInfo.setChecked(true);
        }

        for (TaskInfo taskInfo : systemAppInfos) {
            taskInfo.setChecked(true);
        }
        // 數據發生變化,一定要更新
        adapter.notifyDataSetChanged();

    }

    /**
     * 反選
     * 
     * @param view
     */
    public void selectOppsite(View view) {
        for (TaskInfo taskInfo : userTaskInfos) {        

            if (taskInfo.getPackageName().equals(getPackageName())) {
                continue;
            }
            taskInfo.setChecked(!taskInfo.isChecked());
        }
        for (TaskInfo taskInfo : systemAppInfos) {
            taskInfo.setChecked(!taskInfo.isChecked());
        }
        adapter.notifyDataSetChanged();
    }

    /**
     * 清理
     * 
     * @param view
     */
    public void killProcess(View view) {

        ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

        List<TaskInfo> killLists = new ArrayList<TaskInfo>();

        //清理的總共進程個數
        int totalCount = 0;
        // 釋放多少記憶體
        int killMem = 0;
        for (TaskInfo taskInfo : userTaskInfos) {

            if (taskInfo.isChecked()) {
                killLists.add(taskInfo);
                // userTaskInfos.remove(taskInfo);
                totalCount++;
                killMem += taskInfo.getMemorySize();

            }
        }

        for (TaskInfo taskInfo : systemAppInfos) {

            if (taskInfo.isChecked()) {
                killLists.add(taskInfo);
                // systemAppInfos.remove(taskInfo);
                totalCount++;
                killMem += taskInfo.getMemorySize();
                //
                activityManager.killBackgroundProcesses(taskInfo
                        .getPackageName());
            }
        }
        /**
         * 當集合在迭代的時候,不能修改集合的大小
         */
        for (TaskInfo taskInfo : killLists) {
            //判斷是否是用戶app
            if (taskInfo.isUserApp()) {
                userTaskInfos.remove(taskInfo);
                //
                activityManager.killBackgroundProcesses(taskInfo
                        .getPackageName());
            } else {
                systemAppInfos.remove(taskInfo);
                //
                activityManager.killBackgroundProcesses(taskInfo
                        .getPackageName());
            }
        }

        UIUtils.showToast(
                TaskManagerActivity.this,
                "共清理"
                        + totalCount
                        + "個進程,釋放"
                        + Formatter.formatFileSize(TaskManagerActivity.this,
                                killMem) + "記憶體");
        //processCount 
        //totalCount
        processCount -= totalCount; 
        tv_task_process_count.setText("運行中的進程:"+ processCount +"個");
        // 
        tv_task_memory.setText("剩餘/總記憶體:"
                + Formatter.formatFileSize(TaskManagerActivity.this, availMem + killMem)
                + "/"
                + Formatter.formatFileSize(TaskManagerActivity.this, totalMem));
        
        // 刷新界面
        adapter.notifyDataSetChanged();

    }
    /**
     *設置
     * @param view
     */
    public void openSetting(View view){
        
        startActivity(new Intent(TaskManagerActivity.this,TaskManagerSettingActivity.class));
    }
}
TaskInfoParser.java
public class TaskInfoParser {

    public static List<TaskInfo> getTaskInfos(Context context) {

        PackageManager packageManager = context.getPackageManager();

        List<TaskInfo> TaskInfos = new ArrayList<TaskInfo>();
        //
        ActivityManager activityManager = (ActivityManager) context
                .getSystemService(context.ACTIVITY_SERVICE);
        //
        List<RunningAppProcessInfo> appProcesses = activityManager
                .getRunningAppProcesses();

        for (RunningAppProcessInfo runningAppProcessInfo : appProcesses) {

            TaskInfo taskInfo = new TaskInfo();

            //
            String processName = runningAppProcessInfo.processName;

            taskInfo.setPackageName(processName);

            try {
               
                MemoryInfo[] memoryInfo = activityManager
                        .getProcessMemoryInfo(new int[]{runningAppProcessInfo.pid});
                
                int totalPrivateDirty = memoryInfo[0].getTotalPrivateDirty() * 1024;
             

                taskInfo.setMemorySize(totalPrivateDirty);

                PackageInfo packageInfo = packageManager.getPackageInfo(
                        processName, 0);

                Drawable icon = packageInfo.applicationInfo
                        .loadIcon(packageManager);

                taskInfo.setIcon(icon);
               
                String appName = packageInfo.applicationInfo.loadLabel(
                        packageManager).toString();

                taskInfo.setAppName(appName);
                
                System.out.println("-------------------");
                System.out.println("processName="+processName);
                System.out.println("appName="+appName);
                ////packageInfo.applicationInfo.flags 
                //ApplicationInfo.FLAG_SYSTEM
                int flags = packageInfo.applicationInfo.flags;
                //ApplicationInfo.FLAG_SYSTEM 
                if((flags & ApplicationInfo.FLAG_SYSTEM) != 0 ){
                    //
                    taskInfo.setUserApp(false);
                }else{
//
                    taskInfo.setUserApp(true);
                    
                }
                
                
                

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

                taskInfo.setAppName(processName);
                taskInfo.setIcon(context.getResources().getDrawable(
                        R.drawable.ic_launcher));
            }
            
            TaskInfos.add(taskInfo);
        }

        return TaskInfos;
    }

}
UIUtils.java
public class UIUtils {
    public static void showToast(final Activity context,final String msg){
        if("main".equals(Thread.currentThread().getName())){
            Toast.makeText(context, msg, 1).show();
        }else{
            context.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(context, msg, 1).show();
                }
            });
        }
    }
}
SystemInfoUtils.java 
public class SystemInfoUtils {
    
    public static boolean isServiceRunning(Context context, String className) {

/** *都是管理器
* * ActivityManager 活動(任務/進程)管理器
* * packageManager 包管理器
*/
ActivityManager am
= (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE);
//獲取到手機上所有運行的進程 List
<RunningServiceInfo> infos = am.getRunningServices(200); for (RunningServiceInfo info : infos) { String serviceClassName = info.service.getClassName(); if (className.equals(serviceClassName)) { return true; } } return false; } public static int getProcessCount(Context context) { //得到進程的個數 ActivityManager activityManager = (ActivityManager) context .getSystemService(context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> runningAppProcesses = activityManager .getRunningAppProcesses(); return runningAppProcesses.size(); } public static long getAvailMem(Context context) { //剩餘記憶體 ActivityManager activityManager = (ActivityManager) context .getSystemService(context.ACTIVITY_SERVICE); MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); //得到記憶體的基本信息 activityManager.getMemoryInfo(memoryInfo); return memoryInfo.availMem; } public static long getTotalMem(Context context) { //總記憶體 try { // /proc/meminfo FileInputStream fis = new FileInputStream(new File("/proc/meminfo")); BufferedReader reader = new BufferedReader(new InputStreamReader( fis)); String readLine = reader.readLine(); StringBuffer sb = new StringBuffer(); for (char c : readLine.toCharArray()) { if (c >= '0' && c <= '9') { sb.append(c); } } return Long.parseLong(sb.toString()) * 1024; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } }
TaskInfo.java  javabean
public class TaskInfo {
    
    private Drawable icon;

    private String packageName;
    
    private String appName;
    
    private long memorySize;
    
    private boolean userApp;
    
    private boolean checked;

    public boolean isChecked() {
        return checked;
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
    }

    public Drawable getIcon() {
        return icon;
    }

    public void setIcon(Drawable icon) {
        this.icon = icon;
    }

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public long getMemorySize() {
        return memorySize;
    }

    public void setMemorySize(long memorySize) {
        this.memorySize = memorySize;
    }

    public boolean isUserApp() {
        return userApp;
    }

    public void setUserApp(boolean userApp) {
        this.userApp = userApp;
    }

    @Override
    public String toString() {
        return "TaskInfo [packageName=" + packageName + ", appName=" + appName
                + ", memorySize=" + memorySize + ", userApp=" + userApp + "]";
    }      
}

 SharedPreferencesUtils.java

public class SharedPreferencesUtils {

    public static final String SP_NAME = "config";
    
    public static void saveBoolean(Context context,String key , boolean value){
        SharedPreferences sp = context.getSharedPreferences(SP_NAME, 0);
        sp.edit().putBoolean(key, value).commit();
    }
    
    public static boolean getBoolean(Context context,String key,boolean defValue){
        SharedPreferences sp = context.getSharedPreferences(SP_NAME, 0);
        return sp.getBoolean(key, defValue);
         
    }
}

 





您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近項目需要針對微信、朋友圈、QQ、QQ空間集成友盟分享的功能,說實話,我也是第一次做,期間碰到過很多問題,這篇隨筆就來寫一下我是怎麼集成友盟分享的,還有碰到哪些問題,都是怎樣解決的! 其實集成友盟並不是很難,跟著集成文檔一步一步走下來就可以,而且下載的友盟SDK會附帶Demo,但是Demo中有很... ...
  • 熱更新方案:使用騰訊的tinker,對於加固的apk(360和應用寶2個渠道)不支持 不加固的apk:使用熱更新方案,無需安裝,所有不加固的文件共用一個更新包 加固的apk:使用下載新的完整apk的方案,重新安裝,後臺管理補丁時先上傳加固的補丁apk再上傳不加固共用的補丁文件 增加補丁配置文件(每次 ...
  • /** * bitmap 圖片縮放到指定大小 */ public static Bitmap resizeImage(Bitmap bitmap, int w, int h) { Bitmap BitmapOrg = bitmap; int width = BitmapOrg.getWidth();... ...
  • 個人微信公眾號:zhaoyanjun125 , 歡迎關註 QQ交流群:431048982 ...
  • Paint類的常用的方法 1.setColor方法,用於設置畫筆的顏色,public void setColor(int color)//參數color為顏色值,也可以使用Color類定義的顏色Color.BLACK:黑色Color.BLUE:藍色Color.CYAN:青綠色Color.DKGRAY ...
  • 知識點: 1.UIScrollView使用 2.UIPageControl使用 @interface RootViewController ()<UIScrollViewDelegate> UIScrollView使用 1.UIScrollView創建 2.常用屬性 1)滾動內容大小 2)是否分頁滾 ...
  • 知識點: 1.UITableView搜索功能 <UITableViewDataSource,UITableViewDelegate,UISearchResultsUpdating,UISearchControllerDelegate> UITableView搜索功能 1.UISearchContro ...
  • 一、引言在iOS開發中使用動畫時,可以通過設置動畫的duration、speed、begintime、offset屬性,來設置動畫的時長、速度、起始時間及起始偏移。用一個簡單的例子來說明各個參數的的作用。動畫很簡單,一個紅色的方塊從左移到右邊。動畫的持續時間是1s,沒有重覆,效果如下。 CFTime... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...