1

我正在开发一个带有小部件的 android 应用程序。

除了一件事,一切都很好。

我在不同的计算机上调试和编码我的应用程序,所以当我第一次启动应用程序时,由于调试密钥不同,我需要重新安装它。当我在安装后尝试读取我的小部件时,我得到了“加载小部件的问题”,我需要重新启动手机才能让它再次工作。

这并不总是发生,还可能发生其他奇怪的事情。

  • 在添加小部件列表屏幕中,我的小部件名称被重命名为“foo.packagename.WidgetName”,而不是小部件标题。
  • Widget 图标被默认的 android 启动器图标取代
  • 当我尝试添加小部件并将其放在主屏幕上时,预览图像被随机图标替换

Beta 测试人员在更新后会遇到相同的问题,即使使用相同的密钥(发布版本)也是如此。

这是一个android问题,还是我的代码有问题?

我的 AppWidgetProvider(部分)

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                     int[] appWidgetIds) {
    final int N = appWidgetIds.length;
    SimpleDateFormat fmt = new SimpleDateFormat("EEEE d MMMM");
    String date = fmt.format(new Date());
    for (int i = 0; i < N; i++) {
        RemoteViews remoteViews = updateWidgetListView(context,
                appWidgetIds[i], date);
        appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
        appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.list);
    }

    super.onUpdate(context, appWidgetManager, appWidgetIds);
}


@Override
public void onDisabled(Context context) {
    Intent intent = new Intent(context, AppService.class);
    intent.setAction(AppService.ACTION_UPDATE_WIDGET);
    PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(sender);

    super.onDisabled(context);
}

private RemoteViews updateWidgetListView(Context context, int appWidgetId, String date) {
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
            R.layout.widget);

    Intent svcIntent = new Intent(context, ListWidgetService.class);
    remoteViews.setRemoteAdapter(R.id.list, svcIntent);
    remoteViews.setEmptyView(R.id.list, R.id.empty_view);

    remoteViews.setTextViewText(R.id.widget_sub_title, date);

    Intent intent = new Intent(context, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
    remoteViews.setOnClickPendingIntent(R.id.widget_root, pendingIntent);

    return remoteViews;
}

widget_provider.xml

 <?xml version="1.0" encoding="utf-8"?>
 <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="250dp"
  android:minHeight="110dp"
  android:previewImage="@drawable/ic_launcher"
  android:initialLayout="@layout/widget"
  android:resizeMode="horizontal|vertical"
  android:updatePeriodMillis="0">

4

0 回答 0