我不打算删除这个问题,因为下面的公告提出了一些优点,但我确实修改了代码并在这里以不同的方式提出问题:How do I retrieve shared preferences data in a Widget Service class without passing in incorrect default values or getting null pointer errors?
我正在开发一个应用程序,它接受用户的输入选择并将它们传递给窗口小部件。它目前正在运行一个服务来管理它并且运行良好,但我无法弄清楚如何有效地将String从一个传递到另一个。到目前为止,这是我的代码:
//First Widget config is called:
public class WidgetConfig extends Activity{
//Stuff happens here to get data from EditTexts and spinners and converts
//them to strings.
//Eventually a button is pressed which enters all the information:
public void onClick(View v) {
//I have already tried shared preferences like this:
//This was intended to give the shared preferences a unique identifier.
//It does not work for what I am trying to do
String str = Integer.toString(appWidgetId);
sp.putString(editor, str + "::" + "username", user_name);
//The appWidgetID was unique and so I thought it would work as an
//identifier for shared prefs.
//This is the intent for opening the provider
Intent intentUpdate = new Intent(context, MailWidgetProvider.class);
//I also attempted to put items here:
intentUpdate.putExtra("username", user_name);
//I left out the rest of the pending update code as it is irrelevant to this.
}
}
//Next the AppWidgetProvider is called
public class MailWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
ComponentName thisWidget = new ComponentName(context,
MailWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
//This is the intent to open up and run the service
Intent intent = new Intent(context.getApplicationContext(),
MailWidgetUpdateService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
context.startService(intent);
}
}
//Service Class
public class MailWidgetUpdateService extends Service {
public void onStart(Intent intent, int startId) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this
.getApplicationContext());
int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
ComponentName thisWidget = new ComponentName(getApplicationContext(),
MailWidgetProvider.class);
int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget);
//Loop through the IDs
for (int widgetId : allWidgetIds) {
int awid = widgetId;
String str = Integer.toString(widgetId);
String user_name = sp.getString(settings, str + "::" + "chosen_accout_string", "Loading...");
Log.d(TRACKING_USERNAME, user_name);
/*
Issue Here, see explanation below
*/
}
}
答案 0 :(得分:4)
如何从窗口小部件配置类中检索窗口小部件提供程序类中的附加内容,如何在收到后将它们传递给服务?
你从没有做太多的事情开始。
您的AppWidgetProvider
仅仅是一个更新应用小部件内容的方式,当您的应用小部件添加时,Android将专门用于应用小部件内容,以及应用请求定期更新窗口小部件此外,请记住,AppWidgetProvider
的实例仅使用一次,然后被丢弃。
如果您想在其他地方更新您的应用小部件,请更新应用小部件,方法是创建RemoteViews
并将其提供给AppWidgetManager
。您的AppWidgetProvider
与此无关。引用the documentation:
当App Widget使用配置Activity时,Activity负责在配置完成时更新App Widget。您可以通过直接从AppWidgetManager请求更新来完成此操作。
如果您想拥有update-the-app-widget逻辑的通用实现,请将其配置为Activity
,AppWidgetProvider
以及其他任何内容使用的常用类。需要更新app小部件内容。
因此,当用户通过活动配置应用小部件时,您需要:
通过AppWidgetManager
和
保留配置数据(在数据库中,SharedPreferences
或其他类型的文件),以便可以将其用于将来的更新