你們好,我係蒼王。linux
如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。android
[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表git
這裏是一個全新的系列--進程化github
組件化模塊化延伸後,還能到達進程化。shell
當你能活用組件化模塊化,明白其中的關聯以後,再深刻探究下去,就會走到進程這一步。api
從基礎出發,咱們說一下進程信息,下面所有使用kotlin編寫的api。安全
fun getTotalMemSize():Long{
var size=0L
//系統內存文件
val file = File("/proc/meminfo")
try {
val buffer = BufferedReader(InputStreamReader(FileInputStream(file)))
var memInfo = buffer.readLine()
val startIndex = memInfo.indexOf(":")
val endIndex =memInfo.indexOf("k")
memInfo = memInfo.substring(startIndex+1,endIndex).trim()
size = memInfo.toLong()
size *= 1024
buffer.close()
}catch (e:IOException){
e.printStackTrace()
}
return size
}
複製代碼
fun getAviableMemSize(context:Context):Long{
val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
var mi = ActivityManager.MemoryInfo()
am.getMemoryInfo(mi)
return mi.availMem
}
複製代碼
fun getCurrentProcessId():Int{
return android.os.Process.myPid()
}
複製代碼
fun getCurrentProcessName():String{
var processName = UNKNOWN_PROCESS_NAME
try {
val file = File("/proc/"+ getCurrentProcessId()+"/cmdline")
val buffer = BufferedReader(FileReader(file))
processName = buffer.readLine().trim()
buffer.close()
}catch (e:Exception){
e.printStackTrace()
}
return processName
}
fun getCurrentProcessName():String{
var processName = UNKNOWN_PROCESS_NAME
try {
val file = File("/proc/"+ getCurrentProcessId()+"/cmdline")
val buffer = BufferedReader(FileReader(file))
processName = buffer.readLine().trim()
buffer.close()
}catch (e:Exception){
e.printStackTrace()
}
return processName
}
複製代碼
fun getCurrentProcessName(pid:Int):String{
var processName = UNKNOWN_PROCESS_NAME
try {
val file = File("/proc/"+ pid+"/cmdline")
val buffer = BufferedReader(FileReader(file))
processName = buffer.readLine().trim()
buffer.close()
}catch (e:Exception){
e.printStackTrace()
}
return processName
}
fun getProcessName(context:Context,pid:Int):String{
var processName = getCurrentProcessName(pid)
if (UNKNOWN_PROCESS_NAME .equals(processName)){
val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val runningApps = am.runningAppProcesses
if (runningApps!=null){
for (info in runningApps){
if(info.pid == pid) return info.processName
}
}
}
return processName
}
複製代碼
鏈接電腦,使用adb shell鏈接手機。
而後使用ps能夠查看所有進程的信息。
這裏請注意linux目錄中有個/proc的目錄,這裏記載運行的進程,若是沒有root手機取得最高權限是沒法查看到進程信息的。bash
這裏須要使用ActivityManager 和PackageManager獲取運行進程信息的列表
在5.0之前使用一下的方法來獲取app
/**
* 獲取全部進程信息(5.0之前)
*/
fun getTaskInfos(context:Context):List<TaskBean>?{
val activityManager:ActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val packageManager:PackageManager = context.packageManager
var runList:List<ActivityManager.RunningAppProcessInfo> = activityManager.runningAppProcesses
if(runList.isEmpty()) return null
val list = ArrayList<TaskBean>()
try {
for (info in runList){
val app =packageManager.getPackageInfo(info.processName,0).applicationInfo
//過濾本身當前應用
if (app ==null || context.packageName.equals(app.packageName)) continue
val bean = TaskBean()
bean.pid = info.pid
bean.processName = info.processName //進程名
bean.pInfo = packageManager.getPackageInfo(bean.processName,0) //包信息
bean.appName = app.loadLabel(packageManager).toString() //app名
bean.drawable = app.loadIcon(packageManager) //app圖標
bean.pakcageName = app.packageName //包名
//系統應用
if((app.flags and ApplicationInfo.FLAG_SYSTEM) >0){
bean.isSystem = true
}else{
bean.isUser = true
}
val memoryInfo = activityManager.getProcessMemoryInfo(IntArray(info.pid))
val memsize:Double = memoryInfo[0].dalvikPrivateDirty/1024.0
bean.memSize = memsize
list.add(bean)
}
}catch (e:PackageManager.NameNotFoundException){
e.printStackTrace()
}
return list
}
複製代碼
在Android5.0之後,使用以上的方法,只能獲取前臺運行的app所在進程的的信息
Android5.0~7.0 可使用AndroidProcessor開源庫獲取
其原理是讀取/proc/裏面進程號爲數字的進程的信息
7.0之後google限制了,app只能在/proc/讀取到我的的進程信息。模塊化
UsageStatsManager是5.0 纔開始有的,用於記錄應用的使用信息, 入應用在某段時間內處於前臺和後臺的時間,最近一次啓動的時間等。
使用它以前須要在AndroidManifest中配置 「android.permission.PACKAGE_USAGE_STATS」的權限,必須勾選安全的權限配置才能打開
/**
* 獲取全部進程信息(5.0之後)
*/
fun getTaskInfosL(context:Context):List<TaskBean>?{
val list = ArrayList<TaskBean>()
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
val packageManager:PackageManager = context.packageManager
val usm = context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
val calendar = Calendar.getInstance()
//結束時間
val endTime = calendar.timeInMillis
calendar.add(Calendar.YEAR, -1)
//開始時間
val startTime = calendar.timeInMillis
val usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime)
for(usage in usageStatsList){
try {
val bean = TaskBean()
val app = packageManager.getPackageInfo(usage.packageName, 0).applicationInfo
bean.pakcageName = usage.packageName
bean.processName = app.processName
bean.pInfo = packageManager.getPackageInfo(bean.processName, 0)
bean.appName = app.loadLabel(packageManager).toString() //app名
bean.drawable = app.loadIcon(packageManager) //app圖標
//系統應用
if ((app.flags and ApplicationInfo.FLAG_SYSTEM) > 0) {
bean.isSystem = true
} else {
bean.isUser = true
}
list.add(bean)
}catch (e:Exception){
e.printStackTrace()
}
}
}
return list
}
複製代碼
UsageStats 中沒法獲取進程pid,usageStats只是記錄進程運行的記錄,因此這種方法沒辦法得到佔用的內存信息,適用於7.0 以上的系統。
fun openSpecifiedApp(context:Context,packageName:String){
val manager = context.packageManager
val lauchIntentForPackage = manager.getLaunchIntentForPackage(packageName)
context.startActivity(lauchIntentForPackage)
}
複製代碼
fun showAppInfo(context: Context,packageName:String){
val intent = Intent()
intent.action = "android.settings.APPLICATION_DETAILS_SETTINGS"
intent.data = Uri.parse("package:" + packageName)
context.startActivity(intent)
}
複製代碼
需添加在AndroidManifest中添加<uses-permission android:name="android.permission.GET_TASKS"/>的權限
fun isAppForground(context: Context,packageName:String):Boolean{
val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
var task = am.getRunningTasks(1)
if(!task.isEmpty()){
val top = task.get(0).topActivity
if (top.packageName.equals(context.packageName)){
return true
}
}
return false
}
複製代碼
組件化的羣裏已經快滿員了,這是新開的進程化的新羣。
Stay hugry ,stay foolish!