【问题标题】:Setting up widget button for performing background job设置小部件按钮以执行后台作业
【发布时间】:2011-01-23 02:22:00
【问题描述】:

我正在尝试创建一个应用小部件,当按下该小部件时,它会触发一个后台作业,将时间和位置保存到数据库中。

从我目前收集到的信息来看,我可能想要的设置包括一个 AppWidgetProvider 子类,它的 onUpdate() 负责在 RemoteView 上设置一个 PendingIntent 代表小部件按钮。它的 onReceive() 方法会捕获来自 PendingIntent 的广播,我可能会从这里启动一个服务来执行后台作业。

如果到目前为止我走在正确的轨道上,我面临一个挑战,那就是在将应用小部件添加到桌面时不会触发 onUpdate(),因此小部件按钮没有正确设置(它最终什么都不做)。我是否必须使用配置活动设置小部件,这反过来会触发 AppWidgetProvider.onUpdate(),还是有更简单的解决方案?

如果我根本没有走在正确的轨道上,任何指向实现我想要实现的目标的更好方法的指针都将非常感激。 :)

更新:

我想我也可以在这里发布一些代码。这是清单中的接收器定义:

<receiver android:name=".widget.QuickAddWidgetProvider" >
  <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  </intent-filter>
  <meta-data android:name="android.appwidget.provider"
             android:resource="@xml/quickadd_widget_info" />
</receiver>

这是我的资源文件,定义小部件:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="72dp"
    android:minHeight="72dp"
    android:initialLayout="@layout/quickadd_widget"
    android:updatePeriodMillis="0">
</appwidget-provider>

这是 QuickAddWidgetProvider:

public class QuickAddWidgetProvider extends AppWidgetProvider {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v("QuickAdd", "onReceive()"); 
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Log.v("QuickAdd", "onUpdate()");
    }
}

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    如果到目前为止我的方向是正确的

    是的!

    我有一个挑战,即在将应用小部件添加到桌面时不会触发 onUpdate(),因此小部件按钮没有正确设置(它最终什么都不做)

    嗯,应该的。确保您在清单中的AppWidgetProvider 条目具有正确的&lt;intent-filter&gt; 接收更新:

    <receiver android:name=".AppWidget" android:label="@string/app_name" android:icon="@drawable/icon">
            <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
            <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider"/>
    </receiver>
    

    【讨论】:

    • 感谢您的回答。我只是看不出我的意图过滤器有什么问题。我用有问题的代码更新了我的问题,也许另一双眼睛能够发现错误。作为记录,我可以从日志中看到 onReceive() 被触发。认为它可能与将 updatePeriodMillis 设置为 0 有关,但更改它也不会产生 onUpdate() 调用。
    • 哦,顺便说一句..如果没有正确设置意图过滤器,我认为我根本无法通过小部件菜单访问小部件。
    • @rogerkk:嗯,onUpdate() 永远不会在您当前的实现中被调用,因为您通过不链接到 onRecieve() 中的超类来阻止它。此外,AFAIK,小部件菜单由元数据驱动,而不是意图过滤器。
    • 非常感谢,添加链接解决了我的问题! *捂脸*。顺便说一句,喜欢你的 Android 书籍。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2016-08-20
    • 1970-01-01
    • 2020-02-22
    • 2017-09-03
    • 1970-01-01
    相关资源
    最近更新 更多