Android利用Logcat监听应用程序本身被卸载

MainActivity如下:

package cc.testremoveapp;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
/**
 * Demo描述:
 * 监听应用程序本身被卸载
 *
 * 注意权限:
 * <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
 *
 * 参考资料:
 * http://blog.csdn.net/xyz_lmn/article/details/8330710
 * Thank you very much
 */
public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}
	//启动服务
    private void init(){
    	Intent intent=new Intent(this, LogcatScannerService.class);
    	startService(intent);
    }

}

LogcatObserverInterface如下:

package cc.testremoveapp;
//业务接口
public interface LogcatObserverInterface {
    public void handleLog(String logcatInfo);
}

LogcatScannerService如下:

package cc.testremoveapp;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class LogcatScannerService extends Service implements LogcatObserverInterface {
	@Override
	public void onCreate() {
		super.onCreate();
	}

	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		LogcatScannerThread logcatScannerThread=new LogcatScannerThread(this);
		logcatScannerThread.start();
	}

	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	/**
	 * 实现LogcatObserverInterface接口中的方法
	 */
	@Override
	public void handleLog(String logcatInfo) {
		if (logcatInfo.contains("android.intent.action.DELETE")&& logcatInfo.contains(getPackageName())) {
			/**
			 * 注意事项:
			 * LogCat有时会多次甚至一直输出卸载应用的信息
			 * 所以在实际项目中需要对此处留意处理
			 */
			Intent intent = new Intent(LogcatScannerService.this,UninstallActivity.class);
			intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			startActivity(intent);
		}
	}

}

LogcatScannerThread如下:

package cc.testremoveapp;
import java.io.DataInputStream;
import java.io.InputStream;

public class LogcatScannerThread extends Thread {

	private LogcatObserverInterface mLogcatObserverInterface;

	public LogcatScannerThread(LogcatObserverInterface logcatObserverInterface){
		this.mLogcatObserverInterface=logcatObserverInterface;
	}
	@Override
	public void run() {
		super.run();
		int waitValue;
		String line = "";
        String[] cmds = { "logcat", "-c" };
        String shellCMD = "logcat";
        Process process = null;
        InputStream inputStream = null;
        DataInputStream dataInputStream = null;
        Runtime runtime = Runtime.getRuntime();
        try {
        	    mLogcatObserverInterface.handleLog(line);
                waitValue = runtime.exec(cmds).waitFor();
                mLogcatObserverInterface.handleLog("waitValue=" + waitValue + "\n Has do Clear logcat cache.");
                process = runtime.exec(shellCMD);
                inputStream = process.getInputStream();
                dataInputStream = new DataInputStream(inputStream);
                while ((line = dataInputStream.readLine()) != null) {
                	if(mLogcatObserverInterface!=null){
                		mLogcatObserverInterface.handleLog(line);
                	}
                }
        } catch (Exception e) {
                e.printStackTrace();
		} finally {
			try {
				if (dataInputStream != null) {
					dataInputStream.close();
				}
				if (inputStream != null) {
					inputStream.close();
				}
				if (process != null) {
					process.destroy();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

UninstallActivity如下:

package cc.testremoveapp;

import android.app.Activity;
import android.os.Bundle;

public class UninstallActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.uninstall);
	}

}

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="监听应用本身被卸载"
        android:layout_centerInParent="true"
        />

</RelativeLayout>

uninstall.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="确定卸载本应用?"
        android:layout_centerInParent="true"
        />

</RelativeLayout>

 

时间: 2024-10-27 22:02:31

Android利用Logcat监听应用程序本身被卸载的相关文章

Android 利用广播监听usb连接状态(变化情况)

废话不多说了,直接给大家贴代码了,具体代码如下所示: package com.lgs.test.testcode.receiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.widget.Toast; /** * Create

Android利用广播监听按下HOME和电源键

MainActivity如下: package cc.testhome; import cc.testhome.HomeKeyObserver.OnHomeKeyListener; import cc.testhome.PowerKeyObserver.OnPowerKeyListener; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 利用广播监听Home键的按下和长按Home键 * 利用广播监听电

Android监听应用程序安装和卸载实现程序

代码如下  package com.rongfzh.yc; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class BootReceiver extends BroadcastReceiver{           @Override      public void onReceive(Context context

Android利用广播监听按下HOME和RECENT_APPS键

MainActivity如下: package cn.testhomekey; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.content.IntentFilter; /** * Demo描述: * 利用广播监听设备的HOME和RECENT_APPS键被按下 * * 参考资料: * http://blog.csdn.net/imyfrien

android开发界面监听和跳转,求教两个程序有版图

问题描述 android开发界面监听和跳转,求教两个程序有版图 在编辑输入什么 上面就显示:您输入的是"输入的内容" 我只会写 点各个按钮出现相应的字 按钮变不了 这页面跳转 只会一点点 求程序 解决方案 第一个问题: android中有监听ExitText输入内容变化的监听函数: exitText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s,

Android零基础入门第34节:Android中基于监听的事件处理

原文:Android零基础入门第34节:Android中基于监听的事件处理    上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本期继续来学习其他四种事件监听器.     一.使用内部类作为事件监听器       和上面的匿名内部类不同,使用内部类可以在当前类中复用该监听器类:因为监听器类是外部类的内部类,所以可以自由访问外部类的所有界面组件,这也是内部类的两个优势.     接下来通过一个简单的示例程序来学习Andro

android开发,监听事件不触发

问题描述 android开发,监听事件不触发 登入界面在TextView中输入密码,触发TextView的监听事件(继承TextWatcher),当程序再次返回登入界面时,在TextView控件中输入内容,监听事件并不触发? 监听返回按钮的源代码: public boolean onKeyDown(int keyCode,KeyEvent event){ if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent

Android开发-之监听button点击事件的多种方法_Android

 在Android下,事件的发生是在监听器下进行,android系统可以响应按键事件和触摸屏事件,本文主要介绍了button点击事件的方法 一.实现button点击事件的方法 实现button点击事件的监听方法有很多种,这里总结了常用的四种方法: 1.匿名内部类 2.外部类(独立类) 3.实现OnClickListener接口 4.添加XML属性 每一种方法都有它的优点也有它的不足,那么接下来就来详细的讲解这四个实现方法  二.具体实现 1.匿名内部类: 在Android开发中我们会经常看到各种

android开发鼠标监听事件运行错误

问题描述 android开发鼠标监听事件运行错误 解决方案 mainactivity 中27行 空指针了,....写的很明显了.. 解决方案二: 看一下MainActivity.java的第27行代码,有对象为null,所以报空指针异常. 解决方案三: 亲,学会看logcat报异常哦,有时候异常原因写在中间