转自:http://blog.csdn.net/lfdfhl/article/details/10450849
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"
- />
相关推荐
当用户尝试卸载一个应用程序时,系统默认情况下不会显示任何提示,而是直接执行卸载操作。然而,开发者可以通过编程方式来监控应用的卸载过程,并在卸载前向用户显示自定义的提示信息。下面我们将详细探讨如何实现这...
通过监控系统的日志输出,即Logcat,这个源码提供了一种方法来检测并阻止应用程序被卸载。现在,我们将深入探讨这个主题,理解其背后的原理和实现。 **Logcat基础知识** Logcat是Android系统中的一个核心工具,用于...
在Android平台上,开发一款应用或游戏卸载器项目是一个典型的系统工具类应用,它可以帮助用户方便地管理和卸载设备上的应用程序。在这个“Android应用源码安卓应用游戏卸载器项目”中,我们可以深入学习到以下几个...
本项目“android简单的应用程序管理器”旨在提供一个基本的解决方案,让用户能够轻松地运行和卸载应用程序。以下是对这个项目的详细解析: 1. **Android应用程序框架**:Android系统基于Linux内核,其应用程序框架...
这个名为"Android例子源码仿iphone的程序卸载器.zip"的压缩包包含了一个针对Android平台的项目,其目标是模仿iPhone的应用卸载体验。该项目的主要功能是自动扫描并加载设备上非系统的应用程序,允许用户以类似iPhone...
在Android应用程序开发过程中,Android Debug Bridge(ADB)是一个至关重要的工具,它扮演着客户端-服务器程序的角色。ADB由三部分组成:客户端、服务器和设备端,允许开发者通过USB或无线连接在电脑上与Android设备...
5. **BroadcastReceiver**:为了实现后台卸载,可以注册一个`BroadcastReceiver`监听`ACTION_PACKAGE_REMOVED`广播,这样当用户选择卸载应用时,可以在后台接收到卸载完成的信号。 6. **异步操作**:卸载操作可能...
更高级的用途包括利用`adb`执行特定的Android Intent动作。例如,使用`adb shell am start -n`命令可以启动指定的Activity(应用程序组件)。此命令中`-n`参数后跟着的是组件名,通常由应用包名和类名组成,这些信息...
熟练掌握这些命令可以帮助开发者高效地进行设备管理、应用程序安装与卸载、文件传输以及性能监控等工作。此外,通过学习这些命令的具体使用方法,还可以进一步提升调试效率,优化应用程序性能。
adb提供了丰富的命令集,包括安装、卸载应用,查看日志,推拉文件,甚至远程执行shell命令。例如,`adb install <apk_file>`用于安装APK文件,`adb logcat`显示设备日志,`adb pull <remote> <local>`将设备文件复制...
总结来说,Android ADB是Android开发者进行设备管理、应用程序调试和数据交换的重要工具,通过其丰富的命令集,开发者可以实现对Android设备的全面控制和调试,从而提高开发效率并解决各种问题。熟悉和掌握ADB的使用...
- **设备视图**:显示连接到开发计算机的所有Android设备或模拟器,可以查看设备状态、重启设备或模拟器,以及安装或卸载应用程序。 - **堆内存视图**:用于监测应用的内存使用情况,包括Dalvik堆信息,可以看到...
总的来说,Skygofree恶意软件的分析涵盖了Android应用的安全分析方法,包括动态分析和静态分析,以及如何利用API调用、权限申请和广播接收器等机制来实现恶意目的。对于Android开发者和安全研究人员来说,理解和分析...
- 安装和卸载应用:可以通过ADB快速安装APK文件,或者卸载已安装的应用。 - 运行shell命令:在设备上执行各种Linux shell命令,如ls、cd、rm等,方便系统级别的调试。 - 日志记录:获取设备上的Logcat日志,帮助...
创建Android项目时,你需要设定项目名称、编译目标SDK版本、应用程序名称、包名以及最小SDK版本支持。在Eclipse中,你可以通过"Run" -> "Run Configurations"来配置运行或调试的设置,包括选择启动项目和模拟器配置...
Android Studio提供了丰富的调试工具,如Logcat、Debugger、Performance Monitor等,帮助开发者定位和解决应用中的bug和性能瓶颈。此外,对代码进行持续的优化,减少内存占用,提高CPU和GPU的利用率,也是提升用户...
10. **查看日志**:利用LogCat工具监视应用程序的日志输出,定位和解决问题。 11. **安装/卸载APK**:使用`adb install`和`adb uninstall`命令分别进行APK的安装和卸载。 12. **反编译Android程序**:使用`dexdump...
ADB由Java编写,允许开发者在计算机上通过USB或Wi-Fi与Android设备进行通信,进行调试、安装应用程序、获取设备日志以及执行各种其他操作。 ### ADB组成部分 ADB主要由三部分组成: 1. **服务器端**:通常运行在...
利用grep命令可以进一步筛选包名列表,找到包含特定关键词的应用程序。 **13. 清除app数据与缓存:** 命令:`adb shell pm clear <包名>` 该命令用于清空应用的数据与缓存,对于解决应用异常或测试新功能时很有...