Виджет Android не обновляется автоматически после первоначального изменения данных с использованием базы данных FirebaseAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Виджет Android не обновляется автоматически после первоначального изменения данных с использованием базы данных Firebase

Сообщение Anonymous »

Мне нужно создать проект для какой-то школы, у них есть образовательные планшеты (Android), они хотят отображать виджет на главном экране, который будет давать учащимся быстрые и короткие сообщения, например: Завтра Праздник.
Я создал приложение и подключил его к базе данных Firebase Realtime, оно может читать данные, фактически, когда я впервые запускаю приложение, и изменять данные в базе данных. одновременно изменения сразу отражаются в виджете, однако, как и через 2 минуты, когда я снова вношу изменения в базу данных, виджет не обновляется автоматически, мне нужно либо открыть приложение и закрыть его, чтобы увидеть изменения, либо удалить виджет с главного экрана и верните его снова, чтобы увидеть изменения. Я не знаю, что делать, ниже мой код:
MainActivity.java

Код: Выделить всё

package com.example.widgetproject;

import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Start the widget update service
Intent serviceIntent = new Intent(this, WidgetUpdateService.class);
startService(serviceIntent);
}
}
MyWidgetProvider.java:

Код: Выделить всё

package com.example.widgetproject;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class MyWidgetProvider extends AppWidgetProvider {
public static final String UPDATE_WIDGET_ACTION = "com.example.widgetproject.UPDATE_WIDGET";
private ValueEventListener valueEventListener;

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);

// Start listening for updates
startListeningForUpdates(context);
}

@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (intent != null && intent.getAction() != null &&  intent.getAction().equals(UPDATE_WIDGET_ACTION)) {
// Update widget
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, MyWidgetProvider.class));
updateWidgets(context, appWidgetManager, appWidgetIds);
}
}

private void startListeningForUpdates(Context context) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Notifications").child("Message");

valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String data = dataSnapshot.getValue(String.class);
updateWidgets(context, AppWidgetManager.getInstance(context), getAppWidgetIds(context));
}

@Override
public void onCancelled(DatabaseError databaseError) {
// Handle potential errors here if needed, otherwise leave it empty
}
};

reference.addValueEventListener(valueEventListener);
}

private void updateWidgets(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int appWidgetId :  appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}

private int[] getAppWidgetIds(Context context) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class);
return appWidgetManager.getAppWidgetIds(thisWidget);
}

private void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Notifications").child("Message");
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String data = dataSnapshot.getValue(String.class);
if (data != null) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
views.setTextViewText(R.id.widget_textview, data);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}

@Override
public void onCancelled(DatabaseError databaseError) {
// Handle potential errors here if needed, otherwise leave it empty
}
});
}
}

WidgetUpdateService.java:

Код: Выделить всё

package com.example.widgetproject;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import androidx.annotation.Nullable;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class WidgetUpdateService extends Service {
private ValueEventListener valueEventListener;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Notifications").child("Message");

valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Intent updateIntent = new Intent(MyWidgetProvider.UPDATE_WIDGET_ACTION);
sendBroadcast(updateIntent);
}

@Override
public void onCancelled(DatabaseError databaseError) {
// Handle potential errors here
}
};

reference.addValueEventListener(valueEventListener);

return START_STICKY;
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onDestroy() {
super.onDestroy();
if (valueEventListener != null) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Notifications").child("Message");
reference.removeEventListener(valueEventListener);
}
}
}
Я пытался создать API для извлечения данных из базы данных и последующего отображения их в виджете, но безрезультатно. По сути, я хочу создать виджет, который будет обновляться в режиме реального времени, использование Firebase не является принуждением.

Подробнее здесь: https://stackoverflow.com/questions/786 ... ing-fireba
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»