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>