/**
   * 写文件
   *
   * @param 文件路径
   * @param 内容列表
   * @param 附加是附加的 ,如果这是真的,其他写的文件,明确内容的文件和写进去
   * @return 否则返回假如果contentList是空的,真的
   * @throws RuntimeException if an error occurs while operator FileWriter
   */
  public static boolean writeFile(String filePath, List<String> contentList, boolean append) {
    if (ListUtils.isEmpty(contentList)) {
      return false;
    }

    FileWriter fileWriter = null;
    try {
      makeDirs(filePath);
      fileWriter = new FileWriter(filePath, append);
      int i = 0;
      for (String line : contentList) {
        if (i++ > 0) {
          fileWriter.write("\r\n");
        }
        fileWriter.write(line);
      }
      fileWriter.close();
      return true;
    } catch (IOException e) {
      throw new RuntimeException("IOException occurred. ", e);
    } finally {
      if (fileWriter != null) {
        try {
          fileWriter.close();
        } catch (IOException e) {
          throw new RuntimeException("IOException occurred. ", e);
        }
      }
    }
  }
  /**
   * whether the app whost package's name is packageName is on the top of the stack
   *
   * <ul>
   *   <strong>Attentions:</strong>
   *   <li>You should add <strong>android.permission.GET_TASKS</strong> in manifest
   * </ul>
   *
   * @param context
   * @param packageName
   * @return if params error or task stack is null, return null, otherwise retun whether the app is
   *     on the top of stack
   */
  public static Boolean isTopActivity(Context context, String packageName) {
    if (context == null || StringUtils.isEmpty(packageName)) {
      return null;
    }

    ActivityManager activityManager =
        (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(1);
    if (ListUtils.isEmpty(tasksInfo)) {
      return null;
    }
    try {
      return packageName.equals(tasksInfo.get(0).topActivity.getPackageName());
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
  }
  /**
   * whether this process is named with processName
   *
   * @param context
   * @param processName
   * @return
   *     <ul>
   *       return whether this process is named with processName
   *       <li>if context is null, return false
   *       <li>if {@link ActivityManager#getRunningAppProcesses()} is null, return false
   *       <li>if one process of {@link ActivityManager#getRunningAppProcesses()} is equal to
   *           processName, return true, otherwise return false
   *     </ul>
   */
  public static boolean isNamedProcess(Context context, String processName) {
    if (context == null) {
      return false;
    }

    int pid = android.os.Process.myPid();
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> processInfoList = manager.getRunningAppProcesses();
    if (ListUtils.isEmpty(processInfoList)) {
      return false;
    }

    for (RunningAppProcessInfo processInfo : processInfoList) {
      if (processInfo != null
          && processInfo.pid == pid
          && ObjectUtils.isEquals(processName, processInfo.processName)) {
        return true;
      }
    }
    return false;
  }