Android利用Logcat监听应用程序本身被卸载MainActivity如下:package cc.testremoveappimport android.os.
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 {@Overrideprotected 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 {@Overridepublic void onCreate() {super.onCreate();}@Overridepublic void onStart(Intent intent, int startId) {super.onStart(intent, startId);LogcatScannerThread logcatScannerThread=new LogcatScannerThread(this);logcatScannerThread.start();}@Overridepublic IBinder onBind(Intent arg0) {return null;}@Overridepublic void onDestroy() {super.onDestroy();}/** * 实现LogcatObserverInterface接口中的方法 */@Overridepublic 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;}@Overridepublic 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 {@Overrideprotected 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>
