Запуск активности из виджета завершается ошибкой после - PullRequest
0 голосов
/ 03 февраля 2011

Я реализовал виджет приложения для запуска своей активности при нажатии.

onUpdate() метод WidgetProvider:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);

    final int N = appWidgetIds.length;
    for (int i=0; i<N; i++) {
        int appWidgetId = appWidgetIds[i];

        RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.mywidgetprovider_layout);
        // ....update updateViews here
        appWidgetManager.updateAppWidget(appWidgetId, updateViews);

        Intent onClickedIntent = new Intent(context,MyActivity.class);
        PendingIntent pi = PendingIntent.getActivity(context, 0, onClickedIntent, 0);
        updateViews.setOnClickPendingIntent(R.id.myView, pi);

        appWidgetManager.updateAppWidget(appWidgetId, updateViews);

     }
}

Он работает, как и ожидалось, после добавления виджета на главном экране.

Но иногда он не может запуститьактивность снова!Я должен удалить виджет и добавить снова.

Как я могу это исправить?пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 14 января 2013

Я знаю, что это как два года позже, но я боролся с этим тоже до сегодняшнего дня, когда я думаю, что знаю, что я делал неправильно.Я думаю, что главный ключ заключается в том, чтобы сосредоточиться на использовании класса RemoteViews.Вы готовите эти объекты как своего рода набор инструкций для следующего процесса.Установка «намерения в ожидании клика» должна быть сделана за до отправки его в метод updateAppWidget, так что ваш первый вызов этого метода не будет очищать ваш объект «myView» для кликов.Затем ваш код устанавливает триггер onClick и вызывает updateAppWidget второй раз.Похоже, что нужно работать, но есть целый запутанный вопрос относительно того, когда два намерения различны или неоднозначны, о которых вы можете прочитать, чтобы понять, почему ваш код работает непредсказуемо.Если я прав, то вы должны просто не вызывать updateAppWidget в первый раз, а затем всегда устанавливать триггер onClick при создании объектов RemoteViews.В любом случае, я на это надеюсь.

0 голосов
/ 03 февраля 2011

Я бы сделал это так:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.mywidgetprovider_layout);    
    Intent onClickedIntent = new Intent(context,MyActivity.class);
    PendingIntent pi = PendingIntent.getActivity(context, 0, onClickedIntent, 0);
    updateViews.setOnClickPendingIntent(R.id.myView, pi);

    for (int i=0; i<appWidgetIds.length; i++) {
        appWidgetManager.updateAppWidget(appWidgetIds[i], updateViews);
     }
}

В чем я не уверен, так это в super.onUpdate(). Мой собственный код виджета не имеет его и, кажется, работает нормально ... не уверен, нужен он или нет.

Я не знаю, если этот рефактор исправит вашу проблему!

...