8

Ho scritto un'app launcher per Android con Apache cordova. È per un'applicazione simile a un chiosco e in fondo sta funzionando bene.Android sta uccidendo forza il mio launcher su BT connect

Sfortunatamente c'è un problema: In determinate circostanze Android sta forzando la mia app e immediatamente riavviandola. - Ci vogliono circa 3 secondi per caricare, dove mostra uno schermo bianco. Inizia completamente nuovo (onPause, onResume non viene chiamato). Nel registro trovo:

V/WindowManager( 657): Changing focus from Window{42544288 u0 com.android.settings/com.android.settings.SubSettings} to Window{428ad610 u0 com.android.settings/com.android.settings.SubSettings} Callers=com.android.server.wm.WindowManagerService.addWindow:2665 com.android.server.wm.Session.addToDisplay:163 android.view.IWindowSession$Stub.onTransact:111 com.android.server.wm.Session.onTransact:126 
I/WindowManager( 657): Gaining focus: Window{428ad610 u0 com.android.settings/com.android.settings.SubSettings} 
... 
I/ActivityManager( 657): Force stopping com.myapp.name appid=10119 user=0: clear data 
I/ActivityManager( 657): Killing 2639:com.myapp.name/u0a119 (adj 7): stop com.myapp.name 
I/ActivityManager( 657): Force finishing activity ActivityRecord{42542218 u0 com.myapp.name/.MainActivity t2} 
V/ActivityManager( 657): Broadcast: Intent { act=android.intent.action.PACKAGE_RESTARTED dat=package:com.myapp.name flg=0x10 (has extras) } ordered=false userid=0 callerApp=null 
V/ActivityManager( 657): Broadcast: Intent { act=android.intent.action.PACKAGE_DATA_CLEARED dat=package:com.myapp.name flg=0x10 (has extras) } ordered=false userid=0 callerApp=null 
I/NotificationService( 657): queryReplace=false 
I/ActivityManager( 657): Start proc com.android.documentsui for broadcast com.android.documentsui/.PackageReceiver: pid=2740 uid=10036 gids={50036} 
V/WindowManager( 657): Changing focus from Window{428ad610 u0 com.android.settings/com.android.settings.SubSettings EXITING} to Window{42544288 u0 com.android.settings/com.android.settings.SubSettings} Callers=com.android.server.wm.WindowManagerService.removeWindowLocked:2770 com.android.server.wm.WindowManagerService.removeWindow:2709 com.android.server.wm.Session.remove:182 android.view.IWindowSession$Stub.onTransact:197 
... 
I/WindowManager( 657): Gaining focus: Window{42544288 u0 com.android.settings/com.android.settings.SubSettings} 
I/WindowManager( 657): Losing focus: Window{428ad610 u0 com.android.settings/com.android.settings.SubSettings EXITING} 
D/DisplayManagerService( 657): Display listener for pid 2639 died. 
D/WifiService( 657): Client connection lost with reason: 4 
I/WindowState( 657): WIN DEATH: Window{424b0f20 u0 com.myapp.name/com.myapp.name.MainActivity} 
W/WindowManager( 657): Force-removing child win Window{424c4168 u0 SurfaceView} from container Window{424b0f20 u0 com.myapp.name/com.myapp.name.MainActivity} 
W/WindowManager( 657): Failed looking up window 
W/WindowManager( 657): java.lang.IllegalArgumentException: Requested window [email protected] does not exist 
W/WindowManager( 657): at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:8571) 
W/WindowManager( 657): at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:8562) 
W/WindowManager( 657): at com.android.server.wm.WindowState$DeathRecipient.binderDied(WindowState.java:1060) 
W/WindowManager( 657): at android.os.BinderProxy.sendDeathNotice(Binder.java:496) 
W/WindowManager( 657): at dalvik.system.NativeStart.run(Native Method) 
I/WindowState( 657): WIN DEATH: null 
V/InputMethodManagerService( 657): windowGainedFocus: [email protected] controlFlags=#0 softInputMode=#10 windowFlags=#1810100 
W/InputMethodManagerService( 657): Window already focused, ignoring focus gain of: [email protected] attribute=null, token = [email protected] 
... 
V/SettingsProvider( 657): call(system:anr_debugging_mechanism) for 0 
W/ContextImpl(2336): Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1219 android.content.ContextWrapper.sendBroadcast:365 com.android.settings.applications.InstalledAppDetails.processClearMsg:1133 com.android.settings.applications.InstalledAppDetails.access$000:105 com.android.settings.applications.InstalledAppDetails$1.handleMessage:223 

Le circostanze quando succede:

  • Succede dopo diverse ore di uptime
  • Succede ogni volta si collega un telecomando Bluetooth. (È già abbinato). Dopo alcuni minuti di inattività, il telecomando si disconnette per risparmiare energia. Non appena lo ricolleghi (premendo un pulsante), l'app si arresta e si riavvia.

Quello che ho provato finora senza fortuna:

  • installare l'applicazione come applicazione "normale" (non un lanciatore)
  • Disinstallare tutti i plugin Cordova

Dispositivi, dove si verifica l'errore:

  • Android 4.4.2 tablet ("no-name" del prodotto) - L'errore è presente
  • Android 5.1 tablet ("nome-no" del prodotto) - L'errore è presente
  • Android 5.1.1 del telefono (Samsung xCover) - Nessun problema !!
  • Telefono Android 4.4.2 (Samsung GALAXY S III Neo) - Nessun problema !!

