Disaccoppiato AppWidget Intenti dopo il riavvio processo casa
-
19-09-2019 - |
Domanda
Il mio Android Transdroid offre diversi widget della schermata iniziale. Ogni AppWidget ha 2 'pulsanti' (ImageButton), si inizia l'applicazione e si inizia a qualche attività che rinfresca il contenuto AppWidget. Abbastanza semplice. Qui è uno screenshot. Il codice del widget è al mio sito web Google Code, ma la cosa più importante:
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_15);
views.setOnClickPendingIntent(R.id.widget_action, PendingIntent.getActivity(context, 0, new Intent(context, Transdroid.class), 0));
appWidgetManager.updateAppWidget(id, views);
Il problema è: il widget di onUpdate non è chiamato dopo il processo iniziale viene riavviato, e quindi alle PendingIntents utilizzati per fissare la funzionalità ai pulsanti si perde
.E 'abbastanza facile da riprodurre.
- Avvia un emulatore
- Aggiungi un widget (che utilizza un PendingIntent, per esempio, avviare un'attività)
- Fare clic sul pulsante per vedere effettivamente funziona
- Forza uccidere i proces casa ( 'shell -e adb uccidere 96', dove 96 è il PID del android.process.acore)
- Il pulsante del widget non funziona più.
Più preciso: nessuna OnReceive e quindi non onUpdate viene chiamato quando il processo iniziale android.process.acore viene riavviato. A sua volta, alcun intento è collegato.
Chiunque ha sperimentato lo stesso problema e sa come aggirare questo problema?
Soluzione
Ho appena provato un paio di miei appwidgets, ed i loro eventi click funzionano bene dopo aver ucciso ACORE. Ecco il mio codice rilevante:
final RemoteViews views = new RemoteViews(context.getPackageName(), layoutId);
views.setOnClickPendingIntent(R.id.widget_view, PendingIntent.getActivity(
context,
0,
new Intent(context, MyActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK),
PendingIntent.FLAG_UPDATE_CURRENT));
La differenza principale che posso vedere è le bandiere intenti legati; Direi che sono sicuramente la pena di provare. [Il parametro layoutId
nel mio codice è impostato aspettar; questo stesso codice viene utilizzato per diversi widget con diversi layout].