我有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)
}
答案 0 :(得分:0)
广播接收器不适用于长时间运行的后台工作,并且在onReceive()
函数返回后不久,系统往往会杀死它们。 Android开发人员指南对此行为有一些documentation。
为此最好使用前台服务,特别是因为无论如何您都已经有了通知。