Настраиваемые виджеты в Android

Документация разработчика, похоже, меня не подвела. Я могу создать статический виджет, не задумываясь, я даже могу создать виджет, похожий на виджет аналоговых часов, который будет обновляться, однако я не могу на всю жизнь понять, как создать виджет, на который реагирует, когда пользователь нажимает Это. Вот лучший пример кода, который документация разработчика дает тому, что должно содержать активность виджетов (единственный другой намек - это демонстрации API, который создает только статический виджет):

public class ExampleAppWidgetProvider extends AppWidgetProvider {
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context, ExampleActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

            // Get the layout for the App Widget and attach an on-click listener to the button
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

            // Tell the AppWidgetManager to perform an update on the current App Widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

from: Страница виджетов документации для разработчиков Android

Итак, похоже, что ожидающее намерение вызывается при щелчке виджета, которое основано на намерении (я не совсем уверен, какая разница между намерением и ожидающим намерением), и намерение класс ExampleActivity. Поэтому я сделал свой класс классов упражнений простой деятельностью, которая при создании создала объект медиапланера и запустила его (он никогда не выпустит объект, поэтому он в конечном итоге потерпит крах, вот он код:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
    mp.start();
}

Однако, когда я добавил виджет на главный экран и нажал на него, ничего не сыграло, по сути, ничего не сыграло, когда я установил таймер обновления всего на несколько сотен миллисекунд (в XML файл поставщика приложения). Кроме того, я установил точки останова и выяснил, что он не только не доходил до активности, но и никаких точек останова, которые я установил, никогда не возникнет. (Я до сих пор не понял, почему это так), однако logcat, казалось, указывал, что файл класса активности запущен.

Итак, есть ли что-нибудь, что я могу сделать, чтобы заставить appwidget отвечать на клик? Поскольку метод onClickPendingIntent() является самым близким, я нашел метод типа onClick.

Большое спасибо.

Ответ 1

Сначала добавьте статическую переменную с константой.

public static String YOUR_AWESOME_ACTION = "YourAwesomeAction";

Затем вам нужно добавить действие к намерению, прежде чем добавить намерение в ожидающее намерение:

Intent intent = new Intent(context, widget.class);
intent.setAction(YOUR_AWESOME_ACTION);

(Где widget.class - класс вашего AppWidgetProvider, ваш текущий класс)

Затем вам нужно создать PendingIntent с getBroadcast

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

Установите onClickPendingIntent для интерактивного просмотра в вашем виджете

remoteView.setOnClickPendingIntent(R.id.widgetFrameLayout, pendingIntent);

Затем переопределите метод onReceive в том же классе:

@Override
public void onReceive(Context context, Intent intent) {
 super.onReceive(context, intent);

И затем ответьте на кнопку нажатием кнопки, запросив намерение, возвращенное для вашего действия, в методе onReceive:

if (intent.getAction().equals(YOUR_AWESOME_ACTION)) {
   //do some really cool stuff here
}

И это должно быть!