Android程序静默安装安装后重新启动APP的方法

 一:需求简介

  之前boss提出一个需求,运行在广告机上的app,需要完成自动升级的功能,广告机是非触摸屏的,不能通过手动点击,所以app必须做到自动下载,自动安装升级,并且安装完成后,app还要继续运行,最好不借助其它app来实现以上功能。

 二:实现思路

  实现这个功能第一个想到的方法就是静默安装,由于广告机已经root,静默安装比较顺利,安装app的主要代码如下:

/*
  @pararm apkPath 等待安装的app全路径,如:/sdcard/app/app.apk
**/
private static boolean clientInstall(String apkPath) {
    PrintWriter PrintWriter = null;
    Process process = null;
    try {
      process = Runtime.getRuntime().exec("su");
      PrintWriter = new PrintWriter(process.getOutputStream());
      PrintWriter.println("chmod 777 " + apkPath);
      PrintWriter
          .println("export LD_LIBRARY_PATH=/vendor/lib:/system/lib");
      PrintWriter.println("pm install -r " + apkPath);
      // PrintWriter.println("exit");
      PrintWriter.flush();
      PrintWriter.close();
      int value = process.waitFor();
      Logger.e("静默安装返回值:"+value);
      return returnResult(value);
    } catch (Exception e) {
      e.printStackTrace();
      Logger.e("安装apk出现异常");
    } finally {
      if (process != null) {
        process.destroy();
      }
    }
    return false;
  }

  以上方法能顺利安装,但不能实现软件安装完成后,软件还能继续运行,因为安装后,当前app的进程已经被kill了。无法实现boss提出的,安装后软件正常运行的需求,此时如果我们还想着用android来实现这个需求,是无法实现的,因为app进程被kill了,所以需要借助第三方来启动我们的app,我第一时间想到的就是linux执行am start命令,但这个命令不能立即执行,所以需要sleep来实现这个需求,命令格式如下 sleep 时间(单位秒),am start -n ,完整代码如下:

private void execLinuxCommand(){
    String cmd= "sleep 120; am start -n 包名/包名.第一个Activity的名称";
    //Runtime对象
    Runtime runtime = Runtime.getRuntime();
    try {
      Process localProcess = runtime.exec("su");
      OutputStream localOutputStream = localProcess.getOutputStream();
      DataOutputStream localDataOutputStream = new DataOutputStream(localOutputStream);
      localDataOutputStream.writeBytes(cmd);
      localDataOutputStream.flush();
      Logger.e("设备准备重启");
    } catch (IOException e) {
      Logger.i(TAG+"strLine:"+e.getMessage());
      e.printStackTrace();
    }
  }

  涉及到的权限:

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

  注意:不是所有root过的设备,都能执行Process localProcess = runtime.exec("su");这个需要硬件支持,这个坑我遇到过。通过以上两个方法就能实现静默安装,安装完成后,app自动需行的需求。

总结

以上所述是小编给大家介绍的Android程序静默安装安装后重新启动APP的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • android实现静默安装与卸载的方法
  • Android无需root实现apk的静默安装
  • Android静默安装实现方案 仿360手机助手秒装和智能安装功能
  • Android实现静默安装的两种方法
  • Android实现静默安装实例代码
  • Android 静默安装和卸载的方法
(0)

