下载APK,检测APK是否安装,检测程序是否运行

通过url下载apk,比较下载文件大小,通过handler更新界面,达到显示下载进度的目的。操作网络需要在子线程中进行

Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case 0:
            result = downloadFileSize * 100 / fileSize;
            text.setText(result + "%");
            break;
        case 1:
            //下载完成
            break;
        default:
            break;
        }
    }
};

 // 下载APK
protected File downloadFile(String urlStr, int id) {
    // 准备拼接新的文件名(保存在存储卡后的文件名)
    newFilename = urlStr.substring(urlStr.lastIndexOf("/") + 1);
    newFilename = downloadCache + "/" + newFilename;
    File file = new File(newFilename);
    // 如果目标文件已经存在,则删除。产生覆盖旧文件的效果
    if (file.exists()) {
        OpenFile(file);
        // file.delete();
    } else {
        try {
            // 构造URL
            URL url = new URL(urlStr);
            // 打开连接
            URLConnection con = url.openConnection();
            // 获得文件的长度
            int contentLength = con.getContentLength();
            System.out.println("长度 :" + contentLength);
            // 输入流
            InputStream is = con.getInputStream();
            fileSize = con.getContentLength();// 根据响应获取文件大小
            // 1K的数据缓冲
            byte[] bs = new byte[1024];
            downloadFileSize = 0;
            // 输出的文件流
            FileOutputStream os = new FileOutputStream(newFilename);
            do {
                int numread = is.read(bs);// 读取到的数据长度
                if (numread == -1) {
                    break;
                }
                os.write(bs, 0, numread);
                downloadFileSize += numread;
                sendMsg(0);// 更新进度条
            } while (true);
            sendMsg(1);// 通知下载完成
            os.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    return file;
}

下载完成后,根据文件保存路径,获取apk包名,通过包名判断该apk是否安装,是否正在运行

// 检测是否安装apk
public boolean isAppInstalled(Context context, String packageName) {
    final PackageManager packageManager = context.getPackageManager();
    List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
    List<String> pName = new ArrayList<String>();
    if (pinfo != null) {
        for (int i = 0; i < pinfo.size(); i++) {
            String pn = pinfo.get(i).packageName;
            pName.add(pn);
        }
    }
    return pName.contains(packageName);
}

// 获取下载的apk包名
private String getApkPackage(String apkpath) {
    String packageName = null;
    PackageManager pm = this.getPackageManager();
    PackageInfo info = pm.getPackageArchiveInfo(apkpath,
            PackageManager.GET_ACTIVITIES);
    ApplicationInfo appInfo = null;
    if (info != null) {
        appInfo = info.applicationInfo;
        packageName = appInfo.packageName;
        return packageName;
    }
    return packageName;
}

//判断指定包名的进程是否运行 
public static boolean isRunning(Context context,String packageName){
    ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> infos = am.getRunningAppProcesses();
    for(RunningAppProcessInfo rapi : infos){
        if(rapi.processName.equals(packageName))
            return true;
        }
    return false;
}

程序中需要开启网络权限,以及sd卡权限

你可能感兴趣的:(apk,android)