简体   繁体   English

小部件onUpdate,onReceive

[英]Widget onUpdate, onReceive

I initialize some arrays in an onUpdate() method and after that, using an intent and a button, I try to call onReceive() function which runs fine but cannot access arrays set in onUpdate() method. 我在onUpdate()方法中初始化一些数组,然后,使用intent和一个按钮,我尝试调用onReceive()函数,该函数运行正常,但无法访问onUpdate()方法中设置的数组。 Why is that? 这是为什么? Those array's are object variables and are declared public. 那些数组是对象变量并被声明为public。 Am I missing something? 我错过了什么吗?

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");
    }

}

You are getting a different instance of AppWidgetProvider (since it extends BroadcastReceiver) 你得到一个不同的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." 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."

You can use a service in order to avoid that. 您可以使用服务以避免这种情况。

From the AppWidgetProvider API: 从AppWidgetProvider API:

onReady(): "This is called for every broadcast and before each of the above callback methods. You normally don't need to implement this method because the default AppWidgetProvider implementation filters all App Widget broadcasts and calls the above methods as appropriate." onReady():“在每个广播之前以及每个上述回调方法之前调用此方法。通常不需要实现此方法,因为默认的AppWidgetProvider实现过滤所有App Widget广播并根据需要调用上述方法。”

which means that onReceive() get invoked before onUpdate(), that's why you are getting null 这意味着在onUpdate()之前调用onReceive(),这就是你得到null的原因

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM