Как передать данные из класса конфигурации виджетов в класс поставщика виджетов через намерения?
Я не собираюсь удалять этот вопрос, так как обыкновенные вопросы приводят некоторые замечательные моменты ниже, но я переделал код и задал вопрос здесь по-другому: как получить данные общих настроек в классе сервиса виджетов, не передавая неправильные значения по умолчанию и не получая ошибки нулевого указателя?
Я работаю над приложением, которое выбирает вводимые пользователем данные и передает их виджету. В настоящее время запущен сервис для управления им, и он работает хорошо, но я не могу понять, как эффективно передать строку из одной в другую. Вот мой код до сих пор:
//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
*/
}
}
1 ответ
Как получить дополнительные данные в классе провайдера виджетов из класса конфигурации виджетов и как мне передать их службе после получения?
Вы начинаете, не делая ничего из этого.
Ваш AppWidgetProvider
это всего лишь один из способов обновления содержимого виджета приложения, который будет специально использоваться Android при добавлении виджета приложения и при периодических обновлениях, запрашиваемых метаданными виджета приложения. Кроме того, имейте в виду, что пример вашего AppWidgetProvider
используется только один раз, а затем отбрасывается.
Если вы хотите обновить свой виджет приложения в других местах, перейдите к обновлению виджета приложения, создав RemoteViews
и давая их AppWidgetManager
, Ваш AppWidgetProvider
не имеет к этому никакого отношения. Цитировать документацию:
Когда виджет приложения использует активность конфигурации, действие несет ответственность за обновление виджета приложения после завершения настройки. Вы можете сделать это, запросив обновление непосредственно из AppWidgetManager.
Если вы хотите иметь общую реализацию логики update-the-app-widget, укажите, что это некоторый общий класс, используемый вашей конфигурацией Activity
, ваш AppWidgetProvider
и все остальное, что необходимо для обновления содержимого виджета приложения.
Итак, когда пользователь настраивает виджет приложения с помощью действия, вам необходимо:
обновите виджет приложения самостоятельно через
AppWidgetManager
, а такжедержаться за данные конфигурации (в базе данных,
SharedPreferences
или другой тип файла), чтобы его можно было использовать для будущих обновлений