如何设置多个onclickpendingintents到窗口小部件?

时间:2014-02-10 13:28:17

标签: android appwidgetprovider

我正在制作一个主屏幕小部件,根据用户点击的小部件部分,它必须做不同的事情。为实现这一点,我调用setOnClickPendingIntent 5次,但只有最后一次调用有效。如何为我的小部件中的点击事件设置5个不同的意图?

package bembibre.coolstar.windowsmobilewidget;

import java.util.Calendar;

import bembibre.coolstar.windowsmobilewidget.backend.CalendarProvider;
import bembibre.coolstar.windowsmobilewidget.backend.CallsProvider;
import bembibre.coolstar.windowsmobilewidget.backend.DateProvider;
import bembibre.coolstar.windowsmobilewidget.backend.MissedCallsContentObserver;
import bembibre.coolstar.windowsmobilewidget.backend.Provider;
import bembibre.coolstar.windowsmobilewidget.backend.SmssContentObserver;
import bembibre.coolstar.windowsmobilewidget.backend.SmssProvider;
import bembibre.coolstar.windowsmobilewidget.backend.WhatsappProvider;
import bembibre.coolstar.windowsmobilewidget.backend.alarms.AlarmSetter;

import android.app.IntentService;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog.Calls;
import android.widget.RemoteViews;
import android.widget.Toast;

public class ExtendedAppWidgetProvider extends AppWidgetProvider{
private MissedCallsContentObserver mcco;
private SmssContentObserver smsco;
private static final String WIDGET_CLICK = "element";

/**
 * Llama a la clase AlarmManager de Android para indicarle que esta aplicación
 * debe ser ejecutada automáticamente en la próxima medianoche. Como este
 * widget contiene la fecha (día, mes y año), cada vez que sea medianoche
 * debe ser ejecutado para que se actualice y cambie de día.
 */
public static void setDayChangeAlarm(Context context){
    AlarmSetter alarmSetter = new AlarmSetter(context);
    Calendar when = Calendar.getInstance();
    when.roll(Calendar.DAY_OF_MONTH, 1);
    when.set(Calendar.HOUR, 0);
    when.set(Calendar.HOUR_OF_DAY, 0);
    when.set(Calendar.MINUTE, 0);
    when.set(Calendar.SECOND, 0);
    when.set(Calendar.MILLISECOND, 0);
    alarmSetter.setAlarm(when);
}

@Override
public void onEnabled(Context context){
    super.onEnabled(context);
    setDayChangeAlarm(context);

    WhatsappProvider provider = new WhatsappProvider(context);
    provider.mDbHelper.open();
    provider.resetNoMessagesField();
    provider.mDbHelper.close();

    this.mcco = new MissedCallsContentObserver(context);
    context.getContentResolver().registerContentObserver(Calls.CONTENT_URI, true, this.mcco);

    this.smsco = new SmssContentObserver(context);
    context.getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, this.smsco);

    Toast.makeText(context, "Widget iniciado", Toast.LENGTH_SHORT).show();
}

@Override
public void onDisabled(Context context){
    if(this.mcco != null){
        context.getContentResolver().unregisterContentObserver(this.mcco);
    }
    if(this.smsco != null){
        context.getContentResolver().unregisterContentObserver(this.smsco);
    }
}

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction() == null) {
        new SmssProvider(context).setData();

        Bundle extras = intent.getExtras();
        if(extras != null){
            int element = extras.getInt(WIDGET_CLICK);
            switch(element){
                case R.id.widget_date:
                    Toast.makeText(context, "DATE", Toast.LENGTH_SHORT).show();
                    break;

                case R.id.widget_whatsapp:
                    Toast.makeText(context, "WHATSAPP", Toast.LENGTH_SHORT).show();
                    break;

                case R.id.widget_calendar:
                    Toast.makeText(context, "CALENDAR", Toast.LENGTH_SHORT).show();
                    break;

                case R.id.widget_calls:
                    Toast.makeText(context, "CALLS", Toast.LENGTH_SHORT).show();
                    break;

                case R.id.widget_messages:
                    Toast.makeText(context, "MESSAGES", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    } else {
        super.onReceive(context, intent);
    }
}

@Override
public void onUpdate(Context context, AppWidgetManager
appWidgetManager, int[] appWidgetIds) {
    context.startService(new Intent(context,
    ListItemClickService.class));

    setDayChangeAlarm(context);

    /*
     * Para evitar que se muestren eventos del calendario que
     * comienzan en una fecha ya pasada, los actualizamos cada vez
     * que pase un cierto periodo de tiempo y se llame a este
     * método, onUpdate.
     */
    new CalendarProvider(context).setData();

    /*
     * Para evitar que en la parte de mensajes SMS se muestren mensajes ya
     * leídos, la actualizamos periódicamente.
     */
    new SmssProvider(context).setData();
}

// TODO Hacer que no pueda haber más de una instancia de este IntentService
// ejecutándose a la vez.
public static class ListItemClickService extends IntentService {
    public ListItemClickService() {
        super("ExtendedAppWidgetProvider$ListItemClickService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        ComponentName me = new ComponentName(this, ExtendedAppWidgetProvider.class);
        AppWidgetManager mgr = AppWidgetManager.getInstance(this);
        mgr.updateAppWidget(me, buildUpdate(this));
    }

    private void setOnClickPendingIntent(RemoteViews updateViews, int element,
        Context context){

        Intent i = new Intent(this, ExtendedAppWidgetProvider.class);
        i.putExtra(WIDGET_CLICK, element);

        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        updateViews.setOnClickPendingIntent(element, pi);
    }

    private RemoteViews buildUpdate(Context context) {
        RemoteViews updateViews = new
        RemoteViews(context.getPackageName(), R.layout.widget_list);

        Provider dateProvider = new DateProvider(context);
        WhatsappProvider whatsappProvider = new WhatsappProvider(context);
        Provider calendarProvider = new CalendarProvider(context);
        Provider callsProvider = new CallsProvider(context);
        Provider smssProvider = new SmssProvider(context);

        updateViews.setTextViewText(R.id.date, dateProvider.getText());
        updateViews.setTextViewText(R.id.whatsapp, whatsappProvider.getSpannedText());
        updateViews.setTextViewText(R.id.calendar, calendarProvider.getText());
        updateViews.setTextViewText(R.id.calls, callsProvider.getText());
        updateViews.setTextViewText(R.id.messages, smssProvider.getText());

        this.setOnClickPendingIntent(updateViews, R.id.widget_date, context);
        this.setOnClickPendingIntent(updateViews, R.id.widget_whatsapp, context);
        this.setOnClickPendingIntent(updateViews, R.id.widget_calendar, context);
        this.setOnClickPendingIntent(updateViews, R.id.widget_calls, context);
        this.setOnClickPendingIntent(updateViews, R.id.widget_messages, context);

        return updateViews;
    }
}
}

1 个答案:

答案 0 :(得分:0)

  

如何在我的小部件中为点击事件设置5个不同的意图?

最简单的解决方案是为getBroadcast()来电的第二个参数提供不同的值,以便您有五个不同的PendingIntentsgetBroadcast()(以及getActivity()getService())只会创建一个新的PendingIntent(如果还没有),并且在您的情况下,您的第一个getBroadcast()来电会创建它。