У меня есть виджет приложения с этим кодом:
static void updateAppWidget(final Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_widget);
Intent intent = new Intent(context, ClickIntentService.class);
intent.setAction(ClickIntentService.ACTION_CLICK);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.textViewClicks, pendingIntent);
int clicks = context.getSharedPreferences("sp", MODE_PRIVATE).getInt("clicks", 0);
String user_name = context.getSharedPreferences("sp", MODE_PRIVATE).getString("user_name", null);
views.setTextViewText(R.id.textViewClicks, String.valueOf(clicks));
views.setTextViewText(R.id.textViewUserName, user_name);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
У меня также есть сервис для того, что выполняет действие ACTION_CLICK:
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
final String action = intent.getAction();
if (ACTION_CLICK.equals(action)) {
actionClick();
}
if (ACTION_UPDATE.equals(action)) {
actionUpdate();
}
}
}
private void actionClick() {
int clicks = getSharedPreferences("sp", MODE_PRIVATE).getInt("clicks", 0);
clicks++;
getSharedPreferences("sp", MODE_PRIVATE)
.edit()
.putInt("clicks", clicks)
.putString("user_name", "Example")
.apply();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
int[] widgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, MyWidget.class));
for (int appWidgetId : widgetIds) {
MyWidget.updateAppWidget(getApplicationContext(), appWidgetManager, appWidgetId);
}
}
Работает нормально, даже если "Пример" заменяется простой строковой переменной.
String user_name = "Example";
...some code...
.putString("user_name", user_name)
Но если переменная user_name содержит строковую форму данных Firebase, она не будет работать правильно. Этот код возвращает ноль:
String user_name = context.getSharedPreferences("sp", MODE_PRIVATE).getString("user_name", null);
Это код, который получает имя_пользователя из Firebase:
final DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Users").child("JMtk-T2AZ-LJY8").child("name");
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String user_name = String.valueOf(dataSnapshot.getValue());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
Когда я проверяю уведомлением (отправлено службой), содержит ли имя_пользователя правильные данные из Firebase все нормально, но код виджета возвращает ноль.
Кто-нибудь знает решение?