Androidクリーンアップデバイスメモリの詳細な例(一)
11908 ワード
MainActivityは次のとおりです.
MemoryUtilsは次のとおりです.
ServiceSubclassは次のとおりです.
main.xmlは次のとおりです.
AndroidManifest.xmlは次のとおりです.
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>