当前位置:操作系统 > 安卓/Android >>

android监听应用自身被卸载

在实际开发中,常常需要监听应用本身是否被卸载或相近的需求。在网上淘了很久都没有看到实际的做法,最多就给出一个思路,可以通过捕捉系统日志来检测到这个应用是否被卸载,继而做相关的操作。

通过监听Intent.ACTION_PACKAGE_REMOVED意图只能监听到其他应用程序是否被卸载,无法监听自身!

        本例子也是通过监听系统日志,来监听应用本身是否被卸载。

LogcatObserver.java

  

public interface LogcatObserver { 
     
    public void handleLog(String info); 
} 

public interface LogcatObserver {
   
    public void handleLog(String info);
}
LogcatScannerService.java



import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
 
public class LogcatScannerService extends Service implements LogcatObserver { 
    @Override 
    public void onStart(Intent intent, int startId) { 
        super.onStart(intent, startId); 
        new AndroidLogcatScannerThread(this).start(); 
    } 
 
    @Override 
    public void handleLog(String info) { 
        if (info.contains("android.intent.action.DELETE") 
                && info.contains(getPackageName())) { 
            //do something yourself  
        } 
    } 
 
    private class AndroidLogcatScannerThread extends Thread { 
 
        private LogcatObserver mObserver; 
 
        public AndroidLogcatScannerThread(LogcatObserver observer) { 
            mObserver = observer; 
        } 
 
        @Override 
        public void run() { 
            String[] cmds = { "logcat", "-c" }; 
            String shellCmd = "logcat"; 
            Process process = null; 
            InputStream is = null; 
            DataInputStream dis = null; 
            String line = ""; 
            Runtime runtime = Runtime.getRuntime(); 
            try { 
                mObserver.handleLog(line); 
                int waitValue; 
                waitValue = runtime.exec(cmds).waitFor(); 
                mObserver.handleLog("waitValue=" + waitValue 
                        + "\n Has do Clear logcat cache."); 
                process = runtime.exec(shellCmd); 
                is = process.getInputStream(); 
                dis = new DataInputStream(is); 
                while ((line = dis.readLine()) != null) { 
                    if (mObserver != null) 
                        mObserver.handleLog(line); 
 
                } 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } catch (IOException ie) { 
            } finally { 
                try { 
                    if (dis != null) { 
                        dis.close(); 
                    } 
                    if (is != null) { 
                        is.close(); 
                    } 
                    if (process != null) { 
                        process.destroy(); 
                    } 
                } catch (Exception e) { 
                } 
            } 
        } 
    } 
     
    @Override 
    public IBinder onBind(Intent intent) { 
        return null; 
    } 
 
} 

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class LogcatScannerService extends Service implements LogcatObserver {
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        new AndroidLogcatScannerThread(this).start();
    }

    @Override
    public void handleLog(String info) {
        if (info.contains("android.intent.action.DELETE")
                && info.contains(getPackageName())) {
            //do something yourself
        }
    }

    private class AndroidLogcatScannerThread extends Thread {

        private LogcatObserver mObserver;

        public AndroidLogcatScannerThread(LogcatObserver observer) {
            mObserver = observer;
        }

        @Override
        public void run() {
            String[] cmds = { "logcat", "-c" };
            String shellCmd = "logcat";
            Process process = null;
            InputStream is = null;
            DataInputStream dis = null;
            String line = "";
            Runtime runtime = Runtime.getRuntime();
            try {
                mObserver.handleLog(line);
                int waitValue;
                waitValue = runtime.exec(cmds).waitFor();
                mObserver.handleLog("waitValue=" + waitValue
                        + "\n Has do Clear logcat cache.");
                process = runtime.exec(shellCmd);
                is = process.getInputStream();
                dis = new DataInputStream(is);
                while ((line = dis.readLine()) != null) {
                    if (mObserver != null)
                        mObserver.handleLog(line);

                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (IOException ie) {
            } finally {
                try {
                    if (dis != null) {
                        dis.close();
                    }
                    if (is != null) {
                        is.close();
                    }
                    if (process != null) {
                        process.destroy();
                    }
                } catch (Exception e) {
                }
            }
        }
    }
   
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

        调用时只需startService(this,LogcatScannerService.class)既可。
        例子本身,经过测试确定可以监听到应用本身被卸载的动作,但是在handleLog()方法中我能只能做些省时的操作,撸主测试可以发出短信,但是无法完成http的发送!

例子本身是通过不断的读日志来监听应用本身是否被卸载,因而是非常好电和性能的!如果广大网友有更好的想法可以一起讨论下啊!

 


 

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,