相关推荐

  • Android 静默安装和卸载的方法

    本文介绍了Android 静默安装和卸载的方法,分享给大家,具体如下: 一. 条件 系统签名 需要放到 /system/app里作为系统app 二. 适用环境 机顶盒开发,系统开发,车机开发,智能设备开发. 三. 步骤 1. 在 AndroidManifest.xml 中 1.1. 在清单文件 AndroidManifest.xml 添加 android.uid.system 声明为系统应用. 1.2. 权限 <uses-permission android:name="android.p

  • android实现静默安装与卸载的方法

    本文实例讲述了android实现静默安装与卸载的方法.分享给大家供大家参考.具体如下: 方法1:[使用调用接口方法,由于安装卸载应用程序的部分API是隐藏的,所以必须下载Android系统源码,在源码下开发并编译之后使用MM命令编译生成APK文件] import java.io.File; import android.app.Activity; import android.os.Bundle; import android.content.Intent; import android.con

  • Android实现静默安装的两种方法

    前言 一般情况下,Android系统安装apk会出现一个安装界面,用户可以点击确定或者取消来进行apk的安装. 但在实际的项目需求中,有一种需求,就是希望apk在后台安装(不出现安装界面的提示),这种安装方式称为静默安装.下面这篇文章就给大家介绍了两种方法来实现,下面来一起看看吧. 1.root权限静默安装实现 实现实际使用的是su pm install -r filePath命令. 核心代码如下: protected static void excuteSuCMD() { Process pr

  • Android静默安装实现方案 仿360手机助手秒装和智能安装功能

    之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢?所谓的静默安装,就是不用弹出系统的安装界面,在不影响用户任何操作的情况下不知不觉地将程序装好.虽说这种方式看上去不打搅用户,但是却存在着一个问题,因为Android系统会在安装界面当中把程序所声明的权限展示给用户看,用户来评估一下这些权限然后决定是否要安装该程序,但如果使用了静默安装的方式,也就没有地方让用户看权限了,相当于用户被动接受了这些权限.在Android官方看来,这显示是一种非常危险的行为,因此静默安装这一行为系统是

  • Android无需root实现apk的静默安装

    Android的静默安装似乎是一个很有趣很诱人的东西,但是,用普通做法,如果手机没有root权限的话,似乎很难实现静默安装,因为Android并不提供显示的Intent调用,一般是通过以下方式安装apk: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startAct

  • Android实现静默安装实例代码

    静默安装主要分为以下几种方式: 一.在ROOT过的机器上,在App中使用pm install指令安装APK: // 申请su权限 Process process = Runtime.getRuntime().exec("su"); dataOutputStream = new DataOutputStream(process.getOutputStream()); // 执行pm install命令 String command = "pm install -r "

  • Android程序静默安装安装后重新启动APP的方法

     一:需求简介 之前boss提出一个需求,运行在广告机上的app,需要完成自动升级的功能,广告机是非触摸屏的,不能通过手动点击,所以app必须做到自动下载,自动安装升级,并且安装完成后,app还要继续运行,最好不借助其它app来实现以上功能.  二:实现思路 实现这个功能第一个想到的方法就是静默安装,由于广告机已经root,静默安装比较顺利,安装app的主要代码如下: /* @pararm apkPath 等待安装的app全路径,如:/sdcard/app/app.apk **/ private

  • 保持Android Service在手机休眠后继续运行的方法

    最近项目中用到了service进行计时,在连接USB的情况下一切正常,但是拔掉USB后发现,手机进入休眠后service停止了工作.最后通过 PowerManager.WakeLock 在屏幕休眠后保持cpu唤醒状态以使得service继续运行. 官网提醒:这个API会加剧耗电,所以在非必要情况下尽量不要使用.如果要使用尽量使用最低的等级,并在退出后释放资源. wake lock一共有四个等级: Flag Value CPU Screen Keyboard PARTIAL_WAKE_LOCK O

  • PowerShell批量安装msi后辍软件的方法

    如果你要安装的MSI包不止一个,可不能使用Invoke-Item,否则PowerShell不会等待前一个安装包安装完毕,就已经运行下一个安装包了.如果在批处理中,我们可能会使用msiexec file.msi /wait.在PowerShell中也可以借助于msiexec.先就这些安装包路径存储到数组中吧: 复制代码 代码如下: $msi = @("c:\file1.msi", "c:\file2.msi", "c:\file2.msi") 然后

  • 判断Android程序是否在前台运行的两种方法

    @Override protected void onStop() { if (!isAppOnForeground()) { Debug.i("dwy", "enter background"); mIsBackground = true; } else { Debug.i("dwy", "foreground"); mIsBackground = false; } Judge is App in background wh

  • Android开发升级AGP7.0后的一些适配方法技巧

    目录 升级 Java11配置 AndroidComponentsExtension onVariants Component Artifacts registerJavaGenerateTask 没了 其他 启动configuration cache 结尾 升级 年初了,我们打算升级下apg,这样之后就拥抱下jetpack compose了!! 想用comopse有两个必选项agp7.0和kotlin版本1.5.31. Java11配置 因为apg7.0需要把所有的module编译环境切换到ja

  • Eclipse搭建Android开发环境(安装ADT,Android4.4.2)

    使用Eclipse做Android开发,需要先在Eclipse上安装ADT(Android Development Tools)插件. 1.安装JDK 1.7 JDK下载:http://www.jb51.net/softs/75615.html,下载JDK7软件包,我安装的是1.7.0_55版本.安装完JDK后,配置下JDK环境即可. 2.下载Eclipse Eclipse下载:http://www.jb51.net/softs/75615.html,我下载的eclipse-java-keple

  • PyCharm安装Markdown插件的两种方法

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 从github下载的代码一般都会带有README.md文件,该文件是一个Markdown格式的文件.PyCharm是默认没有安装Markdown插件的,所以不能按照Markdown格式显示文本,显示的是原始文本.下面已github库PyWatchlog的代码为例介绍两种安装Markdown的方法. 方法一: 在PyCharm打开PyWatchlog工程后打开README.md文件

  • Android编程判断应用程序是否已安装的方法

    本文实例讲述了Android编程判断应用程序是否已安装的方法.分享给大家供大家参考,具体如下: 这里以twitter程序为例,假设twitter程序包名为"com.twitter.android".这时候可用以下代码来判断是否被安装. PackageInfo packageInfo; try { packageInfo = this.getPackageManager().getPackageInfo( "com.twitter.android", 0); } ca

随机推荐