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