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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • pytest skipif_白盒测试用例

    pytest skipif_白盒测试用例前言pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能Skip和xfail:处理那些不会成功的测试用例你可以对那些在某些特定平台上不能运行的测试用

    2022年7月28日
  • transactionscope mysql_TransactionScope事务操作

    transactionscope mysql_TransactionScope事务操作using(TransactionScopetrans=newTransactionScope()){try{InsertUserBase();//它插入不成功,自己回滚UserInfosuserInfo=newUserInfos{UserID=”1″,RealName=”zzl”,};db.UserInfos.InsertOnSubmit(userInfo);db.SubmitC…

    2022年7月24日
  • 【idea】推荐一个idea翻译插件:Translation「建议收藏」

    【idea】推荐一个idea翻译插件:Translation「建议收藏」打开settings-plugins,打开Browserepositories(如图):搜索”Translation”,往下找,找到图中插件install即可(我是已经安装了的)我的插件版本现在是支持谷歌、有道、百度三种翻译,其中有道和百度的需要填写应用id及secret等才能用,这个需要到有道智云(百度的没有试过)申请。使用很简单:选中单词或者段落ctrl+shift+…

    2022年6月15日
  • laravel博客后台操作步骤

    laravel博客后台操作步骤

    2021年10月24日
  • Spring Cloud版本说明

    Spring Cloud版本说明SpringCloud是一个由众多独立子项目组成的大型综合项目,每个子项目有不同的发行节奏,都维护着自己的发布版本号。SpringCloud通过一个资源清单BOM(BillofMaterials)来管理每个版本的子项目清单。为避免与子项目的发布号混淆,所以没有采用版本号的方式,而是通过命名的方式。这些版本名称的命名方式采用了伦敦地铁站的名称,同时根据字母表的顺序来对应版本时间顺序,比如…

    2022年6月7日
  • mysql 读写分离 事务_mysql 读写分离(基础篇)

    mysql 读写分离 事务_mysql 读写分离(基础篇)基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。JanKneschke在《MySQLProxylearnsR/WSplitting》中详细的介绍了这种技巧以及连接池问题:为了实现读写分离我们需要连接池。我们仅在已打开了到一个后端的一条经过认证的连接的情况下,才切换到该后端。MySQL协议首先进行握手。当…

    2022年6月6日

发表回复

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

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