怎么可以保存apk的数据我英菲克 永不卸载apk下次用的时候还有数据

后使用快捷导航没有帐号?
一步搞定
只需一步,快速开始
如今手机品牌和型号繁多,但相信每人心中还是会有自己最信仰的那个品牌,下一部自用的手机你打算换什么品牌的什么产品呢?
Powered by怎么清除在卸载apk后在data/data留下的残留数据。_百度知道
怎么清除在卸载apk后在data/data留下的残留数据。
提问者采纳
手机吧,你下载一个手机管家
里面一下就清理了
安全管家在没有获取root权限的情况下,能删除data/data
有一个软件可以root
授予权限然后你就删掉
要不你用读卡器插在电脑上彻底清除
data/data在手机根目录不是内存上的
嗯嗯,那就root
data是你哪个软件的残留
是你买手机自带的吗
提问者评价
太给力了,你的回答完美地解决了我的问题,非常感谢!
其他类似问题
为您推荐:
apk的相关知识
其他2条回答
找到文件夹直接删或者下一个管家全家,360之类的
是手机根目录下的data/data
那需要手机root权限
不建议开启,非要的话在网上找你手机型号的获得办法吧
下载re文件管理器,删
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁手机的软件安装后,可以把原来的apk文件删除吗?_百度知道
手机的软件安装后,可以把原来的apk文件删除吗?
可以删除APK是AndroidPackage的缩写,即Android安装包(apk)。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。apk文件和sis一样,把android sdk编译的工程打包成一个安装程序文件,格式为apk。安装完之后里面的数据就写入到系统文件里面了,安装包被删除是没有关系的。
其他类似问题
为您推荐:
提问者采纳
可以的,只要删得掉
提问者评价
apk的相关知识
其他3条回答
只要你手机不重装的时候再要装软件
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁android 卸载程序、清除数据、停止服务使用方法
要实现卸载程序、清除数据、停止正在运行的服务这几大模块,现在将代码粗略总结如下:
  主要运用到的类有
  PackageManager
  ActivityManager
  ApplicationInfo
  RunningServiceInfo
  Method
  还有两个android.pm下的源文件用于生成桩,IPackageStatsObserver.java
和 IPackageDataObserver.java,由名字可以看出,他们是跟包的状态和大小有关的,在网上找到这两个文件的源码后,把他们放在工程src目录下的android.pm包下,自己建包。
  首先要获得系统中已经装了的apk,apk分为两类第一是系统的apk,第二是第三方的apk,所以在获取apk时可以指定一个过滤器,见如下代码:
  java代码
