Android清理设备内存具体完整演示样例(一)

Android清理设备内存具体完整演示样例(一)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

MainActivity例如以下:

package come.on;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
/**
 * Demo描写叙述:
 * 内存清理及内存工具类
 * 详细代码參见工具类MemoryUtils
 * 
 */
public class MainActivity extends Activity {
	private Button mButton;
	private Context mContext;
	private EditText mEditText;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }
    
    private void init(){
    	mContext=this;
    	Intent intent=new Intent("come.on.service");
    	//该Service无用,可去掉
    	startService(intent);
    	
    	mEditText=(EditText) findViewById(R.id.editText);
    	mButton=(Button) findViewById(R.id.button);
    	mButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
		        MemoryUtils.cleanMemory(mContext,mEditText);
			}
		});
    }
   
}

MemoryUtils例如以下:

package come.on;

import java.util.List;
import java.io.FileReader;
import android.os.Process;
import java.io.IOException;
import java.io.BufferedReader;
import android.widget.EditText;
import android.content.Context;
import java.io.InputStreamReader;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.app.ActivityManager.MemoryInfo;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityManager.RunningAppProcessInfo;

/**
 * 文档描写叙述:
 * 内存工具类
 * 
 * 包含内容:
 * 1 内存清理即杀掉进程的几种方式
 * 2 获取内存总大小及其可用大小
 * 3 推断栈顶Activity名及其所属进程名
 * 
 * 注意权限:
 * <uses-permission android:name="android.permission.GET_TASKS"/>  
 * <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
 * 
 * 文档日期:
 * 2014年5月30日10:01:55
 *
 */
public class MemoryUtils {
	
	//----------> 下面为杀掉进程的几种方式
	
	public static void cleanMemory(Context context,EditText editText) {
		long beforeCleanMemory=getAvailMemory(context);
		System.out.println("---> 清理前可用内存大小:"+beforeCleanMemory+"M");
		ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
		RunningAppProcessInfo runningAppProcessInfo = null;
		List<RunningAppProcessInfo> runningAppProcessInfoList = activityManager.getRunningAppProcesses();
		for (int i = 0; i < runningAppProcessInfoList.size(); ++i) {
			runningAppProcessInfo = runningAppProcessInfoList.get(i);
			String processName = runningAppProcessInfo.processName;
			//调用杀掉进程的方法
			System.out.println("---> 開始清理:"+processName);
			killProcessByRestartPackage(context, processName);
		}
		long afterCleanMemory=getAvailMemory(context);
		System.out.println("---> 清理后可用内存大小:"+afterCleanMemory+"M");
		System.out.println("---> 节约内存大小:"+(afterCleanMemory-beforeCleanMemory)+"M");
		editText.setText("共清理:"+(afterCleanMemory-beforeCleanMemory)+"M");
	}
	
	
	
	//利用activityManager.restartPackage()方法杀死进程
	//该方法实际调用了activityManager.killBackgroundProcesses()方法
	public static void killProcessByRestartPackage(Context context,String packageName) {
		ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
		activityManager.restartPackage(packageName);
		System.gc();
	}
	
	
	//利用Process.killProcess(pid)杀死进程
	//注意事项:
	//1 该方式可自杀,即杀掉本进程
	//2 该方式可杀掉其它普通应用进程
	//3 该方式不可杀掉系统级应用即system/app应用
	public static void killProcessBykillProcess(int pid){
		Process.killProcess(pid);
	}
	
	
	//利用adb shell命令杀死进程
	public static void killProcessByAdbShell(int pid) {
		String cmd = "adb shell kill -9 " + pid;
		System.out.println("-------> cmd=" + cmd);
		try {
			java.lang.Process process = Runtime.getRuntime().exec(cmd);
			InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream());
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
			String line = null;
			while ((line = bufferedReader.readLine()) != null) {
				System.out.println("----> exec shell:" + line);
			}
			bufferedReader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	 
	 //利用su进程的命令方式杀死进程
	 //1 得到su进程(super进程)
	 //  Runtime.getRuntime().exec("su");
	 //2 利用su进程运行命令
	 //  process.getOutputStream().write(cmd.getBytes());
	public static void killProcessBySu(int pid) {
		try {
			java.lang.Process process = Runtime.getRuntime().exec("su");
			String cmd = "kill -9 " + pid;
			System.out.println("-------> cmd = " + cmd);
			process.getOutputStream().write(cmd.getBytes());
			if ((process.waitFor() != 0)) {
				System.out.println("-------> su.waitFor()!= 0");
			} else {
				System.out.println("------->  su.waitFor()==0 ");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	//----------> 以上为杀掉进程的几种方式
	

	
	
	
	//获取当前进程名
	public static String getCurrentProcessName(Context context) {
		int pid = android.os.Process.myPid();
		ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
		for (RunningAppProcessInfo runningAppProcessInfo : activityManager.getRunningAppProcesses()) {
			if (runningAppProcessInfo.pid == pid) {
                String processName=runningAppProcessInfo.processName;
				return processName;
			}
		}
		return null;
	}
	
	
	//获取栈顶Activity名称
	public static String getTopActivityName(Context context) {
		String topActivityName = null;
		ActivityManager activityManager = (ActivityManager) (context.getSystemService(android.content.Context.ACTIVITY_SERVICE));
		List<RunningTaskInfo> runningTaskInfos = activityManager.getRunningTasks(1);
		if (runningTaskInfos != null) {
			ComponentName f = runningTaskInfos.get(0).topActivity;
			String topActivityClassName = f.getClassName();
			String temp[] = topActivityClassName.split("\\.");
			topActivityName = temp[temp.length - 1];
		}
		return topActivityName;
	}
	
	
	
	//获取栈顶Activity所属进程的名称
	public static String getTopActivityProcessName(Context context) {
		String processName = null;
		ActivityManager activityManager = (ActivityManager) (context.getSystemService(android.content.Context.ACTIVITY_SERVICE));
		List<RunningTaskInfo> runningTaskInfos = activityManager.getRunningTasks(1);
		if (runningTaskInfos != null) {
			ComponentName componentName = runningTaskInfos.get(0).topActivity;
			String topActivityClassName = componentName.getClassName();
			int index = topActivityClassName.lastIndexOf(".");
			processName = topActivityClassName.substring(0, index);
		}
		return processName;
	}
	
	
	
	//获取内存总大小
	public static 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();
		} catch (IOException e) {
		}
		return totalMemory / 1024;
	}
	
	
	
	//获取可用内存大小
	public static long getAvailMemory(Context context) {
		ActivityManager activityManager=(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
		MemoryInfo memoryInfo = new MemoryInfo();
		activityManager.getMemoryInfo(memoryInfo);
		return memoryInfo.availMem / (1024 * 1024);
	}
	

}

ServiceSubclass例如以下:

package come.on;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class ServiceSubclass extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	
	@Override
	public void onCreate() {
		super.onCreate();
		System.out.println("---> Service的 onCreate()");
	}
	
	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		System.out.println("---> Service的 onStart()");
	}

}

main.xml例如以下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
   >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="測试内存清理" 
        android:layout_centerHorizontal="true"
        android:layout_marginTop="25dip"
        android:textSize="20sp"
     />
    
