AsyncTask убит Android - PullRequest
       2

AsyncTask убит Android

0 голосов
/ 06 января 2019

У меня есть класс 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) }

1 Ответ

0 голосов
/ 06 января 2019

Вещательные приемники не предназначены для длительной фоновой работы, и система будет стремиться убить их вскоре после возврата из функции onReceive(). Руководства для разработчиков Android содержат документацию об этом поведении.

Вероятно, для этого лучше использовать службу переднего плана, особенно если у вас уже есть уведомление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...