У меня есть класс AsyncTask, который загружает APK и устанавливает его.
Во время обновления появляется уведомление с индикатором выполнения, который указывает состояние выполнения.
Кроме того, у меня есть широковещательный приемник, который получает событие BOOT_COMPLETE. Получатель вызывает AsyncTask.
Проблема в том, что прогресс убит. Уведомление отображается, но индикатор выполнения застрял.
Обратите внимание, что когда я вызываю AsyncTask из активности, он работает хорошо. Он убит только от ресивера, в некоторых устройствах.
Пожалуйста помоги! Благодарю.
</p>
<pre>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)
}