    <EditText 
        android:id="@+id/editText"
        android:layout_width="160dip"
        android:layout_height="50dip"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dip"
        android:gravity="center"
        android:textSize="20sp"
        />
    
    <Button 
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="清理内存" 
        android:layout_centerInParent="true"
         android:textSize="20sp"
        />
    

</RelativeLayout>

AndroidManifest.xml例如以下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="come.on"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    
    
    
    
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
    <uses-permission android:name="android.permission.GET_TASKS"/>  
    
    
    

    <application
        android:icon="@drawable/a"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".MainActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".ServiceSubclass">
            <intent-filter>
                <action android:name="come.on.service"/>
            </intent-filter>
        </service>
    </application>

</manifest>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118050.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 单例模式 java 三种写法_双重锁的单例模式

    单例模式 java 三种写法_双重锁的单例模式单例模式有多种写法,都有各自的优缺点,最常见的优缺点就是【懒汉和饿汉】的比较,以及是否线程安全懒汉模式,节约内存,只有使用到时才创建单例对象,可能会有线程安全问题饿汉模式,浪费内存,但可以由JVM类加载器去保证线程安全一、饿汉模式publicclassSingleton1{/***饿汉式提前创建好单例对象(在类被主动使用时便会触发静态变量的初始化)*/privatefinalstaticSingleton1INSTANCE=new

    2022年8月11日
    3
  • QueryInterface 的实现规则

    QueryInterface 的实现规则本节将给出一些QueryInterface既的所有实现都必须遵循的一些规则,以便客户能够获取关于组件的足够多的知识并对之施实一些控制和其他有用的处理。如果没有这些规则,是不可能编写出组件的,因为在这种情况下,QueryInterface的行为将是不确定的。具体来讲,这些规则是:QueryInterface返回的总是同一IUnknown指针。若客户曾经获取过某个接口,那么它将总能获取此接口。客户可

    2022年7月22日
    6
  • 电商仓库erp软件_电商交易系统和订单系统

    电商仓库erp软件_电商交易系统和订单系统1、系统独立部署、永久使用,自行管理绑定和授权店铺账号,所有数据都保存在自己的数据库中,多账号使用不关联。2、支持前端的自定义开发和后端功能定制。3、零售、分销、批发、营销方式全面支持,支持兰亭、DX等批量发货、定期对账结算。4、ERP、商品、库存、订单、list售价、list库存实时同步。5、灵活的商品注册:支持多款式、组合品、商品图片6、将从平台下载的订单自动快速导入、自动派单、分配库存。7、具备每天300…

    2022年9月2日
    4
  • Python OpenCV findContours()函数与drawContours()函数用法

    Python OpenCV findContours()函数与drawContours()函数用法我用的Python3.6,OpenCV3.4。Python3.x与2.x语法不一样,OpenCV2.x与3.x也不一样。看之前得清楚自己用的啥。本文说白了就是个简单的查找轮廓,并且绘制轮廓。简单说一下这俩个函数用法。函数cv2.findContours()有三个参数。第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。而返回值根据OpenCV版本不同也不一样,但这俩个版本都会返回…

    2025年7月25日
    0
  • 基于 Pusher 驱动的 Laravel 事件广播[通俗易懂]

    基于 Pusher 驱动的 Laravel 事件广播[通俗易懂]基于 Pusher 驱动的 Laravel 事件广播

    2022年4月24日
    38
  • qt集成ziplib压缩文件和目录「建议收藏」

    qt集成ziplib压缩文件和目录「建议收藏」今天本来想完成压缩文件的任务,结果并没有想象中那么轻松,1.qt自带有压缩工具,但是不考虑,因为qCompress主要用来压缩字节流,就算自己封装成压缩文件,也只能用qt的接口进行解压,可项目需要的是一个通用的压缩工具,2.zlib+quazipzlib官网:http://www.zlib.net/quazip参考http://quazip.sourceforge.net/cla…

    2022年7月26日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号