2014-06-05 8 views
10

Ich habe eine Widget-Klasse (Erweiterung AppWidgetProvider), die nur eine Ansicht (ImageView) im Widget-Layout hat. Wenn der Benutzer auf das Widget klickt, wird eine Aktivität ohne Probleme aktualisiert und gestartet. Außerdem wird das Widget alle 30 Minuten aktualisiert und die Aktivität wird nach der Aktualisierung des Widgets gestartet. Mein Problem ist: Wie kann ich das Widget so konfigurieren, dass es sich nur aktualisiert, wenn es automatisch aktualisiert wird (nicht durch Klicken des Benutzers)?Verwenden Sie zwei PendingIntent in einer Ansicht in Appwidget

Hier ist mein Code:

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

}

Antwort

1

Ändern Sie den PendingIntent in Ihrem "Remoteview()" Methode starten können:

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

Ihre neue "onReceive()" - Methode könnte wie folgt aussehen:

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

Hoffe, das hilft!

+0

Danke, ja, es war die beste Lösung, die ich bekommen habe, aber vergessen, darüber hier zu erzählen. –

0

Sie android-Service für die Aktualisierung oder Aktivität automatische

+0

danke, aber sein sehr einfaches Widget und sollte einfach bleiben, ich denke, es gibt einen Weg ... –

+0

Dies bietet keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag - du kannst deine eigenen Beiträge jederzeit kommentieren, und sobald du genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) hast, wirst du das tun in der Lage sein [jeden Beitrag kommentieren] (http://stackoverflow.com/help/privileges/comment). –

Verwandte Themen