热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[Android]你不知道的Android进程化(1)进程信息

大家好,我系苍王。以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。[Android]如何做一个崩溃率少于千分之三噶应用app–章节列表这里是一个全新的

大家好,我系苍王。

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

[Android]如何做一个崩溃率少于千分之三噶应用app–章节列表

这里是一个全新的系列–进程化

组件化模块化延伸后,还能到达进程化。

当你能活用组件化模块化,明白其中的关联之后,再深入探究下去,就会走到进程这一步。

从基础出发,我们说一下进程信息,下面全部使用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
}

获取当前进程id

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手机进程

连接电脑,使用adb shell连接手机。
然后使用ps可以查看全部进程的信息。
这里请注意linux目录中有个/proc的目录,这里记载运行的进程,如果没有root手机取得最高权限是无法查看到进程信息的。

《[Android]你不知道的Android进程化(1)--进程信息》 image.png

通过代码获取全部的进程信息

这里需要使用ActivityManager 和PackageManager获取运行进程信息的列表
在5.0以前使用一下的方法来获取

/**
* 获取所有进程信息(5.0以前)
*/
fun getTaskInfos(context:Context):List?{
val activityManager:ActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val packageManager:PackageManager = context.packageManager
var runList:List = activityManager.runningAppProcesses
if(runList.isEmpty()) return null
val list = ArrayList()
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获取

UsageStatsManager是5.0 才开始有的,用于记录应用的使用信息, 入应用在某段时间内处于前台和后台的时间,最近一次启动的时间等。
使用它之前需要在AndroidManifest中配置 “android.permission.PACKAGE_USAGE_STATS”的权限,必须勾选安全的权限配置才能打开

/**
* 获取所有进程信息(5.0以后)
*/
fun getTaskInfosL(context:Context):List?{
val list = ArrayList()
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 以上的系统。

打开指定包名的App

fun openSpecifiedApp(context:Context,packageName:String){
val manager = context.packageManager
val 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中添加的权限

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!

《[Android]你不知道的Android进程化(1)--进程信息》 Android进程化交流


推荐阅读
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 本文介绍了如何在 Node.js 中使用 `setDefaultEncoding` 方法为可写流设置默认编码,并提供了详细的语法说明和示例代码。 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • 如何使用Ping命令来测试网络连接?当网卡安装和有关参数配置完成后,可以使用ping命令来测试一下网络是否连接成功。以winXP为例1、打开XP下DOS窗口具体操作是点击“开始”菜 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 我有一个SpringRestController,它处理API调用的版本1。继承在SpringRestControllerpackagerest.v1;RestCon ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
  • 本文总结了优化代码可读性的核心原则与技巧,通过合理的变量命名、函数和对象的结构化组织,以及遵循一致性等方法,帮助开发者编写更易读、维护性更高的代码。 ... [详细]
  • 黑马头条项目:Vue 文章详情模块与交互功能实现
    本文详细介绍了如何在黑马头条项目中配置文章详情模块的路由、获取和展示文章详情数据,以及实现关注、点赞、不喜欢和评论功能。通过这些步骤,您可以全面了解如何开发一个完整的前端文章详情页面。 ... [详细]
author-avatar
我可不是文章
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有