`
android_madness
  • 浏览: 39932 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

[Android]APK程序卸载提示 (转)

阅读更多
Android上能不能实现卸载时提示呢,比如卸载某某软件时,做个用户调查卸载的原因。
我以前想着是的不行的,以前的想法是:
Windows上卸载时能实现此功能是因为有些程序的卸载是自己实现的,非系统操作。
但android上目前来说还不支持,系统卸载时,还没发现有啥接口可以和目标卸载程序交互。

呵呵,今天鼓捣LogCat,发现还是可以的。
实现基础是:
1.通过注册权限,能够获取LogCat的输出流的输出信息。
2.进入系统的卸载界面时,"打包安装程序(com.android.packageinstaller)"会输出如下信息

01-22 16:29:15.250: INFO/ActivityManager(147): Starting activity: Intent { act=android.intent.action.DELETE dat=package:lab.sodino.uninstallhint cmp=com.android.packageinstaller/.UninstallerActivity }

好了,有这句话就足够了。截取输出流信息,当获取字符串中包含"android.intent.action.DELETE"和"<you_package>"时,就启动卸载提示页面。

话就这么多了。接下来看效果图,上代码。

package lab.sodino.uninstallhint;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

/**
 * @author Sodino E-mail:sodinoopen@hotmail.com
 * @version Time:2011-1-12 上午10:09:59
 */
public class MainActivity extends Activity implements LogcatObserver {
        private TextView txtInfo;
        private Handler handler;

        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                Button btnScannerLogcat = (Button) findViewById(R.id.btnScanLogcat);
                btnScannerLogcat.setOnClickListener(new Button.OnClickListener() {
                        public void onClick(View view) {
                                // 开启Logcat流监听
                                LogcatScanner.startScanLogcatInfo(MainActivity.this);
                        }
                });
                Button btnUninstallMe = (Button) findViewById(R.id.btnUninstallMe);
                btnUninstallMe.setOnClickListener(new Button.OnClickListener() {
                        public void onClick(View view) {
                                // 调用应用程序信息
                                Intent intent = new Intent(Intent.ACTION_VIEW);
                                // com.android.settings/.InstalledAppDetails
                                intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
                                intent.putExtra("pkg", "lab.sodino.uninstallhint");
                                startActivity(intent);
                        }
                });
                txtInfo = (TextView) findViewById(R.id.txtInfo);
                handler = new Handler() {
                        public void handleMessage(Message msg) {
                                txtInfo.append(String.valueOf(msg.obj) + "\n");
                        }
                };
        }

        public void handleNewLine(String info) {
                Message msg = new Message();
                msg.obj = info;
                handler.sendMessage(msg);
                if (info.contains("android.intent.action.DELETE") && info.contains(getPackageName())) {
                        // 启动删除提示
                        Intent intent = new Intent();
                        intent.setClass(this, UninstallWarningActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
                }
        }
}


package lab.sodino.uninstallhint;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 *@author Sodino Email:sodinoopen@hotmail<br/>
 *@version 2011-1-22 上午11:10:56
 */
public class LogcatScanner {
        private static AndroidLogcatScanner scannerThead;

        public final static void startScanLogcatInfo(LogcatObserver observer) {
                if (scannerThead == null) {
                        scannerThead = new AndroidLogcatScanner(observer);
                        scannerThead.start();
                        LogOut.out(LogcatScanner.class, "scannerThread.start()");
                }
        }

        static class AndroidLogcatScanner extends Thread {
                private LogcatObserver observer;

                public AndroidLogcatScanner(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.handleNewLine(line);
                                int waitValue;
                                waitValue = runtime.exec(cmds).waitFor();
                                observer.handleNewLine("waitValue=" + waitValue + "\n Has do Clear logcat cache.");
                                process = runtime.exec(shellCmd);
                                is = process.getInputStream();
                                dis = new DataInputStream(is);
                                while ((line = dis.readLine()) != null) {
                                        observer.handleNewLine(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();
                                }
                        }
                }
        }
}


package lab.sodino.uninstallhint;

/**
 * @author Sodino E-mail:sodinoopen@hotmail.com
 * @version Time:2011-1-22 下午03:00:54
 */
public interface LogcatObserver {
        public void handleNewLine(String line);
}


package lab.sodino.uninstallhint;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * @author Sodino E-mail:sodinoopen@hotmail.com
 * @version Time:2011-1-12 上午10:26:09
 */
public class UninstallWarningActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.uninstall_warning);
                Button btnContinue = (Button) findViewById(R.id.btnContinue);
                btnContinue.setOnClickListener(new Button.OnClickListener() {
                        public void onClick(View view) {
                                UninstallWarningActivity.this.finish();
                        }
                });
                Button btnCancel = (Button) findViewById(R.id.btnCancel);
                btnCancel.setOnClickListener(new Button.OnClickListener() {
                        public void onClick(View view) {
                                UninstallWarningActivity.this.finish();
                                ActivityManager actMag = (ActivityManager) UninstallWarningActivity.this
                                                .getSystemService(Context.ACTIVITY_SERVICE);
                                //杀掉系统的打包安装程序。
                                if (android.os.Build.VERSION.SDK_INT < 8) {
                                        actMag.restartPackage("com.android.packageinstaller");
                                } else {
                                        actMag.killBackgroundProcesses("com.android.packageinstaller");
                                }
                                Intent i = new Intent(Intent.ACTION_MAIN);
                                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                i.addCategory(Intent.CATEGORY_HOME);
                                startActivity(i);
                        }
                });
        }
}


        <uses-permission android:name="android.permission.READ_LOGS" />
        <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
        <uses-permission android:name="android.permission.RESTART_PACKAGES"/>
分享到:
评论
1 楼 zhongqiuming 2012-04-27  

相关推荐

    adb批量安装卸载apk

    4. **应用管理**:安装、卸载、启动、停止、查询应用程序状态。 ### BAT脚本基础 BAT文件是Windows系统中的批处理脚本,用于自动化执行一系列命令。通过编写简单的批处理脚本,我们可以方便地执行重复性的任务,如...

    android批量安装卸载软件,查看包名

    在Android系统中,批量管理应用程序是一项实用的技能,特别是对于开发者和系统管理员而言。本文将深入探讨如何批量安装、卸载软件以及查看Android设备上的应用包名,这些操作都有助于提升工作效率。 批量安装...

    批量安装卸载android应用

    批量安装涉及将apk文件(Android应用程序的安装包)传输到设备,并通过adb的install命令来安装。BatInstaller可能包含一个批处理脚本,该脚本接受apk文件的路径列表,然后调用adb install命令依次安装每个应用。 ...

    Android 程序的安装、卸载和更新.zip

    在Android操作系统中,程序的安装、卸载和更新是用户日常使用的重要环节。本文将深入探讨这些过程,以便开发者和用户更好地理解Android系统的运作机制。 首先,我们来谈谈Android程序的安装。Android应用程序通常以...

    安卓安装卸载相关-Android利用设备管理器实现APP无法卸载功能.rar

    在安卓系统中,开发者可以通过利用设备管理器(Device Administration API)来实现应用程序的保护机制,使其变得难以或无法被用户常规方式卸载。这个技术主要适用于企业级应用,以确保公司的数据安全和应用策略得以...

    Android应用源码之程序的安装、卸载和更新.zip

    这份压缩包文件"Android 程序的安装、卸载和更新"很可能是包含了一系列关于这个主题的源码示例,用于帮助开发者更深入地理解这些过程的工作机制。下面,我们将详细探讨这些关键知识点。 1. **安装过程**: - 当...

    程序的安装、卸载和更新

    在Android平台上,程序的安装、卸载和更新是操作系统的核心功能,它们对于用户来说是日常操作,对于开发者来说则是发布和维护应用的关键步骤。本文将深入探讨这些过程,并提供相关技术细节。 首先,我们来讨论程序...

    apk安装器android

    APK安装器是一款专为Android操作系统设计的应用程序,它的主要功能是帮助用户在没有Google Play或其他官方应用商店的情况下,方便地安装APK格式的应用程序。在Android设备上,APK文件是应用程序的安装包,类似于iOS...

    android 导出,安装 卸载 讲解

    本文将深入讲解如何导出、安装以及卸载Android应用程序,同时也会涉及一些与之相关的工具和源码分析。 首先,导出Android应用涉及到构建APK文件。APK是Android平台上的可执行文件格式,包含了应用程序的所有资源、...

    安卓卸载程序

    安装完成后,用户可以在手机上找到并启动这个卸载程序,然后选择要卸载的软件,按照提示操作即可完成卸载。 值得注意的是,由于安卓系统的安全机制,非系统应用的卸载通常需要用户拥有管理员权限。因此,在使用此类...

    android安装系统目录下的APK包

    在Android系统中,APK(Android Package)是应用程序的安装包格式,类似于其他操作系统中的.exe文件。本主题将深入探讨如何在Android系统的安装目录下安装APK包,并提供一个简单的例子来帮助理解这一过程。 首先,...

    xapk工具包.zip

    XAPK文件将应用程序的不同组件(如资源、库、插件等)分离并打包在单独的文件中,便于管理和更新。本“xapk工具包.zip”包含了一个用于处理XAPK文件的安装工具,是个人常用的Android工具之一,特别适合那些经常接触...

    android_apk

    Android APK 是Android操作系统上应用程序的主要格式,其全称为Android Package,是Google为Android平台设计的软件包文件。本文将深入探讨Android APK的工作原理、安装过程以及如何在电脑端进行安装。 首先,理解...

    卸载应用提示功能

    1. **应用程序卸载流程**:通常,应用的卸载会触发系统级别的卸载过程,这个过程包括清理注册表项、删除程序文件夹以及移除配置信息等。了解这个流程有助于我们识别可能出现问题的环节。 2. **源码分析**:对于...

    Android APK+Dex文件反编译及回编译工具v2.0.2

    是一款,针对Android OS系统的APK程序,直接反编译修改的工具。 APKDB集合了当今最强悍,最犀利的APK及Dex文件编译工具; 正常安装后,它直接在【鼠标右键】创建快捷菜单; 非常方便汉化工作者,对APK或Dex文件...

    安卓Android源码——程序的安装、卸载和更新.zip

    在安卓(Android)操作系统中,程序的安装、卸载和更新是用户与系统交互的重要环节。这些过程涉及到了系统的包管理器服务(Package Manager Service)、应用程序框架层(Application Framework Layer)以及Linux内核...

    安卓防卸载的实现。。

    在安卓平台上,应用程序的可卸载性是其开放性的一部分,但有时开发者可能希望某些应用不被用户轻易卸载,以确保系统功能的完整性或安全。这篇内容将深入探讨如何在安卓系统中实现防卸载功能,以保护关键应用不受恶意...

    应用源码之程序的安装、卸载和更新.zip

    本文将深入探讨这些过程,基于给定的“应用源码之程序的安装、卸载和更新.zip”压缩包,我们将围绕Android应用生命周期、安装流程、APK格式、权限管理以及自动更新机制展开讨论。 首先,Android应用程序主要以APK...

    Android应用源码之程序的安装、卸载和更新-IT计算机-毕业设计.zip

    在Android平台上,应用程序的安装、卸载和更新是开发者和用户日常操作的重要组成部分。这篇毕业设计的源码Demo深入解析了这些过程,为学生提供了一次实战性的学习机会。下面我们将详细探讨Android应用的安装、卸载和...

    Android APK+Dex文件反编译及回编译工具(APKDB)v.1.9.2 正式版

    是一款,针对Android OS系统的APK程序,直接反编译修改的工具。 APKDB集合了当今最强悍,最犀利的APK及Dex文件编译工具; 正常安装后,它直接在【鼠标右键】创建快捷菜单; 非常方便汉化工作者,对APK或Dex文件...

Global site tag (gtag.js) - Google Analytics