2012-06-13 6 views
4

У меня есть 2 версии приложения, бесплатные и платные, но они сохраняют код отдельно. Я, наконец, переместил код в библиотеку, на которую ссылаются обе, чтобы упростить обслуживание кода.виджеты исчезают после обновления приложения, используя библиотеку

Я обнаружил, что изменение AppwidgetProvider заставило пусковую установку удалить все существующие виджеты, поэтому я переместил эти классы из библиотеки, чтобы провайдер остался таким же, чтобы пользователям не приходилось воссоздавать свои виджеты. Пусковая установка больше не удаляет виджеты, но вместо этого они просто не появляются после обновления.

Если я вызываю AppWidgetManager.getAppWidgetIds для имени компонента, как это всегда было, appwidgetid все еще существует. Приложение appwidgetprovider и служба по-прежнему вызываются для обновления виджета, а /data/system/appwidgets.xml все еще показывает виджет, но пусковая установка никогда не отображает его.

Это не то, что это невидимо, так как длительное нажатие в окне виджетов вызывает выбор обоев. Я могу создавать новые виджеты просто отлично, но я не хочу расстраивать пользователей, прося их воссоздать свои виджеты. Журналы не отображают ошибок, которые запускаются программой запуска или AppwidgetService.

Любые идеи, почему виджет останавливает рендеринг после обновления? Это как-то связано с перемещением большей части кода в отдельную библиотеку. Благодаря!

Edit: я тестирование на эмуляторе, уровень апи 15 акций пусковой

+0

Привет, вы упомянули, что «изменение AppwidgetProvider заставило пусковую установку удалить существующие виджеты». Вы имеете в виду изменение кода класса, расширяющего AppwidgetProvider? – jclova

ответ

0

ОК, я нашел решение, но я чувствую себя больным, что это такое ...

После прочтения о том, как классы, объявленные в манифесте, никогда не должны меняться, я пошел и создавал каждый класс в манифесте как класс в приложении, расширяя соответствующий класс в библиотеке. Затем мне пришлось изменить каждое намерение, чтобы включить правильный класс, используя forName. Так, пример этого сценария:

приложение пакета: com.sample.package

активность: MyActivity

библиотека: com.sample.package.core

активность: MyActivity

В приложении есть приложение MyActivity и MyActivity в библиотеке. MyActivity в приложении просто расширяет com.sample.package.core.MyActivity.

Тогда любое вхождение ...

new Intent(context, MyActivity.class) 

... в библиотеке должен стать ...

new Intent(context, Class.forName(context.getPackageName() + "." + MyActivity.class.getSimpleName()); 

Если есть способ сделать это через манифест, пожалуйста, сообщите я знаю!

+0

Вы пытались использовать псевдоним? – 3c71