Quindi perché l'Android sui tablet uccide la mia app? È perché hanno hardware a basso costo, o perché le versioni di Android sono più vecchie? Come posso prevenire questo bug?

UPDATE

ho scoperto, che il problema non è programmazione-correlato, perché questo problema si verifica su tutte le app . Ecco perché ho pubblicato un'altra domanda su Android-Enthusiasts

+0

Anche se non im un esperto di Android, guardando il registro mi sento la chiave si trova nelle seguenti righe: "java.lang.IllegalArgumentException: finestra richiesta [email protected] non esiste "Questo errore si verifica in genere quando si tenta di richiamare un'API di sistema che non è disponibile sul dispositivo di destinazione. Ecco perché, come hai detto, questo problema dipende dal dispositivo. fa sì che l'applicazione si riavvii come hai detto tu. Tutto quello che devi capire è "che cos'è quella chiamata API che blocca la tua app." Spero che abbia senso – Gandhi

+0

@IngoAlbers \t Anche se non sono un esperto di Android, guardando il registro Sento che la chiave sta nelle seguenti righe: "java.lang.IllegalArgumentException: finestra richiesta [email protected] non esiste" Questo errore si verifica in genere quando si tenta di richiamare un'API di sistema che non è disponibile sul dispositivo di destinazione Ecco perché, come hai detto, questo problema dipende dal dispositivo. Inoltre, questo problema fa sì che l'applicazione si riavvii come hai detto. Tutto ciò che devi capire è "che cos'è quella chiamata API? che blocca la tua app ". Spero che abbia senso. – Gandhi

+0

Grazie per il tuo commento. Il problema è che non invoco alcuna chiamata API di sistema. Il sistema lo fa da solo. Forse posso cambiarlo in qualche file di configurazione del sistema? (root è disponibile), ma non so dove guardare e cosa cambiare. –

risposta

1

Il problema è stato causato da modifiche alla configurazione del sistema in runtime. Per impostazione predefinita le attività non gestiranno quelle, ma si riavvieranno.

Vedi https://developer.android.com/guide/topics/resources/runtime-changes.html

Cordova aggiunge gestori per orientation, keyboardHidden, keyboard, screenSize e locale per impostazione predefinita.

Al fine di risolvere il nostro problema che abbiamo solo bisogno di aggiungere per gestire il cambiamento di configurazione per navigation alla nostra attività in questo modo:

<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|navigation"> 
0

Nei dispositivi che si bloccano, per qualche motivo hai l'opzione sviluppatore: non mantenere le attività contrassegnate.

Utilizzate i plug-in Cordova che modificano le attività?

Assomiglia per qualche motivo un'attività viene distrutta, qui si possono trovare alcune informazioni:

https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html#when-can-this-happen

+0

Grazie! "Non mantenere attività" non è impostato. Inoltre ho rimosso tutti i plug-in Cordova e l'ho provato con una nuova e nuova app Cordova. L'errore è presente anche lì. –

0

Questo il vero con tutte le applicazioni. Qualsiasi app passata allo sfondo o che non viene utilizzata da un po 'di tempo, il motore virtuale lo imposta su priorità più bassa e quando ha bisogno di memoria o di qualsiasi altra risorsa, uccide l'app.

Non puoi evitarlo. Che cosa si può fare è riavviare nello stesso luogo in cui è stato ucciso con onSaveInsanceState() e onRestoreInstanceState():

onSaveInstanceState() and onRestoreInstanceState()

L'altra opzione è quella di avere un servizio collegato alla vostra applicazione. In questo modo la vostra applicazione non viene ucciso:

How can we prevent a Service from being killed by OS?

+0

Questa potrebbe essere una soluzione genrica. Ma non penso che affronta il problema specifico con cui l'utente è bloccato. – Gandhi

0

Anche se non im un esperto di Android, guardando il registro mi sento la chiave sta nelle seguenti linee:

"java. lang.IllegalArgumentException: finestra richiesto [email protected] non esiste"

Questo errore si verifica in genere quando si tenta di richiamare un API di sistema che non è disponibile sul dispositivo di destinazione. Ecco perché, come hai detto, questo problema dipende dal dispositivo. Anche questo problema causa il riavvio dell'applicazione come hai detto. Tutto quello che devi capire è "che cos'è quella chiamata API che blocca la tua app"

Un'altra cosa interessante che ho notato nel tuo post è che questo arresto si verifica solo nel prodotto no-name. Quindi credo che il no-name potrebbe solo causare il problema come durante l'associazione bluetooth, internamente BluetoothDevice.getName() potrebbe restituire null risultante nell'arresto. Sono fermamente convinto che questo stia causando il problema e suggerisco di dare un'occhiata a questo link per un po 'di aiuto.

0

Non è un tablet o un problema mobile. Ho il sospetto che l'opzione Attività non mantenere (Opzioni sviluppatore) sia abilitata nel tuo tablet. Si prega di controllare quello

Android 4.4.2 tablet ("no-name" del prodotto) - L'errore è presente

Android 5.1 tablet ("nome-no" del prodotto) - L'errore è presente

+0

Grazie! Purtroppo questo non è il caso - l'opzione non è impostata. –

+0

ok michael, spero che tu abbia trovato una soluzione da altre risposte – AndroidEnthusiastic