Question

Quelqu'un peut-il me dire comment vérifier que mon widget de ont été placés sur l'écran d'accueil?

J'ai un code dans mon application qui devrait fonctionner que si le widget est placé sur l'écran d'accueil.

Était-ce utile?

La solution

Vous devez stocker cette information vous-même. J'utilise généralement les préférences de l'application, mais vous pouvez utiliser quoi que ce soit. widgets en général des services d'utilisation pour communiquer, de sorte que votre code qui fait des choses est probablement dans un service, mais en utilisant la préférence permet à toute partie de votre application pour y accéder.

Dans votre classe de widget qui étend AppWidgetProvider la onEnabled est appelée lorsque le widget est mis sur un écran d'accueil et le onDeleted est (généralement) appelé quand il est retiré. onDisabled est appelée lorsque sont supprimées toutes les copies.

Ainsi, dans le code de votre fournisseur widget:

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    setWidgetActive(true);
    context.startService(new Intent(appContext, WidgetUpdateService.class));
}

@Override
public void onDisabled(Context context) {
    Context appContext = context.getApplicationContext();
    setWidgetActive(false);
    context.stopService(new Intent(appContext, WidgetUpdateService.class));
    super.onDisabled(context);
}

private void setWidgetActive(boolean active){
    Context appContext = context.getApplicationContext();
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
    SharedPreferences.Editor edit = prefs.edit();
    edit.putBoolean(Constants.WIDGET_ACTIVE, active);
    edit.commit();
}

Ailleurs dans le code, vous vérifierait si le widget est actif par:

public boolean isWidgetActive(Context context){
    Context appContext = context.getApplicationContext();
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    return prefs.getBoolean(Constants.WIDGET_ACTIVE, false);
}

Autres conseils

Il suffit de dire, mais ...

    int ids[] = AppWidgetManager.getInstance(this).getAppWidgetIds(new ComponentName(this,MyAppWidgetProvider.class));

    Toast.makeText(this, "Number of widgets: "+ids.length, Toast.LENGTH_LONG).show();

Je sais qu'il est une vieille question, mais regarde aujourd'hui, j'ai vu qu'il ya quelques problèmes avec la réponse acceptée de @ larsona1:

  1. si l'utilisateur effacé les préférences partagées -. Il y a un widget encore, mais l'application ne saura pas à son sujet
  2. si le regret de l'utilisateur entre « ajouter un widget » et avant d'appuyer sur « ok » - onEnabled sera appelée de toute façon, et un widget sera enregistré dans l'écran d'accueil, même si il n'y a pas un widget, et aucun moyen de le retirer plus tard. (Il peut être un bug dans le lanceur à domicile ADT).

J'ai trouvé une solution au premier problème. Pas de préférences partagées sont nécessaires à tous, car il est de toute façon peu fiable. Il doit être vérifié dans l'exécution.

// in some class you define a static variable, say in S.java
static boolean sWidgetMayExist = true;

Dans votre fournisseur widget:

// MyAppWidgetProvider.java
// to respond to runtime changes, when widgets are added and removed
@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    S.sWidgetMayExist = true;
}

@Override
public void onDisabled(Context context) {
    super.onDisabled(context);
    S.sWidgetMayExist = true;
}

Et, dans votre code de service ajouter ceci:

AppWidgetManager manager = null;
RemoteViews views = null;
ComponentName widgetComponent = null;

    // ..and in your update thread

    if (!S.sWidgetMayExist) { return; }

if (manager == null || widgetComponent == null) {
    widgetComponent = new ComponentName(c,
            MyAppWidgetProvider.class);
    manager = AppWidgetManager.getInstance(c);
}

if (manager.getAppWidgetIds(widgetComponent) == null) {
    S.sWidgetMayExist = false;
}

@Waza_Be est juste en regardant la liste « AppWidgetIds » pour connaître le nombre de widgets actifs (ceux installés sur votre écran d'accueil) est la bonne façon de connaître ces informations.

Cependant, gardez à l'esprit que vous devez ne pas regarder par vous-même.

Consultez la documentation Android officielle pour les meilleures pratiques sur les widgets: https://developer.android.com/guide/topics/appwidgets/index .html # AppWidgetProvider

La bonne approche consiste à remplacer seulement la méthode onUpdate () et parcourir la liste des widgets « actifs »:

public class ExampleAppWidgetProvider extends AppWidgetProvider {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context, ExampleActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

Et comme votre propre fournisseur widget de AppWidgetProvider, vous ne rentrerai pas dans la méthode onUpdate () si vous avez pas des widgets actifs sur l'écran d'accueil!

Voir le code OnReceive () d'Android AppWidgetProvider qui vérifie déjà pour vous que "appWidgetIds.length> 0":

public void onReceive(Context context, Intent intent) {
    // Protect against rogue update broadcasts (not really a security issue,
    // just filter bad broacasts out so subclasses are less likely to crash).
    String action = intent.getAction();
    if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
            if (appWidgetIds != null && appWidgetIds.length > 0) {
                this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
            }
        }
    }

(...)
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top