6

Ho lavorato con questo problema per tre giorni e ho esaminato ogni singola domanda qui per una risposta. Ho un widget con un pulsante e tutto quello che vorrei fosse è avviare un servizio ogni volta che si fa clic. Il problema è che il pulsante smette di funzionare in modo casuale. Non riesco a ricrearlo affatto e non ho idea di cosa lo causi. Il mio servizio chiama stopSelf(); ma ho avuto questo problema con un ricevitore broadcast, quindi credo che il problema sia nel widget e non nel servizio. Ecco il codiceWidget Android smette di funzionare in modo casuale

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[]  appWidgetIds) 
{ 

Log.i("Widget", "onUpdate"); 

final int N = appWidgetIds.length; 

    for (int i=0; i<N; i++) 
    { 

     int appWidgetId = appWidgetIds[i]; 

     Log.i("Widget", "onUpdateLoop"); 


     Intent intent = new Intent(context, ServiceWidgetAction.class); 
     intent.setAction(Long.toString(System.currentTimeMillis())); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     PendingIntent pendingIntent = PendingIntent 
       .getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.widget); 

     views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent); 

     views.setTextViewText(
       R.id.widgetTextView, 
       "Some text"); 

     appWidgetManager.updateAppWidget(appWidgetId, views); 

    } 

} 

Ho controllato questo codice più e più volte e non ho idea del perché lo stia facendo. Lo fa su 3 telefoni separati e non riesco a ricrearlo. Ho provato a forzare l'arresto dell'app, cancellandolo da un task manager aggiungendo nuovi widget ecc. Per far smettere di funzionare il widget e non lo farà. Tuttavia quando mi sono svegliato questa mattina il widget non funziona più. Qualsiasi aiuto sarebbe molto apprezzato.

+0

Si vede qualcosa nel LogCat quando succede? – CaseyB

+0

Nulla nel logcat, è come avere un pulsante senza metodo onClick in un'attività. Vedo che è premuto ma non succede nulla nell'app o nel logcat. –

risposta

10

ho finito per capire il problema. Stavo aggiornando il widget da altri posti nell'app e non avevo il codice completo per ognuno. In altre parole, la mia app aggiornato i textviews nel widget come questo

RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.widget); 

    views.setTextViewText(
      R.id.widgetTextView, 
      "Some text"); 

    appWidgetManager.updateAppWidget(appWidgetId, views); 

Ma aveva bisogno l'intero codice per mantenere il pulsante registrati in questo modo:

Intent intent = new Intent(context, ServiceWidgetAction.class); 
    intent.setAction(Long.toString(System.currentTimeMillis())); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    PendingIntent pendingIntent = PendingIntent 
      .getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.widget); 

    views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent); 

    views.setTextViewText(
      R.id.widgetTextView, 
      "Some text"); 

    appWidgetManager.updateAppWidget(appWidgetId, views); 

linea Quindi fondo è ogni volta che si aggiorna un widget dalla tua app, assicurati che assomigli esattamente al codice nel widget stesso. Non lasciare nulla.

+0

Grazie. Nel mio caso, il singolo metodo che ha sempre aggiornato il widget potrebbe generare eccezioni in alcuni casi e parte del codice non verrebbe eseguita. – Alireza

+0

questo è oro, aspetta no - il suo bitcoin vale la pena - 10x mate – gor

0

Hai installato il widget nella scheda SD?

Google consiglia di installare tutti i tipi di app widget, allarmi e ricevitori nella memoria interna, a causa di problemi di sincronizzazione del sistema come questo.

Forse non è la soluzione, ma un "must check";)

android:installLocation="internalOnly" 
+0

Non ci ho pensato perché ho abilitato l'app a SD, ma l'ho appena controllato e l'app è stata installata nella memoria interna. Grazie per l'input però! –

Problemi correlati