AsyncTask被Android杀死

时间:2019-01-05 21:03:20

标签: android kotlin

我有AsyncTask类,可以下载APK并安装它。 在更新过程中,没有带有进度条的通知,指示进度状态。 另外,我有一个广播接收器,接收BOOT_COMPLETE事件。接收方调用AsyncTask。 问题是,进度被扼杀了。显示通知,但是进度条卡住了。 请注意,当我从活动调用AsyncTask时,它运行良好。在某些设备中,它只能从回收器中杀死。 请帮忙!谢谢。

override fun doInBackground(vararg arg0: String): Boolean {

    try {
        val url = URL(Globals.NEW_APK_URL)
        val c = url.openConnection() as HttpURLConnection
        var work = 0
        c.setRequestMethod("GET")
        c.setDoOutput(true)
        c.connect()
        length = c.getHeaderFields().get("content-Length")?.get(0)?.toInt() ?: 0

        val PATH = "/mnt/sdcard/Download/"
        val file = File(PATH)
        file.mkdirs()
        val outputFile = File(file, "update.apk")
        if (outputFile.exists()) {
            outputFile.delete()
        }
        val fos = FileOutputStream(outputFile)

        val `is` = c.getInputStream()

        val buffer = ByteArray(1024)
        var len1 = `is`.read(buffer)
        while (len1 != -1) {
            fos.write(buffer, 0, len1)
            len1 = `is`.read(buffer)
            work += len1
            publishProgress(work)
        }
        fos.close()
        `is`.close()

        val command  = "pm install -r /mnt/sdcard/Download/update.apk"
        val proc = Runtime.getRuntime().exec(arrayOf("su", "-c", command))
        proc.waitFor()
        return true


    } catch (e: Exception) {
        Log.e("UpdateAPP", "Update error! " + e.message)
    }

    return false
}

override fun onPostExecute(result: Boolean) {
    super.onPostExecute(result)
    if (result == true) {
        Toast.makeText(context, "לוח ניסן עודכן בהצלחה", Toast.LENGTH_SHORT).show()
        context.startActivity(Intent(context.getPackageManager().getLaunchIntentForPackage(Globals.PACKAGE_NAME)))
    } else {
        Toast.makeText(context, "העדכון נכשל", Toast.LENGTH_SHORT).show()
    }
    val notificationManager = context.getSystemService(NOTIFICATION_SERVICE) as NotificationManager?
    notificationManager!!.cancelAll()
}

override fun onProgressUpdate(vararg values: Int?) {
    //Update progress bar
    super.onProgressUpdate(*values)
    runner?.run(values[0] as Any, length)

}

1 个答案:

答案 0 :(得分:0)

广播接收器不适用于长时间运行的后台工作,并且在onReceive()函数返回后不久,系统往往会杀死它们。 Android开发人员指南对此行为有一些documentation

为此最好使用前台服务,特别是因为无论如何您都已经有了通知。