日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

[Android]你不知道的Android进程化--进程信息

發布時間:2025/3/15 Android 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Android]你不知道的Android进程化--进程信息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里是一個全新的系列--進程化

組件化模塊化延伸后,還能到達進程化。

當你能活用組件化模塊化,明白其中的關聯之后,再深入探究下去,就會走到進程這一步。

從基礎出發,我們說一下進程信息,下面全部使用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 *= 1024buffer.close()}catch (e:IOException){e.printStackTrace()}return size}


獲取可用內存

fun getAviableMemSize(context:Context):Long{val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManagervar mi = ActivityManager.MemoryInfo()am.getMemoryInfo(mi)return mi.availMem}

獲取當前進程id

fun getCurrentProcessId():Int{return android.os.Process.myPid()}


獲取當前進程名

fun getCurrentProcessName():String{var processName = UNKNOWN_PROCESS_NAMEtry {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_NAMEtry {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_NAMEtry {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 ActivityManagerval runningApps = am.runningAppProcessesif (runningApps!=null){for (info in runningApps){if(info.pid == pid) return info.processName}}}return processName}


使用命令獲取adb手機進程

連接電腦,使用adb shell連接手機。
然后使用ps可以查看全部進程的信息。
這里請注意linux目錄中有個/proc的目錄,這里記載運行的進程,如果沒有root手機取得最高權限是無法查看到進程信息的。

通過代碼獲取全部的進程信息

這里需要使用ActivityManager 和PackageManager獲取運行進程信息的列表
在5.0以前使用一下的方法來獲取

/*** 獲取所有進程信息(5.0以前)*/fun getTaskInfos(context:Context):List<TaskBean>?{val activityManager:ActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManagerval packageManager:PackageManager = context.packageManagervar runList:List<ActivityManager.RunningAppProcessInfo> = activityManager.runningAppProcessesif(runList.isEmpty()) return nullval list = ArrayList<TaskBean>()try {for (info in runList){val app =packageManager.getPackageInfo(info.processName,0).applicationInfo//過濾自己當前應用if (app ==null || context.packageName.equals(app.packageName)) continueval bean = TaskBean()bean.pid = info.pidbean.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.0bean.memSize = memsizelist.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獲取

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.packageManagerval usm = context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManagerval calendar = Calendar.getInstance()//結束時間val endTime = calendar.timeInMilliscalendar.add(Calendar.YEAR, -1)//開始時間val startTime = calendar.timeInMillisval usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime)for(usage in usageStatsList){try {val bean = TaskBean()val app = packageManager.getPackageInfo(usage.packageName, 0).applicationInfobean.pakcageName = usage.packageNamebean.processName = app.processNamebean.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 以上的系統。

打開指定包名的App

fun openSpecifiedApp(context:Context,packageName:String){val manager = context.packageManagerval lauchIntentForPackage = manager.getLaunchIntentForPackage(packageName)context.startActivity(lauchIntentForPackage)}

打開指定包名的App應用信息界面

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)}

當前app處于前臺還是后臺

需添加在AndroidManifest中添加<uses-permission android:name="android.permission.GET_TASKS"/>的權限

fun isAppForground(context: Context,packageName:String):Boolean{val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManagervar task = am.getRunningTasks(1)if(!task.isEmpty()){val top = task.get(0).topActivityif (top.packageName.equals(context.packageName)){return true}}return false}

組件化的群里已經快滿員了,這是新開的進程化的新群。
Stay hugry ,stay foolish!


作者:Cang_Wang
鏈接:https://juejin.im/post/5a1f88baf265da43163cd8f4
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

總結

以上是生活随笔為你收集整理的[Android]你不知道的Android进程化--进程信息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。