Android清理设备内存详细完整示例(二)

简介: MainActivity如下: package cc.c;import java.io.BufferedReader;import java.

MainActivity如下:

package cc.c;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
/**
 * Demo描述:
 * 清理手机内存
 * 
 * 参考资料:
 * 1 http://blog.30c.org/1816.html
 * 2 http://www.cnblogs.com/helloandroid/archive/2011/10/14/2212334.html
 *   Thank you very much
 * 
 * 注意权限:
 * <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
 * 
 */
public class MainActivity extends Activity {
	private TextView mTotalMemoryTextView;
	private TextView mAvailMemoryTextView;
	private Button mCleanButton;
	private TextView mCleanInfoTextView;
	private ActivityManager mActivityManager;
	private StringBuffer mCleanInfoStringBuffer;
	private long availMemory;
	private long totalMemory;
	private List<RunningAppProcessInfo> mRunningAppProcessInfoList;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}

	private void init() {
		
		mCleanInfoStringBuffer = new StringBuffer();
		mActivityManager=(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
		
		mTotalMemoryTextView = (TextView) findViewById(R.id.totalMemoryTextView);
		mAvailMemoryTextView = (TextView) findViewById(R.id.availMemoryTextView);
		mCleanInfoTextView = (TextView) findViewById(R.id.cleanInfoTextView);
		mCleanButton = (Button) findViewById(R.id.cleanButton);
		
		totalMemory = getTotalMemory();
		availMemory = getAvailMemory();
		mTotalMemoryTextView.setText(totalMemory + "MB");
		mAvailMemoryTextView.setText(availMemory + "MB");
	
		mCleanButton.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				RunningAppProcessInfo runningAppProcessInfo=null;
				mRunningAppProcessInfoList= mActivityManager.getRunningAppProcesses();
				//List<ActivityManager.RunningServiceInfo> serviceInfos = mActivityManager.getRunningServices(100);

				if (mRunningAppProcessInfoList != null) {
					for (int i = 0; i < mRunningAppProcessInfoList.size(); ++i) {
						runningAppProcessInfo= mRunningAppProcessInfoList.get(i);
						// 一般数值大于RunningAppProcessInfo.IMPORTANCE_SERVICE
						// 的进程即为长时间未使用进程或者空进程
						// 一般数值大于RunningAppProcessInfo.IMPORTANCE_VISIBLE
						// 的进程都是非可见进程,即在后台运行
						if (runningAppProcessInfo.importance > RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
							String[] pkgList = runningAppProcessInfo.pkgList;
							for (int j = 0; j < pkgList.length; ++j) {
								mActivityManager.killBackgroundProcesses(pkgList[j]);
								mCleanInfoStringBuffer.append(pkgList[j] + " is killed...\n");
								mCleanInfoTextView.setText(mCleanInfoStringBuffer.toString());
							}
						}

					}
				}
                //再次获得剩余内存以计算清理值
				mCleanInfoStringBuffer.append("共清理:"+(getAvailMemory() - availMemory) + "MB");
				mCleanInfoTextView.setText(mCleanInfoStringBuffer.toString());
				mAvailMemoryTextView.setText(getAvailMemory() + "MB");
			}
		});
	}

	

	private long getTotalMemory() {
		//系统的内存信息文件
		String filePath = "/proc/meminfo";
		String lineString;
		String[] stringArray;
		long totalMemory = 0;
		try {
			FileReader fileReader = new FileReader(filePath);
			BufferedReader bufferedReader = new BufferedReader(fileReader,1024 * 8);
			//读取meminfo第一行,获取系统总内存大小
			lineString = bufferedReader.readLine();
			//按照空格拆分
			stringArray = lineString.split("\\s+");
			//获得系统总内存,单位KB
			totalMemory = Integer.valueOf(stringArray[1]).intValue();
			bufferedReader.close();
			System.out.println("------> lineString=" + lineString+ ",stringArray[0]=" + stringArray[0] + 
					           ",stringArray[1]="+ stringArray[1] + ",stringArray[2]=" + stringArray[2]);
		} catch (IOException e) {
		}
		return totalMemory / 1024;
	}
	
	

	private long getAvailMemory() {
		MemoryInfo memoryInfo = new MemoryInfo();
		mActivityManager.getMemoryInfo(memoryInfo);
		return memoryInfo.availMem / (1024 * 1024);
	}


}

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <TextView
        android:id="@+id/totalTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="系统内存:"
        android:textSize="25sp"
        android:textColor="#1cf109" />

    <TextView
        android:id="@+id/totalMemoryTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/totalTextView"
        android:textSize="25sp"
        android:textColor="#1cf109" />

    <TextView
        android:id="@+id/availTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/totalTextView"
        android:text="可用内存:"
        android:textSize="25sp"
        android:textColor="#5c0169" />

    <TextView
        android:id="@+id/availMemoryTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/totalTextView"
        android:layout_toRightOf="@id/availTextView"
        android:textSize="25sp"
        android:textColor="#5c0169" />

    <Button
        android:id="@+id/cleanButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/availMemoryTextView"
        android:textSize="25sp"
        android:text="清理内存" />

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/cleanButton" >

        <TextView
            android:id="@+id/cleanInfoTextView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    </ScrollView>

</RelativeLayout>


PS:更好的方式请参见Android清理设备内存详细完整示例(一)

相关文章
|
2月前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
3月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
115 16
|
3月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
86 6
|
3月前
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
4月前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
58 1
|
4月前
|
编解码 Android开发 UED
构建高效Android应用:从内存优化到用户体验
【10月更文挑战第11天】本文探讨了如何通过内存优化和用户体验改进来构建高效的Android应用。介绍了使用弱引用来减少内存占用、懒加载资源以降低启动时内存消耗、利用Kotlin协程进行异步处理以保持UI流畅,以及采用响应式设计适配不同屏幕尺寸等具体技术手段。
65 2
|
6天前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
61 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
4天前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
23 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
19天前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
55 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
23天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
26 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