如何从Android中的App Widget启动服务

时间:2015-09-23 13:49:03

标签: android listview service android-appwidget

我正在为我的Android应用制作一个主屏幕App Widget。在那个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);
getViewAt RemoteViewsFactory方法中的

。但是在单击ImageButton时,服务无法启动。

我已经为myService设置了一个带有MY_ACTION的intentfilter。并且在没有它的情况下也尝试过没有让事情发挥作用。

任何人都知道如何通过单击Android主屏幕App Widget中列表视图项内的按钮来启动服务?

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

1 个答案:

答案 0 :(得分:1)

来自android javadoc

  

public void setOnClickPendingIntent   相当于召唤   setOnClickListener(android.view.View.OnClickListener)启动   提供了PendingIntent。设置项目的点击操作时   在集合中(例如ListView,StackView等),这个方法会   不行。相反,请使用{@link   RemoteViews#setPendingIntentTemplate(int,PendingIntent)in   与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);