Android 手機衛士12--進程管理

来源:http://www.cnblogs.com/ganchuanpu/archive/2016/10/20/5982584.html
-Advertisement-
Play Games

1.本進程不能被選中,所以先將checkbox隱藏掉--手機衛士 不能自殺 2.清理選中進程 3.ProcessInfoProvider.java 1 package com.itheima.mobilesafe74.engine; 2 3 import java.io.BufferedReader ...


1.本進程不能被選中,所以先將checkbox隱藏掉--手機衛士 不能自殺

if(getItem(position).packageName.equals(getPackageName())){
	holder.cb_box.setVisibility(View.GONE);
}else{
	holder.cb_box.setVisibility(View.VISIBLE);
}

 

2.清理選中進程

private void clearAll() {
	//1,獲取選中進程
	//2,創建一個記錄需要殺死的進程的集合
	List<ProcessInfo> killProcessList = new ArrayList<ProcessInfo>();
	for(ProcessInfo processInfo:mCustomerList){
		if(processInfo.getPackageName().equals(getPackageName())){
			continue;
		}
		if(processInfo.isCheck){
			//不能在集合迴圈過程中去移除集合中的對象
//				mCustomerList.remove(processInfo);
			//3,記錄需要殺死的用戶進程
			killProcessList.add(processInfo);
		}
	}
	
	for(ProcessInfo processInfo:mSystemList){
		if(processInfo.isCheck){
			//4,記錄需要殺死的系統進程
			killProcessList.add(processInfo);
		}
	}
	//5,迴圈遍歷killProcessList,然後去移除mCustomerList和mSystemList中的對象
	long totalReleaseSpace = 0;
	for (ProcessInfo processInfo : killProcessList) {
		//6,判斷當前進程在那個集合中,從所在集合中移除
		if(mCustomerList.contains(processInfo)){
			mCustomerList.remove(processInfo);
		}
		
		if(mSystemList.contains(processInfo)){
			mSystemList.remove(processInfo);
		}
		//7,殺死記錄在killProcessList中的進程
		ProcessInfoProvider.killProcess(this,processInfo);
		
		//記錄釋放空間的總大小
		totalReleaseSpace += processInfo.memSize;
	}
	//8,在集合改變後,需要通知數據適配器刷新
	if(mAdapter!=null){
		mAdapter.notifyDataSetChanged();
	}
	//9,進程總數的更新
	mProcessCount -= killProcessList.size();
	//10,更新可用剩餘空間(釋放空間+原有剩餘空間 == 當前剩餘空間)
	mAvailSpace += totalReleaseSpace;
	//11,根據進程總數和剩餘空間大小
	tv_process_count.setText("進程總數:"+mProcessCount);
	tv_memory_info.setText("剩餘/總共"+Formatter.formatFileSize(this, mAvailSpace)+"/"+mStrTotalSpace);
	//12,通過吐司告知用戶,釋放了多少空間,殺死了幾個進程,
	String totalRelease = Formatter.formatFileSize(this, totalReleaseSpace);
//		ToastUtil.show(getApplicationContext(), "殺死了"+killProcessList.size()+"個進程,釋放了"+totalRelease+"空間");
	
//		jni  java--c   c---java
	//占位符指定數據%d代表整數占位符,%s代表字元串占位符
	ToastUtil.show(getApplicationContext(), 
			String.format("殺死了%d進程,釋放了%s空間", killProcessList.size(),totalRelease));
}

 

