Используйте два параметра 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();
}

}

Ответ 1

Измените параметр 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();
    }
}

Надеюсь, это поможет!

Ответ 2

вы можете использовать службу Android для обновления или начать автоматическую работу.