// 添加过滤 ,得到全部程序,系统程序,用户自己安装的程序
  private List queryFilterAppInfo(int filter) {
  // 查询所有已经安装的应用程序
  List listAppcations =
pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
  Collections.sort(listAppcations,new
ApplicationInfo.DisplayNameComparator(pm));// 排序
  List appInfos = new ArrayList(); // 保存过滤查到的AppInfo
  // 根据条件来过滤
  switch (filter) {
  case FILTER_ALL_APP: // 所有应用程序
  appInfos.clear();
  for (ApplicationInfo app : listAppcations) {
  if (app.packageName.equals("com.android.appmanager")) { // 过滤自己
  appInfos.add(getAppInfo(app));
  return appI
  case FILTER_SYSTEM_APP: // 系统程序
  appInfos.clear();
  for (ApplicationInfo app : listAppcations) {
  if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
  if (app.packageName.equals("com.android.appmanager""font-family:Arial,
Helvetica, sans-">)// wifi { // 过滤自己
  appInfos.add(getAppInfo(app));
  return appI
  case FILTER_THIRD_APP: // 第三方应用程序
  appInfos.clear();
  for (ApplicationInfo app : listAppcations) {
  // 非系统程序
  if ((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
  if (app.packageName.equals("com.android.appmanager"))
  appInfos.add(getAppInfo(app));
  // 本来是系统程序,被用户手动更新后,该系统程序也成为第三方应用程序了
  else if ((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0)
  if (app.packageName.equals("geeya.android.appmanage")) { // 过滤自己
  appInfos.add(getAppInfo(app));
  default:
  return appI
  AppInfo是我自己定义的一个类,里面包含了应用程序的包名、数据区大小、代码区大小、等等一些属性。
  好,现在我们来获取app包的数据区大小、缓存区大小、代码区大小,这里要用反射的机制去获取PackageManager类的隐藏方法getPackageSizeInfo(),这个方法的具体实现是通过回调函数来实现的,这里要用到IPackageStatsObserver这个类生成的桩。
  java代码
// aidl文件形成的Bindler机制服务类
  public class PkgSizeObserver extends IPackageStatsObserver.Stub {
  * 回调函数,
  * @param pStatus
  * ,返回数据封装在PackageStats对象中
  * @param succeeded
  * 代表回调成功
  @Override
  public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
   // 缓存大小
   // 数据大小
   // 应用程序大小
   // 总大小
  // System.out.println("data start init!");
  synchronized (Integer.class) {
  cachesize = pStats.cacheS // 缓存大小
  datasize = pStats.dataS // 数据大小
  codesize = pStats.codeS // 应用程序大小
  totalsize = cachesize &#43; datasize &#43;
  Message msg = mHandler.obtainMessage();
  msg.what = MSG_SIZE_CHANGE;
  Bundle bundle = new Bundle();
  bundle.putLong("cachesize", cachesize);
  bundle.putLong("datasize", datasize);
  bundle.putLong("codesize", codesize);
  bundle.putLong("totalsize", totalsize);
  bundle.putString("packageName", pStats.packageName);
  msg.obj =
  mHandler.sendMessage(msg);
  //获取每个apk的大小信息,包括数据区、代码区、缓存区
  // 查询包的大小信息
  public void queryPacakgeSize(String pkgName) throws Exception {
  if (pkgName != null) {
  // 使用放射机制得到PackageManager类的隐藏函数getPackageSizeInfo
  PackageManager pm = getPackageManager(); // 得到pm对象
  // 通过反射机制获得该隐藏函数
  Method getPackageSizeInfo =
pm.getClass().getDeclaredMethod("getPackageSizeInfo", String.class,
  IPackageStatsObserver.class);
  getPackageSizeInfo.invoke(pm, pkgName, new PkgSizeObserver());
  } catch (Exception ex) {
  // Log.e(TAG, "NoSuchMethodException");
  ex.printStackTrace();
   // 抛出异常
  或得到app的大小数据后,封装成消息发送出去,这是最好的方法!!
  这里也介绍一个将long型数据转换成文件大小&#26684;式的数据。
  java代码
// 系统函数,字符串转换 long -String (kb)
  private String formateFileSize(long size) {
  return Formatter.formatFileSize(MainActivity.this, size);
  好,现在我们来清除用户数据,这里要用到之前的那个文件IPackageDataObserver,跟获取app大小一样的,通过回调来实现。
  java代码
// 清除用户数据的操作
  class ClearUserDataObserver extends IPackageDataObserver.Stub {
  public void onRemoveCompleted(final String packageName,final boolean
succeeded) {
  final Message msg = mHandler.obtainMessage();
  if (succeeded) {
  msg.what = CLEAR_USER_DATA;
  } else {
  msg.what = NOT_CLEAR_USER_DATA;
  mHandler2.sendMessage(msg);
  // 清除apk的数据
  public void clearAppUserData(String pkgname){
  // 经测试,该方法不能用反射得到,没办法,我只好这样写,只能在下编译。
  pm.clearApplicationUserData(pkgname, new ClearUserDataObserver());
  好,现在到卸载程序的时候了,看代码
  java代码
// 卸载apk
  ublic void unInstallApp(String pkgname) {
  Log.e("unInstallApp(String pkgname)","pkgname is"&#43; pkgname);
  Intent intent = new Intent();
  // 该动作是我在android框架层自己定义的一个动作,DELETE.HIDE,表明直接就卸载了。不经过原生的那一个对话。
  intent.setAction("android.intent.action.DELETE.HIDE"); //
自己定义的动作,DELETE.HIDE,不需要经过系统的确认卸载界面。直接卸载!
  Uri packageURI = Uri.parse("package:" &#43; pkgname);
  intent.setData(packageURI);
  startActivity(intent);
  关于apk的管理就差不多了,现在来看看正在运行的服务的管理
  首先,获取正在运行的服务:
  这里我的RunningInfo是我自己定义的一个类,主要服务的一些属性,比如包名、uid、pid等等那些
  java代码
// 得到正在运行的服务
  public List getRunningService() {
  List runServiceList = am.getRunningServices(30);
  List Services_List = new ArrayList(); //
保存过滤查到的AppInfo
  Log.e("getRunningService.size = ",
  new Integer(runServiceList.size()).toString());
  String pkgname = "";
  ApplicationInfo appByPkgName =
  for (RunningServiceInfo info : runServiceList) {
  pkgname = info.service.getPackageName();
  // System.out.println("service package is :" &#43; pkgname &#43;
  // " pid = "&#43; info.pid); // 程序的ID号
  // 过滤掉这些系统本身的服务。只显示用户安装的服务
  if (pkgname.equals("com.android.appmanager") ) { // 过滤自己
  appByPkgName = pm.getApplicationInfo(pkgname,
  PackageManager.GET_UNINSTALLED_PACKAGES); // 最后一个参数一般为0
  // 就好。
  } catch (NameNotFoundException e) {
  // Log.e("MainActivity 841 line","appByPkgName =
pm.getApplicationInfo(pkgname, PackageManager.GET_UNINSTALLED_PACKAGES)
Exception !");
  e.printStackTrace();
  Services_List.add(getRunningInfo(appByPkgName)); //
里面含有相同的包的服务。这里哦我们只要求显示一个即可。
  // 放入set中过滤相同包名的, 这里我复写了RunningInfo 的compareTo方法你 规则是
pkgName相等两个对象就算相等!
  Set set = new HashSet();
  for (RunningInfo x : Services_List) {
  set.add(x);
  for (RunningInfo y : set) {
  Services_List.add(y);
  return Services_L
  好,获取到了正在运行的服务之后,就可以随意停止服务了,停止服务的代码是:
  java代码
// 强行停止一个app
  ublic boolean stopApp(String pkgname) {
  boolean flag =
  ActivityManager am = (ActivityManager)
mContext.getSystemService(Context.ACTIVITY_SERVICE);
  Method forceStopP
  forceStopPackage = am.getClass().getDeclaredMethod("forceStopPackage",
String.class); // 反射得到隐藏方法(hide)
  forceStopPackage.setAccessible(true);//获取私有成员变量的&#20540;
  forceStopPackage.invoke(am, pkgname);
  flag =
  } catch (IllegalArgumentException e) {
  e.printStackTrace();
  flag =
  } catch (IllegalAccessException e) {
  e.printStackTrace();
  flag =
  } catch (InvocationTargetException e) {
  e.printStackTrace();
  flag =
  } catch (SecurityException e) {
  e.printStackTrace();
  flag =
  } catch (NoSuchMethodException e) {
  e.printStackTrace();
  flag =
  同样也是用反射的机制来得到隐藏类。
  到这里,应用程序管理的功能就差不多了,
  剩下就只是界面上的事情和程序的处理流程上的事情,应该还好!

我要回帖

更多关于 android 静默卸载apk 的文章

 

随机推荐