Используйте два pendingIntent на одном представлении в Appwidget
У меня есть класс виджетов (расширение AppWidgetProvider), который имеет только одно представление (ImageView) в макете виджета. Когда пользователь нажимает на виджет, он обновляет и запускает действие без проблем. Кроме того, виджет обновляется каждые 30 минут и запуск активности после обновления виджета. Моя проблема в том, что: как настроить виджет так, чтобы он обновлялся только при автоматическом обновлении (не по клику пользователя)?
Вот мой код:
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();
}
}
2 ответа:
Измените PendingIntent в методе remoteView ():
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);
Ваш новый метод onReceive () может выглядеть следующим образом:
@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(); } }
Надеюсь, это поможет!