Android-->安装程序(APK)后并启动程序(APP

2017-04-27  本文已影响109人  angcyo

应用场景
一般现在的APP,都自带自动更新功能,但是如果不处理的,安装APK完成后,默认是不会启动的;
这个时候,就有必要查看此文了;

开始本文:
原理:就是通过,安装程序之前,启动一个定时任务,任务发送一个广播,广播收到之后,启动程序.

附上代码:
1:安装APK的代码(需要root权限)

    public static String install(String str) {
        String[] args = { "/system/bin/pm", "install", "-r", str };
        String result = "";
        ProcessBuilder processBuilder = new ProcessBuilder(args);
        Process process = null;
        InputStream errIs = null;
        InputStream inIs = null;
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int read = -1;
            process = processBuilder.start();
            errIs = process.getErrorStream();
            while ((read = errIs.read()) != -1) { // 获取错误信息
                baos.write(read);
            }

            baos.write('\n');
            inIs = process.getInputStream();
            while ((read = inIs.read()) != -1) { // 获取输出信息
                baos.write(read);
            }

            byte[] data = baos.toByteArray(); //
            result = new String(data);
            return result; // 返回值
        } catch (Exception e) {
            return "";
        } finally {
            try {
                if (errIs != null) {
                    errIs.close();
                }
                if (inIs != null) {
                    inIs.close();
                }
            } catch (Exception e) {
            }
        }
    }

2:按钮事件代码

    public void install(View view) {
        String sdPath = Environment.getExternalStorageDirectory()
                .getAbsolutePath();

        //主要就是通过,安装程序之前,启动一个定时任务,任务发送一个广播,广播收到之后,启动程序
        Intent ite = new Intent(this, StartReceiver.class);
        ite.setAction("install_and_start");
        PendingIntent SENDER = PendingIntent.getBroadcast(this, 0, ite,
                PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager ALARM = (AlarmManager) getSystemService(ALARM_SERVICE);
        ALARM.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000,
                SENDER);

        install(sdPath + "/InstallAndStartDemo.apk");
        finish();

    }

3:启动程序的广播

public class StartReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equalsIgnoreCase("install_and_start")) {
            Intent intent2 = new Intent(context, MainActivity.class);
            intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//注意,不能少
            context.startActivity(intent2);
        }
    }

}

4:清单文件(Manifest.xml)

        <receiver android:name="com.example.installandstartdemo.StartReceiver">
            <intent-filter >
                <action android:name="install_and_start"/>
            </intent-filter>
        </receiver>

安装APK的2种方式:

/**
* 使用root方式,静态安装apk
*/
private boolean installUseRoot(String filePath) {
  if (TextUtils.isEmpty(filePath))
      throw new IllegalArgumentException("Please check apk file path!");
  boolean result = false;
  Process process = null;
  OutputStream outputStream = null;
  BufferedReader errorStream = null;
  try {
      process = Runtime.getRuntime().exec("su");
      outputStream = process.getOutputStream();

      String command = "pm install -r " + filePath + "\n";
      outputStream.write(command.getBytes());
      outputStream.flush();
      outputStream.write("exit\n".getBytes());
      outputStream.flush();
      process.waitFor();
      errorStream = new BufferedReader(new InputStreamReader(process.getErrorStream()));
      StringBuilder msg = new StringBuilder();
      String line;
      while ((line = errorStream.readLine()) != null) {
          msg.append(line);
      }
      Log.d(TAG, "install msg is " + msg);
      if (!msg.toString().contains("Failure")) {
          result = true;
      }
  } catch (Exception e) {
      Log.e(TAG, e.getMessage(), e);
  } finally {
      try {
          if (outputStream != null) {
              outputStream.close();
          }
          if (errorStream != null) {
              errorStream.close();
          }
      } catch (IOException e) {
          outputStream = null;
          errorStream = null;
          process.destroy();
      }
  }
  return result;
}

/**
* 正常方式安装APK
*/
private void installUseAS(String filePath) {
  Uri uri = Uri.fromFile(new File(filePath));
  Intent intent = new Intent(Intent.ACTION_VIEW);
  intent.setDataAndType(uri, "application/vnd.android.package-archive");
  mContext.startActivity(intent);
}

源代码下载:http://download.csdn.net/detail/angcyo/8772963


至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.

上一篇下一篇

猜你喜欢

热点阅读