Android 如何从 App Widget 启动服务

How to start a service from App Widget in Android

我正在为我的 Android 应用程序制作主屏幕应用程序小部件。在那个 App Widget 中有一个 ListView。该 ListView 有一个自定义布局,其中有一个 TextView 和一个 ImageButton。我正在该 ImageButton 上设置一个 PendingIntent 以启动服务,如下所示:

        Intent intent = new Intent(mContext, MyService.class);
        intent.putExtra(MyConstants.MY_EXTRA, c.getString(c.getColumnIndex(MyColumns.MY_COLUMN_TITLE)));
        intent.setAction(MyConstants.MY_ACTION);
        PendingIntent pendingIntent = PendingIntent.getService(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        rv.setOnClickPendingIntent(R.id.MyImageButton, pendingIntent);

RemoteViewsFactorygetViewAt 方法中。但是在单击 ImageButton 时服务不会启动。

我已经为 MyService 添加了一个带有 MY_ACTION 的 intentfilter。也试过没有它,但没有成功。

有人知道如何在 Android 主屏幕 App Widget 中点击列表视图项内的按钮启动服务吗?

一切正常,即 ListView 是从 SQLite 数据库完美填充的。

来自 android javadoc

public void setOnClickPendingIntent Equivalent to calling setOnClickListener(android.view.View.OnClickListener) to launch the provided PendingIntent. When setting the on-click action of items within collections (eg. ListView, StackView etc.), this method will not work. Instead, use {@link RemoteViews#setPendingIntentTemplate(int, PendingIntent) in conjunction with RemoteViews#setOnClickFillInIntent(int, Intent).

在您的 AppWidgetProvider 的更新方法中,您必须添加

final PendingIntent clickPendingIntentTemplate = PendingIntent.getService...
views.setPendingIntentTemplate(R.id.widget_list, clickPendingIntentTemplate);

并在 RemoteViewsFactory 的 getViewAt 方法中:

final Intent fillInIntent = new Intent();
fillInIntent.putExtra(...);
views.setOnClickFillInIntent(R.id.widget_list_item, fillInIntent);