Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在应用程序启动时更新小部件_Android_Widget - Fatal编程技术网

Android 如何在应用程序启动时更新小部件

Android 如何在应用程序启动时更新小部件,android,widget,Android,Widget,我有一个小部件与我的应用程序一起工作。当应用程序第一次启动时,我会保留上下文和值,以便在情况发生变化时可以从应用程序调用我的UpdateWidget()。但是如果应用程序不知道上下文和AppID是什么,我就不知道如何获取这些信息。我认为我尝试这样做的方式无论如何都是错误的,但不确定还能尝试什么 所以基本上这个小部件已经在桌面上了。我启动了应用程序并进行了一些更改,我需要向应用程序发送一个包含新信息的更新 我本以为应用程序在启动时会连接到小部件,但事实并非如此 @Override publ

我有一个小部件与我的应用程序一起工作。当应用程序第一次启动时,我会保留上下文和值,以便在情况发生变化时可以从应用程序调用我的UpdateWidget()。但是如果应用程序不知道上下文和AppID是什么,我就不知道如何获取这些信息。我认为我尝试这样做的方式无论如何都是错误的,但不确定还能尝试什么

所以基本上这个小部件已经在桌面上了。我启动了应用程序并进行了一些更改,我需要向应用程序发送一个包含新信息的更新

我本以为应用程序在启动时会连接到小部件,但事实并非如此

@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Toast.makeText(context, "onUpdate", Toast.LENGTH_SHORT).show();

        Ct = context;
        ApMgr = appWidgetManager;
        WidgetID = appWidgetIds;

        WidgetOn = true;

        UpdateWidget();

    }
当应用程序第一次启动时,我保留上下文

除非这是应用程序上下文,否则您正在泄漏内存。请不要泄漏内存

和值,以便在情况发生变化时从应用程序调用我的UpdateWidget()

应用程序中任何可能需要更新小部件的地方,都已经有了
上下文。例如:

但是如果应用程序不知道上下文和AppID是什么,我就不知道如何获取这些信息

你绝对知道“上下文”是什么。这是您的
活动
。或者,如果所讨论的代码在自定义
应用程序
对象中,“上下文”是
应用程序

关于应用程序小部件ID,将其存储在文件中。或者数据库。只需确保在卸载应用程序小部件时将其清除即可


或者,如果您不支持多个应用程序小部件,只需完全跳过应用程序小部件ID,并使用不接受应用程序小部件ID数组的
updateAppWidget()
方法。

我在Commonware提供的大量帮助和线索下解决了这个问题。我试图做的是确保当应用程序数据库发生变化时,应用程序可以向小部件发送更新。无需在任何其他时间更新小部件。当应用程序通过重新启动或新版本与小部件断开连接时,链接被切断。下面的这个小函数再次获取“链接”。再次感谢Stackoverflow和Commonware!!我希望我做的是正确的,它确实起到了我想要的作用

public static void UpdateWidget(Context Ct)
{

        ComponentName Me =new ComponentName(Ct, Widget.class);

        remoteViews=new RemoteViews(Ct.getPackageName(), R.layout.widget);

        AppWidgetManager ApMgr=AppWidgetManager.getInstance(Ct);

        DisplayTop(Ct); // This gets the data from the DB and updates the remote view

        ApMgr.updateAppWidget( Me, remoteViews);

}

我在不传递AppWidget ID的情况下为我的AppWidget执行此操作,它工作正常

Context context = getApplicationContext();
context.startService(new Intent(context, UpdateService.class));
或者,如果你知道上下文,你可以这样做-

startService(new Intent(myClass.this, UpdateService.class));

两个都有用

它工作完全没有问题。您只能使用

int[] ids = AppWidgetManager.getInstance(Context.getApplication()).getAppWidgetIds(new ComponentName(Context.getApplication(), Widget.class));
                    Widget myWidget = new Widget();
                    myWidget.onUpdate(Context, AppWidgetManager.getInstance(Context),ids);

谢谢你的信息!如果我不使用ID,那么它需要一个组件名。我不知道组件名称是什么。。。对不起,我是新手。updateAppWidgetManager.UpdateAppWidgetId(WidgetID,RemoteView);我应该输入什么来代替WidgetID?我还是将ID保存到了数据库中,现在公共void onUpdate(上下文上下文,AppWidgetManager AppWidgetManager,int[]AppWidgetID)AppWidgetManager为空。我也不能保存它,可以吗?@Mark Worsnop:这是一个带有应用程序小部件的示例项目,可能会对您有所帮助:非常感谢您提供的教程!!!对不起,我无法使它工作,但是。我的回答见下一个答案。你能解释一下我们为什么使用startService吗?