天天看點

android程序 清理及activity棧管理

mainactivity如下:

android程式 清理及activity棧管理

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如下:

android程式 清理及activity棧管理

import java.util.list;  

import java.io.filereader;  

import android.os.process;  

import java.io.ioexception;  

import java.io.bufferedreader;  

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.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) {  

            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) {  

    //----------> 以上為殺掉程序的幾種方式  

    //擷取目前程序名  

    public static string getcurrentprocessname(context context) {  

        int pid = android.os.process.mypid();  

        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;  

            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;  

            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();  

        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如下:

android程式 清理及activity棧管理

import android.app.service;  

import android.os.ibinder;  

public class servicesubclass extends service {  

    public ibinder onbind(intent intent) {  

    public void oncreate() {  

        super.oncreate();  

        system.out.println("---> service的 oncreate()");  

    public void onstart(intent intent, int startid) {  

        super.onstart(intent, startid);  

        system.out.println("---> service的 onstart()");  

main.xml如下:

android程式 清理及activity棧管理

<?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_margintop="100dip"  

        android:gravity="center"  

        />  

    <button   

        android:id="@+id/button"  

        android:text="清理記憶體"   

        android:layout_centerinparent="true"  

         android:textsize="20sp"  

</relativelayout>  

androidmanifest.xml如下:

android程式 清理及activity棧管理

<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"/>  

        </service>  

    </application>  

</manifest> 

繼續閱讀