我正在制作一个主屏幕小部件,根据用户点击的小部件部分,它必须做不同的事情。为实现这一点,我调用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;
}
}
}
答案 0 :(得分:0)
如何在我的小部件中为点击事件设置5个不同的意图?
最简单的解决方案是为getBroadcast()
来电的第二个参数提供不同的值,以便您有五个不同的PendingIntents
。 getBroadcast()
(以及getActivity()
和getService()
)只会创建一个新的PendingIntent
(如果还没有),并且在您的情况下,您的第一个getBroadcast()
来电会创建它。