- 浏览: 114784 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (98)
- java (27)
- jms (2)
- jta (0)
- 性能调优及内存分析 (4)
- 设计模式 (14)
- 框架 (6)
- 其它 (9)
- job (1)
- maven (1)
- 服务器 (2)
- 分布式 (3)
- ibatis (1)
- linux (0)
- mysql (0)
- 并发编程 (0)
- java多线程 (2)
- 前端跨域 (1)
- 线程dump分析 (0)
- velocity (0)
- 数据库 (2)
- 协议 (0)
- 监控 (0)
- 开源软件 (2)
- 算法 (0)
- 网络 (1)
- spring (1)
- 编码 (0)
- 数据结构 (0)
- HTable和HTablePool使用注意事项 (0)
- opencms (0)
- android (16)
- 操作系统 (2)
- top (0)
最新评论
-
hold_on:
@Override public boolea ...
android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片) -
achersnake:
123
Servlet中listener(监听器)和filter的总结 -
angel243fly:
我用了这个方法,还是报同样的错误,还有什么建议吗?
eclipse提示CreateProcess error=87错误的解决方法
http://blog.csdn.net/qinjuning
本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括
进程 (Process)等、应用程序/包、服务(Service)、任务(Task)信息。
计划如下:
第一部分:获取系统可用内存以及所有的正在运行的进程信息 ;
第二部分:获取每个进程里运行的应用程序信息和所有正在运行的应用程序
第三部分:获取正在运行的服务和任务信息。
每部分都准备了相应的Demo,助您更深的理解.
知识准备:Android 应用程序模块: 应用、任务、进程 的知识介绍:
1 一个android 包 (简称.apk ) :里面包含应用程序的代码以及资源。这是一个应用发布,用户能下载并安装他们
设备上的文件。
2 一个 任务 :通常用户能当它为一个“应用程序”来启动:通常在桌面上会有一个图标可以来启动任务,这是一个
上层的应 用,可以将你的任务切换到前台来。
3 一个 进程 :是一个底层的代码运行级别的核心进程。通常.apk包里所有代码运行在一个进程里,一个进程对于
一个.apk包;然而, 进程 标签常用来改变代码运行的位置,可以是 全部的.apk包 或者是独立的 活动 , 接收器 , 服务 , 或者
提供器 组件。
进程
在Android中,进程是应用程序的完整实现,而不是用户通常了解的那样。他们主要用途很简单:
1、提高稳定性和安全性,将不信任或者不稳定的代码移动到其他进程。
2、可将多个.apk包运行在同一个进程里减少系统开销。
3、帮助系统管理资源,将重要的代码放在一个单独的进程里,这样就可以单独销毁应用程序的其他部分。
于是,为了完成某一任务或者减少系统资源的开销,一个进程里可以运行一个或多个应用程序 。
更多知识点获取,请访问:《Android 应用程序模块: 应用, 任务, 进程, 和线程 》
ActivityManager 类:
获取方法 ActivityManager mActivityManager (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
常用的静态内部类如下 (下面具体介绍):
ActivityManager.MemoryInfo : 系统可用内存信息
ActivityManager.RecentTaskInfo : 最近的任务信息
ActivityManager.RunningAppProcessInfo : 正在运行的进程信息
ActivityManager.RunningServiceInfo : 正在运行的服务信息
ActivityManager.RunningTaskInfo : 正在运行的任务信息
常用方法:
public void getMemoryInfo (ActivityManager.MemoryInfo outInfo)
说明:获取系统可用内存信息,数据封装在outInfo对象上
public Debug.MemoryInfo getProcessMemoryInfo (int[ ] pids
说明:获取每个进程ID(集合)占用的内存大小(集合), pid和MemoryInfo是一一对应的。
参数: pids 进程ID的集合
PS :我们可以通过调用Debug.MemoryInfo 的dalvikPrivateDirty 字段获取进程占用的内存大小(单位为KB)
public List<ActivityManager.RunningAppProcessInfo>getRunningAppProcess ()
说明: 获取系统里正在运行的进程
public List < ActivityManager.RunningServiceInfo > getRunningServices (int maxNum)
说明: 获取系统里所有正在运行的服务
参数:可能服务的最大值(赋予一常数即可,20、50都OK)
public List < ActivityManager.RunningTaskInfoo > getRunningTasks (int maxNum)
说明:获取系统里正在运行的服务
参数: 同上
public List < ActivityManager.RecentTaskInfo > getRecentTasks (int maxNum, int flags)
说明:获取系统里最近启动的任务
参数: 同上,flags一般为0即可
public voidkillBackgroundProcess (String packageName)
说明:立即杀掉给定包名的进程,释放进程占用的资源(内存等),如果需要,系统会再次重新启动该进程。系统
PS:系统进程是杀不死的,只能杀死用户进程 。但我没有找到好的方法辨别系统进程还是用户进程。但可以肯定的是,
能 够杀死的一定是用户进程。
public void restartPackage(String packageName)
说明:该方法已弃用,等同于killBackgroundProcess 。
ActivityManager.MemoryInfo类
常用字段:
long availMem 系统可用内存
long threshold 系统内存不足的阀值,即临界值
boolean lowMemory 如果当前可用内存<= threshold ,该值为真
ActivityManager.RunningAppProcessInfo类
常用字段:
int pid 进程ID
int uid 进程所在的用户ID
String processName 进程名,默认是包名或者由android:process=””属性指定
String [ ] pkgList 运行在该进程下的所有应用程序包名
对 ActivityManager.RecentTaskInfo 、 ActivityManager.RunningServiceInfo 、 ActivityManager.RunningTaskInfo
类的介绍 留在后文介绍。
DEMO说明:
我们通过ActivityManager获取了系统的可用内存信息以及正在运行在系统里的进程具体信息,当然你也可以选择
手动杀死 这些进程,不过前提是用户进程,因为系统进程是杀不死的。
模拟器上的截图如下:
资源文件什么的就不再贴代码了,直接列出逻辑文件。
获取系统可用内存的代码 :MainActivity.java
- package com.qin.ammp;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.Activity;
- import android.app.ActivityManager;
- import android.app.ActivityManager.MemoryInfo;
- import android.content.Context;
- import android.content.Intent;
- import android.os.Bundle;
- import android.os.Debug;
- import android.text.format.Formatter;
- import android.util.Log;
- import android.view.View;
- import android.widget.Button;
- import android.widget.TextView;
- public class MainActivity extends Activity {
- private static String TAG = "AM_MEMORYIPROCESS" ;
- private ActivityManager mActivityManager = null ;
- private TextView tvAvailMem ;
- private Button btProcessInfo ;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super .onCreate(savedInstanceState);
- setContentView(R.layout.main);
- tvAvailMem = (TextView)findViewById(R.id.tvAvailMemory) ;
- btProcessInfo =(Button)findViewById(R.id.btProcessInfo);
- //跳转到显示进程信息界面
- btProcessInfo.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Intent intent = new Intent(MainActivity. this ,BrowseProcessInfoActivity. class );
- startActivity(intent);
- }
- });
- //获得ActivityManager服务的对象
- mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
- //获得可用内存信息
- String availMemStr = getSystemAvaialbeMemorySize();
- Log.i(TAG, "The Availabel Memory Size is" +availMemStr);
- //显示
- tvAvailMem.setText(availMemStr);
- }
- //获得系统可用内存信息
- private String getSystemAvaialbeMemorySize(){
- //获得MemoryInfo对象
- MemoryInfo memoryInfo = new MemoryInfo() ;
- //获得系统可用内存,保存在MemoryInfo对象上
- mActivityManager.getMemoryInfo(memoryInfo) ;
- long memSize = memoryInfo.availMem ;
- //字符类型转换
- String availMemStr = formateFileSize(memSize);
- return availMemStr ;
- }
- //调用系统函数,字符串转换 long -String KB/MB
- private String formateFileSize( long size){
- return Formatter.formatFileSize(MainActivity. this , size);
- }
- }
获取系统进程信息的代码
:BrowseProcessInfoActivity .java
- package com.qin.ammp;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.Activity;
- import android.app.ActivityManager;
- import android.app.AlertDialog;
- import android.app.Dialog;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.os.Bundle;
- import android.os.Debug;
- import android.util.Log;
- import android.view.ContextMenu;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.view.ContextMenu.ContextMenuInfo;
- import android.widget.AdapterView;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.AdapterView.OnItemClickListener;
- public class BrowseProcessInfoActivity extends Activity implements OnItemClickListener{
- private static String TAG = "ProcessInfo" ;
- private static final int KILL_PORCESS = 1 ;
- private static final int SEARCH_RUNNING_APP = 2 ;
- private ActivityManager mActivityManager = null ;
- // ProcessInfo Model类 用来保存所有进程信息
- private List<ProcessInfo> processInfoList = null ;
- private ListView listviewProcess;
- private TextView tvTotalProcessNo ;
- public void onCreate(Bundle savedInstanceState) {
- super .onCreate(savedInstanceState);
- setContentView(R.layout.browse_process_list);
- listviewProcess = (ListView) findViewById(R.id.listviewProcess);
- listviewProcess.setOnItemClickListener(this );
- tvTotalProcessNo =(TextView)findViewById(R.id.tvTotalProcessNo);
- this .registerForContextMenu(listviewProcess);
- // 获得ActivityManager服务的对象
- mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
- // 获得系统进程信息
- getRunningAppProcessInfo();
- // 为ListView构建适配器对象
- BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(
- this , processInfoList);
- listviewProcess.setAdapter(mprocessInfoAdapter);
- tvTotalProcessNo.setText("当前系统进程共有:" +processInfoList.size());
- }
- //杀死该进程,并且刷新
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, final int position, long arg3) {
- // TODO Auto-generated method stub
- new AlertDialog.Builder( this ).setMessage( "是否杀死该进程" )
- .setPositiveButton("确定" , new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- // TODO Auto-generated method stub
- //杀死该进程,释放进程占用的空间
- mActivityManager.killBackgroundProcesses(processInfoList.get(position).getProcessName());
- //刷新界面
- getRunningAppProcessInfo() ;
- BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(
- BrowseProcessInfoActivity.this , processInfoList);
- listviewProcess.setAdapter(mprocessInfoAdapter);
- tvTotalProcessNo.setText("当前系统进程共有:" +processInfoList.size());
- }
- }).setNegativeButton("取消" , new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- // TODO Auto-generated method stub
- dialog.cancel() ;
- }
- }).create().show() ;
- }
- // 获得系统进程信息
- private void getRunningAppProcessInfo() {
- // ProcessInfo Model类 用来保存所有进程信息
- processInfoList = new ArrayList<ProcessInfo>();
- // 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
- List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager
- .getRunningAppProcesses();
- for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {
- // 进程ID号
- int pid = appProcessInfo.pid;
- // 用户ID 类似于Linux的权限不同,ID也就不同 比如 root等
- int uid = appProcessInfo.uid;
- // 进程名,默认是包名或者由属性android:process=""指定
- String processName = appProcessInfo.processName;
- // 获得该进程占用的内存
- int [] myMempid = new int [] { pid };
- // 此MemoryInfo位于android.os.Debug.MemoryInfo包中,用来统计进程的内存信息
- Debug.MemoryInfo[] memoryInfo = mActivityManager
- .getProcessMemoryInfo(myMempid);
- // 获取进程占内存用信息 kb单位
- int memSize = memoryInfo[ 0 ].dalvikPrivateDirty;
- Log.i(TAG, "processName: " + processName + " pid: " + pid
- + " uid:" + uid + " memorySize is -->" + memSize + "kb" );
- // 构造一个ProcessInfo对象
- ProcessInfo processInfo = new ProcessInfo();
- processInfo.setPid(pid);
- processInfo.setUid(uid);
- processInfo.setMemSize(memSize);
- processInfo.setPocessName(processName);
- processInfoList.add(processInfo);
- // 获得每个进程里运行的应用程序(包),即每个应用程序的包名
- String[] packageList = appProcessInfo.pkgList;
- Log.i(TAG, "process id is " + pid + "has " + packageList.length);
- for (String pkg : packageList) {
- Log.i(TAG, "packageName " + pkg + " in process id is -->" + pid);
- }
- }
- }
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- menu.add(0 , 0 , KILL_PORCESS, "杀死该进程" );
- menu.add(0 , 0 , SEARCH_RUNNING_APP, "运行在该进程的应用程序" );
- super .onCreateContextMenu(menu, v, menuInfo);
- }
- public boolean onContextItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case KILL_PORCESS: // 杀死该进程 , 重新加载界面
- new AlertDialog.Builder( this ).setMessage( "是否杀死该进程" )
- .setPositiveButton("确定" , new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- // TODO Auto-generated method stub
- }
- }).setNegativeButton("取消" , new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- // TODO Auto-generated method stub
- dialog.cancel() ;
- }
- }).create().show() ;
- break ;
- case SEARCH_RUNNING_APP: // 查看运行在该进程的应用程序信息
- break ;
- default :
- break ;
- }
- return super .onContextItemSelected(item);
- }
- }
我们可以通过进程占用内存大小来进而获取占用cpu大小,直接换算还是很简单的。
源代码地址: http://download.csdn.net/detail/qinjuning/3803314
发表评论
-
android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片)
2013-01-15 20:02 2910http://blog.csdn.net/jj120522 ... -
Maven Android Plugin
2013-01-06 16:20 1641Maven Android Plugin h ... -
解决Android模拟器无法用PC键盘输入与模拟器外部功能添加.
2013-01-06 16:20 1490公司发了PC后重新装了Android开发环境. 但是在模拟器上 ... -
Android Fragment使用
2012-12-20 17:29 906你可以像为View一样, 为fragment指定lay ... -
Android异步处理四:AsyncTask的实现原理
2012-12-14 09:08 1035在《Android异步处理二:使用AsyncTask异步 ... -
Android异步处理三:Handler+Looper+MessageQueue深入详解
2012-12-14 09:06 1021在《Android异步处理一:使用Thread+Hand ... -
Android异步处理二:使用AsyncTask异步更新UI界面
2012-12-14 09:00 1076在《Android异步处理一:使用Thread+Hand ... -
Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
2012-12-14 08:48 1044概述:每个Android应用程序都运行在一个dalvik ... -
Android 中LayoutInflater的使用
2012-12-11 20:11 0大家好我们这一节讲的是LayoutInflater的使用,在实 ... -
邵洋江 android之tabhost讲解
2012-12-11 19:15 0Tab标签页是界面设计时经常使用的界面控件,可以实现多个分页之 ... -
android Bitmap用法总结
2012-12-10 13:09 0android Bitmap用法总结 http://ww ... -
Parcelable接口应用
2012-11-30 19:53 0Android中Intent传递对象有两个方法,一个是让 ... -
常用的android弹出对话框
2012-11-09 08:47 0http://blog.csdn.net/chenlei ... -
Android实现推送方式解决方案
2012-11-07 13:44 0转:http://www.cnblogs.com/han ... -
Android 之 下拉框(Spinner)的使用
2012-11-06 15:16 0下拉列表 Spinner。 Spinner的使用,可以极 ... -
android ListView添加事件并获取选中项的值
2012-11-05 11:45 0转:http://www.beijibear.com/?aid ... -
Android 用TextView做菜单的多个onClick事件的处理
2012-11-02 19:23 0TextView控件使用OnClick事件监听的时候,会遇到一 ... -
在ListView中显示网络图片
2012-11-02 08:30 1153最近在做一个天气预报的例子,想在ListView中添加网 ... -
android ListView详解
2012-11-01 09:43 0在android开发中ListView是比较常用的组件, ... -
Android用Application设置全局变量以及使用
2012-10-21 14:08 976如果想在整个应用中使用全局变量,在java中一般是使用静态 ...
相关推荐
在本篇文章中,我们将深入探讨如何利用`ActivityManager`获取内存信息和进程信息。 首先,我们来看如何获取系统内存信息。Android提供了一个名为`ActivityManager.RunningAppProcessInfo`的类,其中包含了关于当前...
### Android系统中如何获取系统进程信息 在Android开发过程中,获取系统进程信息是实现设备监控、性能优化等应用功能的基础。本文将详细介绍如何利用Android提供的API来获取系统进程信息,并展示一个简易进程管理器...
在Android平台上,获取CPU、内存和磁盘使用率信息对于开发者来说是十分重要的,这有助于监控设备性能,优化应用运行,以及提供用户友好的反馈。然而,由于Android系统的安全机制,不同的权限级别决定了你能获取到何...
在Android里,程序内存被分为2部分:native和dalvik,dalvik就是我们普通的Java使用内存,分析堆栈的时候使用的内存。我们创建的对象是在这里面分配的,对于内存的限制是 native+dalvik 不能超过最大限制. Android ...
在Android中,获取CPU使用率通常需要读取 `/proc/stat` 文件,该文件包含了系统运行的各种统计信息。以下是一个简单的示例,展示如何计算CPU使用率: ```java public float getCpuUsage() { String[] cpuUsage = ...
本篇文章将深入探讨如何利用ActivityManager来获取正在运行的应用程序信息,这是Android开发中的一个重要知识点,对于理解和优化应用行为有着至关重要的作用。 首先,我们需要理解ActivityManager的核心职责。它...
- ActivityManager也参与到Android系统的进程管理中,根据内存状态和Activity的重要程度决定哪些进程应该被杀死以释放资源。 5. **应用信息获取**: - 可以通过ActivityManager获取系统中所有已安装应用的信息,...
尽管可以通过`ActivityManager`获取进程信息,但请注意,Android系统可能会根据内存状况杀死后台进程,所以获取到的进程列表并不一定完整。此外,对于非系统应用,获取其他应用的详细信息(尤其是敏感的后台信息)...
在Android系统中,开发者经常需要获取设备上正在运行的进程信息,以便进行性能监控、内存管理或者优化应用的运行效率。然而,随着Android版本的更新,为了提高系统的安全性和隐私保护,Google对某些API进行了限制。...
5. **Linux命令**: Android系统基于Linux,因此也可以通过执行`cat /proc/pid/status`命令获取特定进程的内存使用信息。这需要通过`Runtime.getRuntime().exec()`来执行shell命令,但请注意这可能会带来安全风险。 ...
在Android开发中,实现一个悬浮窗并获取设备的内存信息是一项常见的需求,这通常涉及到UI设计、系统权限处理以及系统API的使用。本教程将详细讲解如何创建Android悬浮窗以及如何获取设备的内存信息。 首先,创建...
然后在代码中,我们可以这样获取内存信息: ```java ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); ActivityManager.MemoryInfo memoryInfo = new ActivityManager...
在Android开发中,有时我们需要获取设备上正在运行的应用进程信息,比如进行性能分析或优化内存使用。然而,当你尝试使用`ActivityManager.getRunningAppProcesses()`方法时,可能会遇到一个问题:这个方法默认只会...
总的来说,"Android项目实战--手机卫士28--读取进程的信息并显示出来"这一课题涉及到Android权限管理、系统服务的使用、UI设计与交互以及性能优化等多个核心知识点。通过这个项目,开发者不仅可以提升Android编程...
在Android系统中,获取手机内存信息是开发过程中的一项常见任务,这有助于监控设备性能或优化应用程序资源使用。本文将深入探讨如何在Android中获取并显示内存信息,主要围绕以下几个方面展开: 1. **Android内存...
本主题将详细探讨如何获取Android系统中的GPS定位信息、短信内容、通话记录、通信状态、进程详情、内存占用以及CPU使用情况。 1. **GPS定位信息获取**: Android提供了`LocationManager`类来获取GPS位置信息。通过...
标题"Android获取正在运行程序并kill掉"涉及的关键知识点主要包括Android进程管理、系统权限、以及如何编程实现这个功能。以下将详细介绍这些内容。 首先,Android系统中的进程分为多个级别,如前台进程、可见进程...