[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以前使用一下的方法來獲取
在Android5.0以后,使用以上的方法,只能獲取前臺運行的app所在進程的的信息
Android5.0~7.0 可以使用AndroidProcessor開源庫獲取
其原理是讀取/proc/里面進程號為數字的進程的信息
7.0以后google限制了,app只能在/proc/讀取到個人的進程信息。
通過UsageStatsManager獲取
UsageStatsManager是5.0 才開始有的,用于記錄應用的使用信息, 入應用在某段時間內處于前臺和后臺的時間,最近一次啟動的時間等。
使用它之前需要在AndroidManifest中配置 “android.permission.PACKAGE_USAGE_STATS”的權限,必須勾選安全的權限配置才能打開
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进程化--进程信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 反射、代理调用系统隐藏A
- 下一篇: [Android]你不知道的Androi