Frage

Kann mir jemand sagen, wie ich überprüfen kann, ob mein Widget auf den Homescreen gelegt wurde?

Ich habe einen Code in meiner App, der nur ausgeführt wird, wenn das Widget auf den Homescreen platziert wird.

War es hilfreich?

Lösung

Sie müssen diese Informationen selbst speichern. Normalerweise verwende ich die Anwendungseinstellungen, aber Sie könnten alles verwenden. Im Allgemeinen verwenden Widgets Dienste, um zu kommunizieren, sodass Ihr Code, das Dinge macht, wahrscheinlich in einem Dienst ist. Wenn Sie die Präferenz verwenden, können Sie jedoch jeden Teil Ihrer App darauf zugreifen.

In Ihrer Widget -Klasse, die AppWidgetProvider erweitert, wird der OneNabled aufgerufen, wenn das Widget auf einen Homescreen gestellt wird und das ONDELTED (normalerweise) aufgerufen wird, wenn es entfernt wird. Ondisabled wird aufgerufen, wenn alle Kopien entfernt werden.

Also im Code Ihres Widget -Anbieters:

@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();
}

An anderer Stelle im Code prüfen Sie, ob das Widget aktiv ist durch:

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

Andere Tipps

Nur sagen, aber ...

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

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

Ich weiß, dass es eine alte Frage ist, aber ich habe mir das heute gesehen, dass es ein paar Probleme mit der akzeptierten Antwort von @larsona1 gibt:

  1. Wenn der Benutzer die gemeinsam genutzten Einstellungen gelöscht hat - es gibt immer noch Widget, aber die App weiß nicht davon.
  2. Wenn der Benutzer zwischen "Widget hinzufügen" und vor dem Drücken von "OK" - OneAnabled aufgerufen wird, wird ohnehin aufgerufen, und ein Widget wird im Startbildschirm registriert, obwohl es kein Widget gibt, und es wird keine Möglichkeit, es später zu entfernen. (Es kann ein Fehler im ADT -Heimwerker sein).

Ich fand eine Lösung für das erste Problem. Es sind überhaupt keine gemeinsamen Vorlieben erforderlich, da es ohnehin unzuverlässig ist. Es muss in der Laufzeit überprüft werden.

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

In Ihrem Widget -Anbieter:

// 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;
}

Und in Ihrem Servicecode fügen Sie Folgendes hinzu:

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 ist recht, da die Liste "AppWidgetIds" ansieht, um zu wissen, dass die Anzahl der aktiven Widgets (die auf Ihrem Homescreen installierten) die richtige Möglichkeit sind, diese Informationen zu kennen.

Denken Sie jedoch daran, dass Sie dies nicht alleine betrachten müssen.

Überprüfen Sie die offizielle Android -Dokumentation für bewährte Verfahren zu Widgets:https://developer.android.com/guide/topics/appwidgets/index.html#appwidgetProvider

Der richtige Ansatz besteht darin, nur die OnUpdate () -Methode () zu überschreiben und die Liste der "aktiven" Widgets durchzusetzen:

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);
        }
    }
}

Und da Ihr eigener Widget -Anbieter AppWidgetProvider überschreibt, werden Sie nicht in die OnUpdate () -Methode eingehen, wenn Sie keine Widgets auf dem Startbildschirm aktiv haben!

Sehen Sie sich den Code von OnReceive () von Android AppWidgetProvider an, der bereits für Sie überprüft, ob "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);
            }
        }
    }

(...)
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top