【问题标题】:Widget onUpdate, onReceive小部件 onUpdate, onReceive
【发布时间】:2010-08-12 23:31:16
【问题描述】:

我在 onUpdate() 方法中初始化了一些数组,然后,使用意图和按钮,我尝试调用 onReceive() 函数,该函数运行良好,但无法访问在 onUpdate() 方法中设置的数组。这是为什么?这些数组是对象变量并且被声明为公共的。 我错过了什么吗?

package net.aerosoftware.widgettest;

import java.util.HashMap;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;

public class WidgetTest extends AppWidgetProvider {

    public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";
    public HashMap<Integer, String> channelsImages;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    {
        Log.e("UPDATE", "Start");   
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);

        channelsImages = new HashMap<Integer, String>();
        channelsImages.put(0, "one");
        channelsImages.put(1, "two");

        Intent active = new Intent(context, WidgetTest.class);
        active.setAction(ACTION_WIDGET_RECEIVER);       
        PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0);
        remoteViews.setOnClickPendingIntent(R.id.buttonclick, actionPendingIntent);

        super.onUpdate(context, appWidgetManager, appWidgetIds);
        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
        Log.e("UPDATE", "End");
    }

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Log.e("RECEIVE", "Start 2");
        if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) 
        {
            try
            {
                Log.e("SIZE", "Size Of channel array: "+channelsImages.size());
            }
            catch(Exception e)
            {
                Log.e("ON_RECIEVE_ERROR", " "+e.getMessage());
            }
        }
        super.onReceive(context, intent);
        Log.e("RECEIVE", "End");
    }

}

【问题讨论】:

  • “无法访问”是什么意思?你有什么例外吗?内容为空?
  • 您能否将代码添加到您的问题中,这样会更容易。
  • 你只有一个这个小部件的实例吗?

标签: android android-widget


【解决方案1】:

您将获得一个不同的 AppWidgetProvider 实例(因为它扩展了 BroadcastReceiver)

API:"A BroadcastReceiver object is only valid for the duration of the call to onReceive(Context, Intent). Once your code returns from this function, the system considers the object to be finished and no longer active."

您可以使用服务来避免这种情况。

【讨论】:

  • 我的小部件中有一个刷新按钮,我想在小部件中触发“onUpdate”。我可以在 AppWidgetProvider 中执行此操作,还是必须使用 pendingclickevent?谢谢。
【解决方案2】:

来自 AppWidgetProvider API:

onReady(): “每次广播和before上述每个回调方法都会调用此方法。您通常不需要实现此方法,因为默认的 AppWidgetProvider 实现会过滤所有 App Widget 广播并酌情调用上述方法。”

这意味着 onReceive() 在 onUpdate() 之前被调用,这就是你得到 null 的原因

http://developer.android.com/reference/android/appwidget/AppWidgetProvider.html

【讨论】:

  • 不,我知道,我使用 if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) 设置数据后使用接收器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
相关资源
最近更新 更多