You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android平板开机静默更新应用并启动的实现方法咨询

Android平板开机自动检测更新并安装方案

一、核心流程

  • 开机自启动触发后,先请求manifest文件获取最新版本信息
  • 对比本地应用版本与最新版本,判断是否需要更新
  • 若需更新,从指定静态URL下载APK
  • 触发APK安装流程完成更新

二、具体实现步骤

1. 版本对比逻辑

先获取本地应用版本号,再拉取并解析manifest(建议用JSON格式,解析更简便):

// 获取本地应用版本号
val packageInfo = packageManager.getPackageInfo(packageName, 0)
val currentVersionCode = packageInfo.versionCode

// 拉取manifest并解析(示例用OkHttp)
val client = OkHttpClient()
val request = Request.Builder().url(manifestUrl).build()
client.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) {
        // 网络失败处理:记录日志、后续重试
    }

    override fun onResponse(call: Call, response: Response) {
        response.body?.string()?.let { content ->
            // 自定义解析方法,从JSON中提取最新版本号
            val latestVersionCode = parseManifestVersion(content)
            if (latestVersionCode > currentVersionCode) {
                downloadApk(apkStaticUrl)
            }
        }
    }
})

2. APK下载实现

用系统DownloadManager处理下载,自动管理进度与通知,避免自己处理线程:

private fun downloadApk(apkUrl: String) {
    val downloadManager = getSystemService(DOWNLOAD_SERVICE) as DownloadManager
    val request = DownloadManager.Request(Uri.parse(apkUrl))
        .setTitle("应用更新")
        .setDescription("正在下载最新版本")
        // 存储到应用私有目录,无需额外存储权限
        .setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, "update.apk")
        .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
    
    val downloadId = downloadManager.enqueue(request)
    
    // 监听下载完成
    val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val id = intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
            if (id == downloadId) {
                val apkPath = "${getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)}/update.apk"
                installApk(apkPath)
                unregisterReceiver(this)
            }
        }
    }
    registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
}

3. APK安装流程

注意Android 8.0+需要申请「安装未知应用」权限,同时用FileProvider适配高版本文件访问:

private fun installApk(apkPath: String) {
    val file = File(apkPath)
    val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        FileProvider.getUriForFile(this, "${packageName}.fileprovider", file)
    } else {
        Uri.fromFile(file)
    }

    val installIntent = Intent(Intent.ACTION_VIEW)
        .setDataAndType(uri, "application/vnd.android.package-archive")
        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    
    // Android 8.0+检查安装权限
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        if (!packageManager.canRequestPackageInstalls()) {
            startActivity(Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:$packageName")))
            return
        }
    }
    
    startActivity(installIntent)
}

三、关键配置与注意事项

  • 权限配置:在AndroidManifest.xml中添加必要权限与FileProvider:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
    
    其中res/xml/file_paths.xml配置文件路径:
    <paths>
        <external-files-path name="downloads" path="Download/" />
    </paths>
    
  • manifest文件设计:建议JSON格式统一管理版本信息,示例:
    {
        "latestVersionCode": 10,
        "latestVersionName": "1.1.0",
        "updateDesc": "修复已知问题,优化运行流畅度"
    }
    
  • 开机自启动优化:开机后延迟3-5秒再发起更新请求,避免设备启动初期资源不足导致请求失败
  • 异常处理:对网络请求失败、下载中断、安装失败等场景做好日志记录,方便批量设备的问题排查

内容的提问来源于stack exchange,提问作者user3015221

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:33:39