分享到:
点击次数:333  更新时间:2016-10-11 16:24:04  【打印此页】  【关闭
棋牌游戏定制
当前位置:主页 > 新闻动态 > 技术交流 > android监听应用自身被卸载

android监听应用自身被卸载

责任编辑:admin 发布时间:2016-11-17 15:04 浏览次数:

在实际开发中,常常需要监听应用本身是否被卸载或相近的需求。在网上淘了很久都没有看到实际的做法,最多就给出一个思路,可以通过捕捉系统日志来检测到这个应用是否被卸载,继而做相关的操作。
通过监听Intent.ACTION_PACKAGE_REMOVED意图只能监听到其他应用程序是否被卸载,无法监听自身!
        本例子也是通过监听系统日志,来监听应用本身是否被卸载。
LogcatObserver.java
    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; 
        } 
     
    } 
        调用时只需startService(this,LogcatScannerService.class)既可。
        例子本身,经过测试确定可以监听到应用本身被卸载的动作,但是在handleLog()方法中我能只能做些省时的操作,撸主测试可以发出短信,但是无法完成http的发送!例子本身是通过不断的读日志来监听应用本身是否被卸载,因而是非常好电和性能的