2014-06-05 8 views
10

Ho una classe widget (che estende AppWidgetProvider), che ha una sola vista (ImageView) nel layout del widget. Quando l'utente tocca il widget, aggiorna e avvia un'attività senza problemi. Inoltre, il widget si aggiorna ogni 30 minuti e l'avvio dell'attività dopo l'aggiornamento del widget. Il mio problema è: come posso configurare il widget in modo che si aggiorni da solo quando viene aggiornato automaticamente (non dal clic dell'utente)?Usa due pendingIntent su una vista in Appwidget

Ecco il mio codice:

public class Widget extends AppWidgetProvider { 

private static final String ACTION_UPDATE = AppWidgetManager.ACTION_APPWIDGET_UPDATE; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    ComponentName cn = new ComponentName(context, Widget.class); 
    appWidgetManager.updateAppWidget(cn, remoteView(context)); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    super.onReceive(context, intent); 
    if (intent.getAction().equalsIgnoreCase(ACTION_UPDATE)) { 
     ComponentName cn = new ComponentName(context, Widget.class); 
     AppWidgetManager.getInstance(context).updateAppWidget(cn, 
       remoteView(context)); 
     Intent launch = new Intent(context, Main.class); 
     PendingIntent pi = PendingIntent.getActivity(context, 0, launch, 0); 
     try { 
      pi.send(); 
     } catch (CanceledException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

private RemoteViews remoteView(Context ctx) { 
    ArrayList<Integer> imageId = new ArrayList<Integer>(); 
    for (int i = 1; i <= 30; i++) { 
     int drawableImageId = ctx.getResources().getIdentifier("image" + i, 
       "drawable", ctx.getPackageName()); 
     imageId.add(drawableImageId); 
    } 

    RemoteViews rv = new RemoteViews(ctx.getPackageName(), R.layout.widget); 

    Calendar todayDate = Calendar.getInstance(); 
    todayDate.setTimeInMillis(System.currentTimeMillis()); 

    Calendar startDate = Calendar.getInstance(); 
    startDate.set(2014, 05, 15); 

    int dayDiffer = Helper.getDiffernce(todayDate, startDate); 
    dayDiffer += 1; 

    if (dayDiffer >= 1 && dayDiffer <= 30) { 
     rv.setInt(R.id.img_widget, "setImageResource", 
       imageId.get(dayDiffer - 1)); 
     T(ctx, "in >> " + dayDiffer); 
    } else if (dayDiffer >= 0) { 
     T(ctx, "before >> " + dayDiffer); 
    } else if (dayDiffer <= 31) { 
     T(ctx, "after >> " + dayDiffer); 
    } 

    Intent update = new Intent(ctx, Widget.class); 
    update.setAction(ACTION_UPDATE); 
    PendingIntent pi_update = PendingIntent.getBroadcast(ctx, 0, update, 0); 
    rv.setOnClickPendingIntent(R.id.img_widget, pi_update); 

    return rv; 
} 

public void T(Context context, String string) { 
    Toast.makeText(context, string, Toast.LENGTH_SHORT).show(); 
} 

}

risposta

1

Modificare il PendingIntent nel vostro "remoteview) (" Metodo:

Intent userInput = new Intent(ctx, Widget.class); 
userInput.setAction("LAUNCH_MAIN_ACTIVITY"); // use another action! 

PendingIntent pi_userInput = 
        PendingIntent.getBroadcast(ctx, 0, userInput, 0); 
rv.setOnClickPendingIntent(R.id.img_widget, pi_userInput); 

il nuovo metodo di "OnReceive()" potrebbe essere la seguente:

@Override 
public void onReceive(Context context, Intent intent) { 
    super.onReceive(context, intent); 

    if (intent.getAction().equalsIgnoreCase(ACTION_UPDATE)) { 
     ComponentName cn = new ComponentName(context, Widget.class); 
     AppWidgetManager.getInstance(context).updateAppWidget(cn, 
       remoteView(context)); 

    } 

    // the launch will always be executed, 
    // the update only for "ACTION_UPDATE" 
    Intent launch = new Intent(context, Main.class); 
    PendingIntent pi = PendingIntent.getActivity(context, 0, launch, 0); 
    try { 
     pi.send(); 
    } catch (CanceledException e) { 
     e.printStackTrace(); 
    } 
} 

Spero che questo aiuti!

+0

Grazie, Sì, è stata la soluzione migliore che ho avuto ma ho dimenticato di dirlo qui. –

0

è possibile utilizzare il servizio di Android per l'aggiornamento o avviare attività automatica

+0

grazie, ma è un widget molto semplice e dovrebbe rimanere semplice, penso che ci sia un modo ... –

+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). –