如何在 android 小部件中使用 PendingIntent?

Posted

技术标签:

【中文标题】如何在 android 小部件中使用 PendingIntent?【英文标题】:How to use PendingIntent in android widgets? 【发布时间】:2014-10-20 00:40:07 【问题描述】:

我还是个菜鸟,不能仅通过文档找到解决方案。我有一个将视图作为按钮的小部件,并且需要在单击视图时启动活动。

<LinearLayout android:id="@+id/config"
    android:paddingLeft="14dp" android:paddingTop="3dp" android:paddingBottom="3dp" android:layout_margin="5dp"
    android:layout_alignParentRight="true"  android:background="@drawable/config_button"
    android:layout_  android:layout_
    android:clickable="true" android:gravity="center">

    <TextView
        android:text="..." android:rotation="90" android:textColor="#ffffffff" android:textSize="20sp"
        android:layout_ android:clickable="true" android:gravity="center"
        android:layout_ />

</LinearLayout>

我知道小部件中的简单 Intent、PendingIntent 和 setOnClickPendingIntent() 不起作用,我必须以某种方式将 setPendingIntentTemplate() 与 setOnClickFillInIntent() 一起使用,但我不知道如何使用。

现在我有这个,当然还不行:

        Intent intent = new Intent(context, ConfigActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.ror_appwidget);

        views.setPendingIntentTemplate(R.id.config, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetId, views);

我在这里缺少什么,我应该如何使用 setOnClickFillInIntent 方法?感谢您的帮助。

【问题讨论】:

【参考方案1】:

首先,当您的小部件上有一个 ListView 并且想要处理对 ListView 项目的点击时,您只能将 setOnClickFillInIntent 与 setPendingIntentTemplate 一起使用。但这不是你的情况。

我会给你一个小例子,告诉你如何在你的按钮上实现简单的点击事件并打开一个活动。

public class WidgetProvider extends AppWidgetProvider 

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 

        for (int widgetId : appWidgetIds) 
            RemoteViews views = buildRemoteViews(context);

            appWidgetManager.updateAppWidget(widgetId, views);
        
    

    private RemoteViews buildRemoteViews(Context context) 
        Intent homeIntent = new Intent(context, HomeActivity.class);
        homeIntent.setData(Uri.parse(homeIntent.toUri(Intent.URI_INTENT_SCHEME)));
        homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent homePendingIntent = PendingIntent.getActivity(context, 0, homeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        views.setOnClickPendingIntent(R.id.your_button, homePendingIntent);

        return views;
    

这应该足以满足您的需求。

非常重要的是在清单文件中声明您的小部件:

<receiver
        android:name=".ui.widget.WidgetProvider"
        android:enabled="true"
        android:label="MyWidgetSample">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="android.appwidget.action.APPWIDGET_DELETED" />
            <action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/widget_provider_info"/>
    </receiver>

您的小部件信息提供程序文件 (widget_provider_info.xml) 在 res/xml 文件夹中:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/layout_widget"<!-- your built layout for the widget-->
    android:minHeight="110dp"
    android:minWidth="250dp"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="86400000"
    android:widgetCategory="home_screen" />

这有帮助吗?

干杯, 迈克

【讨论】:

是的,问题是我忘了在清单中添加活动。 我明白了。祝你好运! setPendingIntentTemplate怎么用?

以上是关于如何在 android 小部件中使用 PendingIntent?的主要内容,如果未能解决你的问题,请参考以下文章

Android小部件,如何在Android API <11中使用notifyAppWidgetViewDataChanged

如何使用 android 小部件在浏览器上打开图像 url

如何在单个应用程序中使用应用程序小部件创建 android 应用程序

如何在app小部件中使用ListView并在android中填充数据?

如何使用 kotlin 在 android 中初始化小部件

如何在 android 小部件 EditText 中添加水印?