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>