Android AppWidget未收到APPWIDGET
我正在尝试使用AlarmManager类创建我的第一个AppWidget,这样我可以比每隔30分钟更频繁地更新一次。 我遵循本教程作为设置我的小部件的基础,但出于某种原因,我无法让更新正常开始。 看起来我从来没有收到任何APPWIDGET_ENABLED意图,这会在我的AppWidgetProvider中触发onEnabled事件回调。
这是我的AppWidgetProvider清单定义:
<receiver
android:name="com.myapp.android.appwidget.MarketTimingAppWidgetProvider"
android:label="@string/appwidget_markettiming_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="@string/appwidget_markettiming_updateintent" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_markettiming_info" />
</receiver>
这是我的AppWidgetProvider的代码:
public class MarketTimingAppWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
Log.d("myLogger", "onUpdate");
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
Log.d("myLogger", "Updating Widget: " + appWidgetId);
updateWidget(context, appWidgetManager, appWidgetId);
}
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
Log.d("myLogger", "onEnabled running");
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 1);
alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(),
1000, createClockIntent(context));
}
public void onDisabled(Context context) {
super.onDisabled(context);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(createClockIntent(context));
}
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.d("myLogger", "Intent Received " + intent.getAction());
String widgetIntent = context.getResources().getString(R.string.appwidget_markettiming_updateintent);
// This code fires when my custom intent is received
if(widgetIntent.equals(intent.getAction())) {
ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
for(int appWidgetId: ids) {
updateWidget(context, appWidgetManager, appWidgetId);
}
}
}
private void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_markettiming);
views.setTextViewText(R.id.widget_text, "Update: " +
DateFormat.getDateTimeInstance(
DateFormat.LONG, DateFormat.LONG).format(new Date()));
// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
private PendingIntent createClockIntent(Context context) {
String updateIntent = context.getResources().getString(R.string.appwidget_markettiming_updateintent);
Log.d("myLogger", "my intent: " + updateIntent);
Intent intent = new Intent(updateIntent);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
}
当我查看LogCat时,我的onReceive方法收到的唯一意图是初始的APPWIDGET_UPDATE意图,并且唯一执行的回调是onUpdate回调。 我已经尝试在我的appwidget意图过滤器中包含APPWIDGET_ENABLED意图(尽管文档告诉我应该由我的窗口小部件自动接收)。 它没有工作。 有没有我在这里失踪的东西?
您的清单中存在错误。 此元素中的操作名称:
<action android:name="@string/appwidget_markettiming_updateintent" />
应该用实际的字符串替换,而不是引用。 所以它应该是这样的:
<action android:name="com.myapp.android.appwidget.action.MARKETTIMING_UPDATE" />
或者你在<string name="appwidget_markettiming_updateintent">
元素中的values / something.xml中有什么。
问题是BroadcastReceiver没有从AlarmManager接收广播。 我用你的代码创建了一个项目,在manifest中只替换了这个字符串(并且当然在values / strings.xml中添加了适当的值),并且所有工作都正常。
另外,你可能想用alarmManager.setRepeating()
System.currentTimeMillis() + 1000
替换alarmManager.setRepeating()
的第二个参数,并删除所有那些额外的与Calendar相关的东西。
显然从模拟器卸载它,然后重新安装它的伎俩。 现在,当我添加APPWIDGET_ENABLE意图时,添加一个小部件,并且当我删除它时,APPWIDGET_DISABLED意图就像我所期望的那样被触发。 我仍然有一个问题,那就是报警管理器并没有像我期望的那样真正开启我的定制意图,但这是我需要研究的一个单独问题。
链接地址: http://www.djcxy.com/p/50653.html