Il widget non viene eliminato quando passa RESULT_CANCELED come risultato per l'attività di configuration

Ho dei problemi con i miei widget. Ecco la descrizione:

Context:

  • Come impostare lo background dell'applicazione android?
  • Accertare l'esistenza della function Google Streetview
  • Immagini non memorizzate localmente (utilizzando Universal Image Loader) - tempi di caricamento lento dell'image
  • Qual è il modo migliore per comunicare tra servizio e attività?
  • AdMob AdView e ViewPager?
  • Come cambiare il block di orientamento in android?
  • Ho un widget per la casa.

    Quando lo aggiungo, viene visualizzata un'attività di configuration per impostare alcuni parametri per il widget.

    Se chiamo setResult (RESULT_OK, resultValue); prima di terminare l'attività di configuration, il widget viene aggiunto alla Home.

    Se elimino il widget trascinandolo nel cestino, viene chiamato il public void onDeleted (context contestuale, int [] appWidgetIds) della mia class AppWidgetProvider. Fin qui tutto bene.

    Problema: se l'attività di configuration si esce dal codice di risultato RESULT_CANCELED ( setResult (RESULT_CANCELED); ), il public void onDeleted (context contestuale, int [] appWidgetIds) dalla class AppWidgetProvider non viene chiamato e il widget rimane nell'elenco dei widget attivi. Quando riavvii il telefono, viene chiamato onUpdate (Context, AppWidgetManager appWidgetManager, int [] appWidgetIds) dalla class AppWidgetProvider e in int [] appWidgetIds ho tutti i widget (gli id) che dovrebbero essere annullati (eliminati prima di essere aggiunti) + quelli attivi (quelli effettivamente visualizzati su Home). I widget che sono stati eliminati trascinandoli nel cestino non vengono visualizzati in questo elenco. Con il tempo questo elenco di ids dei widget diventa sempre più grande se l'utente sta cancellando dall'attività di configuration.

    Il riferimento di API dice qualcosa di simile: "Se ritorni RESULT_OK con Activity.setResult (), verrà aggiunto AppWidget e riceverai una trasmissione ACTION_APPWIDGET_UPDATE per questo AppWidget. Se ritorni RESULT_CANCELED, l'host annulla l'aggiunta e non visualizza questo AppWidget e riceverai una trasmissione ACTION_APPWIDGET_DELETED. "

    Qualcuno può dirmi alcuni suggerimenti su questo? Grazie.

    Ecco il mio manifesto:

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> <receiver android:name=".MytWidget" android:label="@string/app_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/my_widget_provider" /> </receiver> <activity android:name=".ConfigurationActivity"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> </intent-filter> </activity> </application> 

    Il resto del codice non è rilevante poiché è stato spiegato in precedenza (e non ho l'authorization a pubblicarlo).

  • Filtro passa-basso Android e filter passa alto
  • Come fare applicazioni Beautiful & Stylish come Timely
  • Scorrimento liscio con inerzia e resistenza al bordo / snapback
  • Applicare ColorFilter a ImageView con ShapedDrawable
  • Android: Aggiunta di intestazione statica alla parte superiore di una list attività
  • Android: HttpsUrlConnection con autenticatore per l'authentication di base iterates per sempre quando la password è errata (sulla risposta 401)
  • 4 Solutions collect form web for “Il widget non viene eliminato quando passa RESULT_CANCELED come risultato per l'attività di configuration”

    Ho avuto questo stesso problema, ho fatto questo sull'evento OnPause

     public void removeWidget(int appWidgetId) { AppWidgetHost host = new AppWidgetHost(Config.this, 1); host.deleteAppWidgetId(appWidgetId); } 

    Controllato l'id widget, il widget viene rimosso. L'id host non è importnte se si dispone solo di un host di widget app.

     private boolean canceled = true; @Override protected void onPause() { if(canceled) { removeWidget(appWidgetId); } super.onPause(); } 

    Nel clic OK, imposta il falso canceled

    Sei sicuro che il tuo codice non sia rilevante? Tutto nel tuo manifesto è fuori dal libro e sembra buono. Il codice dovrebbe apparire molto simile a questo:

      public void configCancelOnClick(View v) { MyLog.d(TAG, "configCancelOnClick"); Intent intent = new Intent(); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult(RESULT_CANCELED, intent); finish(); } 

    Il putExtra è obbligato a indicare quale widget non si crea … La finitura è necessaria per arrestare correttamente. Se non lo si dispone, non si ottiene l'intento passato correttamente al sistema operativo e perde il setResult.

    Infine, quando la configuration non esce correttamente (tasto di return, chiave di casa o codice difettoso), viene creato un widget fantasma. Anche con il codice perfetto, se l'utente colpisce la chiave di casa durante la configuration, avrai un widget in coda al sistema che in realtà non esiste in nessuna schermata iniziale. Ecco perché li chiamo fantasmi. Una volta che un widget ha completato la configuration, verrà richiamato onDeleted quando viene rimosso dalla schermata iniziale. Ti viene lasciato il problema che, se i fantasmi sono stati creati, onDisabled non sarà mai, mai, eseguito.

    Un ultimo controllo. Dal momento che la configuration viene eseguita, nel file info xml è presente quanto segue. Ma nel caso in cui, sembra questo:

      android:configure=your.package.name.ConfigurationActivity" 

    Ho risolto questo problema come questo,

    nel metodo onUpdate () del provider di widget controlla se il widget è stato configurato e se non fosse io non faccio niente, quindi nessun widget fantasma. Alla fine della configuration ho semplicemente impostato su vero e devo andare bene. Basta non dimenticare di rimuoverlo dalla condivisione preferenziale quando il widget viene eliminato.

     @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); for(final int appWidgetId : appWidgetIds) { final StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(appWidgetId); stringBuilder.append("_conf"); if(context.getSharedPreferences("settings",0).getBoolean(stringBuilder.toString(),false)) updateAppWidget(context,appWidgetId,appWidgetManager); } } 

    Sembra che ci siano molti problemi con i widget da secoli. Detto questo, mentre cercavo una soluzione a uno di loro, mi sono imbattuto in questo post: https://code.google.com/p/android/issues/detail?id=2539#c15

    In sostanza, l'idea è di rimuovere l'attività di configuration dell'applicazione dal manifesto e di verificare durante OnUpdate se il widget è stato configurato, se non aprire l'attività di configuration.

    È completamente trasparente per l'utente e viene detto di risolvere il problema di "add / zombie widget". Proverò ora.


    Tuttavia non risolve il problema con i widget rimossi che vengono aggiornati al riavvio, anche se sembra essere stato risolto nelle versioni Android recenti (4.4+ non è sicuro quale?).

    Nelle versioni precedenti di Android, ho osservato che tutti i widget che ho rimosso manualmente dal lanciatore si trasformano in zombi al riavvio, il sistema operativo che effettivamente chiama OnUpdate per ognuno di questi widget, quindi ho dovuto tenere un elenco di widget eliminato.

    Ora i ID widget eliminati vengono effettivamente riutilizzati per i nuovi widget, quindi dovrei smettere di monitorare i widget eliminati. Purtroppo non ho alcun indizio quando (quale versione Android) questo problema è stato risolto e gli ID hanno iniziato a ricrearsi.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.