3.ProcessInfoProvider.java

  1 package com.itheima.mobilesafe74.engine;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.FileNotFoundException;
  5 import java.io.FileReader;
  6 import java.io.IOException;
  7 import java.util.ArrayList;
  8 import java.util.List;
  9 
 10 import com.itheima.mobilesafe74.R;
 11 import com.itheima.mobilesafe74.db.domain.ProcessInfo;
 12 
 13 import android.app.ActivityManager;
 14 import android.app.ActivityManager.MemoryInfo;
 15 import android.app.ActivityManager.RunningAppProcessInfo;
 16 import android.content.Context;
 17 import android.content.pm.ApplicationInfo;
 18 import android.content.pm.PackageManager;
 19 import android.content.pm.PackageManager.NameNotFoundException;
 20 
 21 public class ProcessInfoProvider {
 22     //獲取進程總數的方法
 23     public static int getProcessCount(Context ctx){
 24         //1,獲取activityManager
 25         ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
 26         //2,獲取正在運行進程的集合
 27         List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();
 28         //3,返回集合的總數
 29         return runningAppProcesses.size();
 30     }
 31     
 32     
 33     /**
 34      * @param ctx    
 35      * @return 返回可用的記憶體數    bytes
 36      */
 37     public static long getAvailSpace(Context ctx){
 38         //1,獲取activityManager
 39         ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
 40         //2,構建存儲可用記憶體的對象
 41         MemoryInfo memoryInfo = new MemoryInfo();
 42         //3,給memoryInfo對象賦(可用記憶體)值
 43         am.getMemoryInfo(memoryInfo);
 44         //4,獲取memoryInfo中相應可用記憶體大小
 45         return memoryInfo.availMem;
 46     }   
 47     
 48     
 49     /**
 50      * @param ctx    
 51      * @return 返回總的記憶體數    單位為bytes 返回0說明異常
 52      */
 53     public static long getTotalSpace(Context ctx){
 54         /*//1,獲取activityManager
 55         ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
 56         //2,構建存儲可用記憶體的對象
 57         MemoryInfo memoryInfo = new MemoryInfo();
 58         //3,給memoryInfo對象賦(可用記憶體)值
 59         am.getMemoryInfo(memoryInfo);
 60         //4,獲取memoryInfo中相應可用記憶體大小
 61         return memoryInfo.totalMem;*/
 62         
 63         //記憶體大小寫入文件中,讀取proc/meminfo文件,讀取第一行,獲取數字字元,轉換成bytes返回
 64         FileReader fileReader  = null;
 65         BufferedReader bufferedReader = null;
 66         try {
 67             fileReader= new FileReader("proc/meminfo");
 68             bufferedReader = new BufferedReader(fileReader);
 69             String lineOne = bufferedReader.readLine();
 70             //將字元串轉換成字元的數組
 71             char[] charArray = lineOne.toCharArray();
 72             //迴圈遍歷每一個字元,如果此字元的ASCII碼在0到9的區域內,說明此字元有效
 73             StringBuffer stringBuffer = new StringBuffer();
 74             for (char c : charArray) {
 75                 if(c>='0' && c<='9'){
 76                     stringBuffer.append(c);
 77                 }
 78             }
 79             return Long.parseLong(stringBuffer.toString())*1024;
 80         } catch (Exception e) {
 81             e.printStackTrace();
 82         }finally{
 83             try {
 84                 if(fileReader!=null && bufferedReader!=null){
 85                     fileReader.close();
 86                     bufferedReader.close();
 87                 }
 88             } catch (IOException e) {
 89                 e.printStackTrace();
 90             }
 91         }
 92         return 0;
 93     }  
 94     
 95     /**
 96      * @param ctx    上下文環境
 97      * @return        當前手機正在運行的進程的相關信息
 98      */
 99     public static List<ProcessInfo> getProcessInfo(Context ctx){
100         //獲取進程相關信息
101         List<ProcessInfo> processInfoList = new ArrayList<ProcessInfo>();
102         //1,activityManager管理者對象和PackageManager管理者對象
103         ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
104         PackageManager pm = ctx.getPackageManager();
105         //2,獲取正在運行的進程的集合
106         List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();
107     
108         //3,迴圈遍歷上訴集合,獲取進程相關信息(名稱,包名,圖標,使用記憶體大小,是否為系統進程(狀態機))
109         for (RunningAppProcessInfo info : runningAppProcesses) {
110             ProcessInfo processInfo = new ProcessInfo();
111             //4,獲取進程的名稱 == 應用的包名
112             processInfo.packageName = info.processName;
113             //5,獲取進程占用的記憶體大小(傳遞一個進程對應的pid數組)
114             android.os.Debug.MemoryInfo[] processMemoryInfo = am.getProcessMemoryInfo(new int[]{info.pid});
115             //6,返回數組中索引位置為0的對象,為當前進程的記憶體信息的對象
116             android.os.Debug.MemoryInfo memoryInfo = processMemoryInfo[0];
117             //7,獲取已使用的大小
118             processInfo.memSize = memoryInfo.getTotalPrivateDirty()*1024;
119             
120             try {
121                 ApplicationInfo applicationInfo = pm.getApplicationInfo(processInfo.packageName, 0);
122                 //8,獲取應用的名稱
123                 processInfo.name = applicationInfo.loadLabel(pm).toString();
124                 //9,獲取應用的圖標
125                 processInfo.icon = applicationInfo.loadIcon(pm);
126                 //10,判斷是否為系統進程
127                 if((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == ApplicationInfo.FLAG_SYSTEM){
128                     processInfo.isSystem = true;
129                 }else{
130                     processInfo.isSystem = false;
131                 }
132             } catch (NameNotFoundException e) {
133                 //需要處理
134                 processInfo.name = info.processName;
135                 processInfo.icon = ctx.getResources().getDrawable(R.drawable.ic_launcher);
136                 processInfo.isSystem = true;
137                 e.printStackTrace();
138             }
139             processInfoList.add(processInfo);
140         }
141         return processInfoList;
142     }
143 
144 
145     /**
146      * 殺進程方法
147      * @param ctx    上下文環境
148      * @param processInfo    殺死進程所在的javabean的對象
149      */
150     public static void killProcess(Context ctx,ProcessInfo processInfo) {
151         //1,獲取activityManager
152         ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
153         //2,殺死指定包名進程(許可權)
154         am.killBackgroundProcesses(processInfo.packageName);
155     }
156 }
ProcessInfoProvider

 


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

-Advertisement-
Play Games
更多相關文章
  • 前言 學習本系列內容需要具備一定 HTML 開發基礎,沒有基礎的朋友可以先轉至 "HTML快速入門(一)" 學習 本人接觸 React Native 時間並不是特別長,所以對其中的內容和性質瞭解可能會有所偏差,在學習中如果有錯會及時修改內容,也歡迎萬能的朋友們批評指出,謝謝 文章第一版出自簡書,如果 ...
  • TextView 顯示文本框控制項, EditText 輸入文本框 ...
  • SharedPreferences 一種輕量級的數據保存方式 以鍵值對的方式存儲 用於存儲小批量的數據 使用方法: SharedPreferences sp= getSharedPreferences("myopt"(文件名),Context.MODE_PRIVATE(數據存儲方式)); 存儲文件名 ...
  • 手機APP在日常生活中越來越與我們息息相關,既然這些APP是用戶每天都必須接觸到的,所以APP更應該從用戶的角度來進行設計。APP開發並沒有什麼固定的法則,也沒有現成的模式可依,只有不斷從用戶的實踐中,從用戶的一言一行當中去考慮用戶的體驗才能設計出用戶體驗良好的APP。 ...
  • Android Weekly中文筆記, Issue #227. 本期內容包括: Google的Mobile Vision API 人臉檢測; Firebase的Remote Config; 與HashMap有關的優化; 提高RecyclerView幀率的優化; 使用AutoValue生成model代... ...
  • 當需要實現一個自定義佈局圖片和標題的按鈕時候,不知道有多少少年直接佈局了UIButton,亦或是自定義一個UIView,然後以空白UIButton、UILabel、UIImageVew作為subViews。 兩者其實都一樣,因為UIButton的內部subViews中,就已經存在一個UILabel和 ...
  • 前言 iOS extension的出現,方便了用戶查看應用的服務,比如用戶可以在Today的widgets中查看應用的簡略信息,然後點擊進入相關的應用界面。暫且不表網路上現有的widget文章,本篇文章主要說明本人具體實現widget的步驟,希望能夠幫助到需要實現widget的同行朋友。 圖1 To ...
  • 1.顯示隱藏系統進程 修改ProcessManagerActivity的Adapter 2.鎖屏清理 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...