设置用于执行后台作业的小部件按钮

问题描述:

我试图创建一个应用小部件,当它按下时,会触发后台作业,将时间和位置保存到数据库。设置用于执行后台作业的小部件按钮

从我迄今为止能够收集的信息来看,我可能需要的设置包括一个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()"); 
    } 
} 

如果我到目前为止的正确轨道上

是的!

我有一个挑战,这是的onUpdate()不触发上添加应用程序插件到桌面,从而件按钮是没有得到正确设置(它结束了doind什么)

嗯,应该。确保您的AppWidgetProvider的清单中的条目具有接收更新的权利<intent-filter>

<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> 
+0

感谢您的回答。我只是看不到我的意图过滤器有什么问题。我用有问题的代码更新了我的问题,也许另一双眼睛能够发现错误。为了记录,我可以从日志中看到onReceive()正在被触发。认为它可能与updatePeriodMillis设置为0有关,但是改变它也不会产生onUpdate()调用。 – rogerkk 2011-01-22 18:24:08