Я создал приложение и подключил его к базе данных 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);
}
}
Код: Выделить всё
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
}
});
}
}
Код: Выделить всё
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);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... ing-fireba
Мобильная версия