Domanda

Qualcuno può dirmi come verificare che il mio widget sia stato posto sulla schermata iniziale?

Ho del codice nella mia app che dovrebbe essere eseguito solo se il widget è posizionato sulla schermata iniziale.

È stato utile?

Soluzione

Devi archiviare queste informazioni da solo. Di solito uso le preferenze dell'applicazione, ma potresti usare qualsiasi cosa. Generalmente i widget utilizzano servizi per comunicare, quindi il codice che fa cose è probabilmente in un servizio, ma l'utilizzo della preferenza consente a qualsiasi parte dell'app di accedere a questo.

Nella tua classe di widget che estende AppWidgetProvider, il onenabile viene chiamato quando il widget viene messo su una schermata home e l'ondelegato viene (di solito) chiamato quando viene rimosso. OnDisabled viene chiamato quando tutte le copie vengono rimosse.

Quindi nel codice del tuo provider di 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();
}

Altrove nel codice, controlleresti se il widget è attivo da:

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

Altri suggerimenti

Solo dicendo, ma ...

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

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

So che è una vecchia domanda, ma guardando questo oggi ho visto che ci sono un paio di problemi con la risposta accettata da @Larsona1:

  1. Se l'utente ha cancellato le preferenze condivise, c'è ancora un widget, ma l'app non lo saprà.
  2. Se l'utente rimpiange tra "Aggiungi widget" e prima di premere "OK" - OnEnabled verrà comunque chiamato e un widget verrà registrato nella schermata principale anche se non esiste un widget e non c'è modo di rimuoverlo in seguito. (Potrebbe essere un bug in ADT Home Launcher).

Ho trovato una soluzione al primo problema. Non sono necessarie preferenze condivise, poiché è comunque inaffidabile. Deve essere controllato in fase di esecuzione.

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

Nel tuo fornitore di 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;
}

E, nel tuo codice di servizio, aggiungi questo:

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 ha ragione come guardare l'elenco "AppWidgetIds" per conoscere il numero di widget attivi (quelli installati sulla tua schermata home) è il modo corretto per conoscere queste informazioni.

Tuttavia, tieni presente che non dovresti guardarlo da solo.

Controlla la documentazione ufficiale di Android per le migliori pratiche sui widget:https://developer.android.com/guide/topics/appwidgets/index.html#appwidgetprovider

L'approccio giusto è quello di scavalcare solo il metodo Onupdate () e iterare attraverso l'elenco dei widget "attivi":

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

E poiché il tuo provider di widget sovrascrive AppWidgetProvider, non entrerai nel metodo Onupdate () se non hai widget attivi nella schermata principale!

Vedi il codice onReceive () di Android AppWidgetProvider che controlla già per te che "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);
            }
        }
    }

(...)
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top