Appwidget desacoplou as intenções após o reinício do processo doméstico
-
19-09-2019 - |
Pergunta
Meu aplicativo Android Transdroid oferece vários widgets de tela inicial. Todo aplicativo appwidget possui 2 'botões' (ImageButton), um inicia o aplicativo e um inicia algumas atividades que atualizam o conteúdo do AppWidget. Bem simples. Aqui é uma captura de tela. O código do widget está no meu site do Google Code, mas o mais 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);
O problema é: o OnUpdate do widget não é chamado após a reinicialização o processo doméstico e, portanto, os intenções pendentes usadas para anexar a funcionalidade aos botões são perdidos.
É bastante fácil reproduzir.
- Inicie um emulador
- Adicione um widget (que usa um interior pendente para, digamos, iniciar uma atividade)
- Clique no botão para ver que realmente funciona
- Force Kill The Home Proces ('Adb -e Shell Kill 96', onde 96 é o pid de Android.process.acore)
- O botão do widget não funciona mais.
Mais preciso: não é reiniciado e, portanto, nenhum OnUpdate é chamado quando o processo doméstico Android.process.acore é reiniciado. Por sua vez, nenhuma intenção é anexada.
Alguém experimentou o mesmo problema e sabe como contornar esse problema?
Solução
Acabei de testar alguns dos meus próprios aplicativos, e seus eventos de cliques funcionam bem depois de matar a Bedeneira. Aqui está meu código relevante:
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));
A principal diferença que posso ver são as bandeiras relacionadas à intenção; Eu diria que eles definitivamente valem a pena tentar. [O layoutId
O parâmetro no meu código está definido mais; Esse mesmo código é usado para vários widgets com layouts diferentes].