文章原地址:http://blog.csdn.net/xyz_lmn/article/details/8330710
这篇文章是整理的以前用过的一个功能,由于多种原因现在停用了,也希望这篇文章能帮助一些android入门的小童鞋。android是不提供监控卸载自己的功能的,这里使用了监控android日志的功能,android日志相关知识可以参考《adb logcat 查看日志》这篇文章。
android卸载提示的思路是启动一个服务监控android系统的打印日志,当监控到"android.intent.action.DELETE"并且包含自己应用的包名时,提示给用户。
监控代码
- public class AndroidLogcatScannerThread extends Thread {
- private LogcatObserver observer;
- public AndroidLogcatScannerThread(LogcatObserver observer) {
- this.observer = observer;
- }
- 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 {
- observer.handleLog(line);
- int waitValue;
- waitValue = runtime.exec(cmds).waitFor();
- observer.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) {
- //Log.d("Log","Log.Bestpay:"+line);
- if(observer!=null)
- observer.handleLog(line);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (IOException ie) {
- ie.printStackTrace();
- } finally {
- try {
- if (dis != null) {
- dis.close();
- }
- if (is != null) {
- is.close();
- }
- if (process != null) {
- process.destroy();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
public class AndroidLogcatScannerThread extends Thread {
private LogcatObserver observer;
public AndroidLogcatScannerThread(LogcatObserver observer) {
this.observer = observer;
}
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 {
observer.handleLog(line);
int waitValue;
waitValue = runtime.exec(cmds).waitFor();
observer.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) {
//Log.d("Log","Log.Bestpay:"+line);
if(observer!=null)
observer.handleLog(line);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException ie) {
ie.printStackTrace();
} finally {
try {
if (dis != null) {
dis.close();
}
if (is != null) {
is.close();
}
if (process != null) {
process.destroy();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
监控服务:
- public class AndroidLogcatScannerService extends Service implements LogcatObserver{
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- super.onCreate();
- }
- @Override
- public void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- }
- @Override
- public void onStart(Intent intent, int startId) {
- // TODO Auto-generated method stub
- super.onStart(intent, startId);
- AndroidLogcatScannerThread scannerThread=new AndroidLogcatScannerThread(AndroidLogcatScannerService.this);
- scannerThread.start();
- }
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public void handleLog(String info) {
- // TODO Auto-generated method stub
- if (info.contains("android.intent.action.DELETE") && info.contains(getPackageName())) {
- Intent intent = new Intent();
- intent.setClass(AndroidLogcatScannerService.this, UninstallActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent);
- }
- }
- }
public class AndroidLogcatScannerService extends Service implements LogcatObserver{
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
AndroidLogcatScannerThread scannerThread=new AndroidLogcatScannerThread(AndroidLogcatScannerService.this);
scannerThread.start();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void handleLog(String info) {
// TODO Auto-generated method stub
if (info.contains("android.intent.action.DELETE") && info.contains(getPackageName())) {
Intent intent = new Intent();
intent.setClass(AndroidLogcatScannerService.this, UninstallActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
}
上面的代码基本实现了卸载提示,最后不要忘了权限:
- <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
代码下载地址:
http://download.csdn.net/detail/xyz_lmn/4904797