使用sendBroadcast更新Android小部件

3

我正在创建一个应用小部件,需要在应用数据库发生更改时进行更新。 我的做法: 1. 创建工作中的小部件 2. 覆盖onReceive方法:

public static final String DATABASE_CHANGED = " utimetable.DATABASE_CHANGED";
@Override
public void onReceive(Context context, Intent intent) 
{
    String action = intent.getAction();
    if (action.equals(DATABASE_CHANGED) || action.equals(Intent.ACTION_DATE_CHANGED)) 
    {
        AppWidgetManager gm = AppWidgetManager.getInstance(context);
        int[] ids = gm.getAppWidgetIds(new ComponentName(context, widget_provider.class));
        this.onUpdate(context, gm, ids);            
    }
    else 
    {
        super.onReceive(context, intent);
    }
}
  1. In AndroidManifest:

        <receiver android:name=".widget_provider" android:label="@string/widget_today_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="utimetable.DATABASE_CHANGED" />
            <action android:name="android.intent.action.DATE_CHANGED" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_row" />
    </receiver>
    
  2. Add Broadcast sending into all DB changing functions:

    public static void sendUpdateIntent(Context context) 
    {
        Intent i = new Intent(context, widget_provider.class);
        i.setAction(widget_provider.DATABASE_CHANGED);
        context.sendBroadcast(i);
    }
    

但是,当我在数据库中进行更改时,小部件仍未更新。我该怎么办?

1个回答

2

仅凭你的代码猜测,但第一个引号后面的空格看起来是错误的。

.... DATABASE_CHANGED = " utimetable.DATABASE_CHANGED";

看起来没问题…… 不过还有一件事,也许我在混淆针对Activity的Intent,但是一旦你写了“new Intent(context, widget_provider.class);”,你就只会将Intent发送到widget_provider类……尝试移除它并使用:new Intent(widget_provider.DATABASE_CHANGED); - codeScriber
好观点...在第一个错误之后我就没有再往下读了 :-). 还有另一种方法,不要发送意图,而是直接更新远程视图。 - SteelBytes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接