- 浏览: 41085 次
- 性别:
- 来自: 福州
文章分类
最新评论
-
android_madness:
ownWell 写道感觉还是用Intent好点吧 这个静态类是 ...
tabhost如何传递参数 -
ownWell:
感觉还是用Intent好点吧 这个静态类是不可取的
tabhost如何传递参数 -
xmllong:
能把关键代码放上来吗?谢谢
tabhost如何传递参数 -
zhongqiuming:
...
[Android]APK程序卸载提示 (转) -
android_madness:
yxwang0615 写道数据量太大使用静态就不是好事了说的是 ...
tabhost如何传递参数
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>"时,就启动卸载提示页面。
话就这么多了。接下来看效果图,上代码。
我以前想着是的不行的,以前的想法是:
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"/>
发表评论
-
学Android开发不可不知的Android应用程序四大组件(转)
2012-03-12 23:15 1040Android的一个核心特性就 ... -
版本检测和更新(转)
2012-01-12 11:19 905版本检测和更新是每个应用程序必须做的一个功能,所以在这里晒下: ... -
android EditText中inputType的属性列表
2012-01-10 16:54 1626android 1.5以后添加了软件虚拟键盘的功能,所以在输入 ... -
(转)解决requestFocus后依旧无法获得焦点问题
2012-01-10 11:24 4723例:有两个button,上下排列,想要实现进入这屏后,焦点默认 ... -
(转)notifyDataSetChanged() 动态更新ListView
2012-01-09 15:58 2377有时候我们需要修改已经生成的列表,添加或者修改数据,notif ... -
(转)thread,runable,区别
2011-12-27 09:14 1474使用runable最主要的原因 ... -
(转)从进程-线程的角度,理解Activity,Service,Broadcast
2011-12-26 16:08 1050写下来仅记录下困惑了 ... -
TabActivity 无法bindService 解决方法(转)
2011-12-20 12:00 650如果使用TabActivity来进行开发,并且程序需要针对Ta ... -
Service 概述
2011-12-20 10:22 829Service概念及用途: Android中的服务,它与Ac ... -
动态添加tableview
2011-12-14 14:34 1213TableLayout table=(Ta ... -
tabhost如何传递参数
2011-12-13 11:39 2431当你使用android只带tabhost的时候,你会发现不管你 ... -
ACTIVITY显示重载
2011-12-09 16:59 1402网上常用的让activity的方式无非于使用setConten ...
相关推荐
4. **应用管理**:安装、卸载、启动、停止、查询应用程序状态。 ### BAT脚本基础 BAT文件是Windows系统中的批处理脚本,用于自动化执行一系列命令。通过编写简单的批处理脚本,我们可以方便地执行重复性的任务,如...
在安卓Android系统中,用户有时会想要卸载或删除预装的应用程序,以释放存储空间或优化设备性能。然而,由于安全原因,Android系统通常不允许直接卸载系统应用。以下是一些步骤和注意事项,帮助你了解如何卸载或删除...
### Android通过命令卸载系统内置软件 在进行Android应用程序开发时,有时会遇到需要移除设备上预装的系统应用的情况。例如,在某些情况下,如果你的应用程序与预装的系统应用具有相同的包名,那么你的应用程序将...
在Android系统中,批量管理应用程序是一项实用的技能,特别是对于开发者和系统管理员而言。本文将深入探讨如何批量安装、卸载软件以及查看Android设备上的应用包名,这些操作都有助于提升工作效率。 批量安装...
批量安装涉及将apk文件(Android应用程序的安装包)传输到设备,并通过adb的install命令来安装。BatInstaller可能包含一个批处理脚本,该脚本接受apk文件的路径列表,然后调用adb install命令依次安装每个应用。 ...
在Android操作系统中,程序的安装、卸载和更新是用户日常使用的重要环节。本文将深入探讨这些过程,以便开发者和用户更好地理解Android系统的运作机制。 首先,我们来谈谈Android程序的安装。Android应用程序通常以...
### Android模拟器上应用程序的安装与卸载 #### 一、引言 随着移动应用开发的日益普及,Android模拟器成为开发者不可或缺的工具之一。它允许开发者在无需真实设备的情况下测试和调试Android应用程序。本文将详细...
这份压缩包文件"Android 程序的安装、卸载和更新"很可能是包含了一系列关于这个主题的源码示例,用于帮助开发者更深入地理解这些过程的工作机制。下面,我们将详细探讨这些关键知识点。 1. **安装过程**: - 当...
在Android平台上,程序的安装、卸载和更新是操作系统的核心功能,它们对于用户来说是日常操作,对于开发者来说则是发布和维护应用的关键步骤。本文将深入探讨这些过程,并提供相关技术细节。 首先,我们来讨论程序...
APK安装器是一款专为Android操作系统设计的应用程序,它的主要功能是帮助用户在没有Google Play或其他官方应用商店的情况下,方便地安装APK格式的应用程序。在Android设备上,APK文件是应用程序的安装包,类似于iOS...
本文将深入讲解如何导出、安装以及卸载Android应用程序,同时也会涉及一些与之相关的工具和源码分析。 首先,导出Android应用涉及到构建APK文件。APK是Android平台上的可执行文件格式,包含了应用程序的所有资源、...
在进行Android应用开发时,经常需要在模拟器上安装、测试并卸载各种.apk文件。然而,并不是所有开发者都熟悉如何有效地执行这一操作。本文将详细介绍如何在Android模拟器中删除.apk文件,并提供三种不同的方法。 ##...
安装完成后,用户可以在手机上找到并启动这个卸载程序,然后选择要卸载的软件,按照提示操作即可完成卸载。 值得注意的是,由于安卓系统的安全机制,非系统应用的卸载通常需要用户拥有管理员权限。因此,在使用此类...
XAPK文件将应用程序的不同组件(如资源、库、插件等)分离并打包在单独的文件中,便于管理和更新。本“xapk工具包.zip”包含了一个用于处理XAPK文件的安装工具,是个人常用的Android工具之一,特别适合那些经常接触...
在Android系统中,APK(Android Package)是应用程序的安装包格式,类似于其他操作系统中的.exe文件。本主题将深入探讨如何在Android系统的安装目录下安装APK包,并提供一个简单的例子来帮助理解这一过程。 首先,...
在Mac OS系统中,安装Android应用程序通常比在Windows或Android设备上更为复杂,因为苹果的封闭生态环境不直接支持APK格式。不过,通过特定的工具,我们可以在Mac上轻松安装APK文件。"Mac os系统下安卓(APK)安装器...
Android APK 是Android操作系统上应用程序的主要格式,其全称为Android Package,是Google为Android平台设计的软件包文件。本文将深入探讨Android APK的工作原理、安装过程以及如何在电脑端进行安装。 首先,理解...
本篇文章将详细介绍如何将从网络上下载的应用程序 `.apk` 文件安装至Android设备的过程。文章将分为两个主要部分进行阐述:第一部分着重介绍如何将 `.apk` 文件从电脑上传输到Android设备,并在设备上安装该文件;第...
是一款,针对Android OS系统的APK程序,直接反编译修改的工具。 APKDB集合了当今最强悍,最犀利的APK及Dex文件编译工具; 正常安装后,它直接在【鼠标右键】创建快捷菜单; 非常方便汉化工作者,对APK或Dex文件...