2011-01-22 1 views
0

J'essaie de créer un widget d'application qui, lorsqu'il est activé, déclenche un travail d'arrière-plan qui enregistre le temps + l'emplacement dans une base de données. De ce que j'ai pu rassembler jusqu'ici, l'installation que je veux probablement se compose d'une sous-classe AppWidgetProvider dont onUpdate() est responsable de la mise en place d'un PendingIntent sur un RemoteView représentant le bouton du widget. Sa méthode onReceive() capturerait l'émission de PendingIntent, et je commencerais peut-être un service d'ici pour effectuer le travail d'arrière-plan. Si je suis sur la bonne voie jusqu'à présent, j'ai un défi, à savoir que onUpdate() ne se déclenche pas en ajoutant le widget app sur le bureau, et donc le bouton du widget n'est pas configuré correctement (ça finit par ne rien dire). Dois-je définir le widget avec une configurationactivity, qui à son tour déclenche AppWidgetProvider.onUpdate(), ou y a-t-il une solution plus simple à cela?Configuration du bouton du widget pour exécuter le travail d'arrière-plan

Si je ne suis pas du tout sur la bonne voie, tout pointeur vers un meilleur moyen d'atteindre ce que j'essaie d'atteindre serait très apprécié. :)

Mise à jour:

pensé que je pourrais poster une partie du code ici. Voici la définition du récepteur du manifeste:

<receiver android:name=".widget.QuickAddWidgetProvider" > 
    <intent-filter> 
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 
    <meta-data android:name="android.appwidget.provider" 
      android:resource="@xml/quickadd_widget_info" /> 
</receiver> 

Ceci est mon fichier de ressources, en définissant le widget:

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="72dp" 
    android:minHeight="72dp" 
    android:initialLayout="@layout/quickadd_widget" 
    android:updatePeriodMillis="0"> 
</appwidget-provider> 

Ceci est QuickAddWidgetProvider:

public class QuickAddWidgetProvider extends AppWidgetProvider { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.v("QuickAdd", "onReceive()"); 
    } 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     Log.v("QuickAdd", "onUpdate()"); 
    } 
} 

Répondre

1

Si je suis sur la bonne voie jusqu'à présent

Oui!

J'ai un défi, qui est que onUpdate() ne se déclenche pas sur l'ajout du widget application sur le bureau, et donc le bouton widget ne se mettre en place correctement (il finit par doind rien)

Eh bien, il devrait. Assurez-vous que l'entrée de » vos AppWidgetProvider dans le manifeste a le droit de recevoir des mises à jour <intent-filter>:

<receiver android:name=".AppWidget" android:label="@string/app_name" android:icon="@drawable/icon"> 
     <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
     </intent-filter> 
     <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider"/> 
</receiver> 
+0

Merci pour la réponse. Je ne vois rien de mal avec mon filtre d'intention. J'ai mis à jour ma question avec le code en question, peut-être une autre paire d'yeux sera capable de repérer l'erreur. Pour l'enregistrement, je peux voir à partir des journaux que onReceive() est déclenché. Je pensais que cela pouvait être lié au fait que updatePeriodMillis est mis à 0, mais changer cela ne donne pas non plus un appel à onUpdate(). – rogerkk

+0

Oh, btw .. si le filtre d'intention n'est pas configuré correctement, je ne pense pas que je serais capable d'accéder au widget via le menu du widget. – rogerkk

+0

@rogerkk: Eh bien, 'onUpdate()' ne sera jamais appelé avec votre implémentation actuelle, car vous le bloquez en n'enchaînant pas la superclasse dans 'onRecieve()'. De plus, AFAIK, le menu du widget est piloté par les métadonnées, pas par le filtre d'intention. – CommonsWare

Questions connexes