英文:
Listener inside of a WorkManager
问题
我想要在用户关闭应用程序后仍然向他们发送通知。我尝试过 BroadcastReceiver、Service 和 Worker,但是在用户滑动关闭应用程序后,通知就不再显示。我该如何保持我的 ValueEventListener 处于活动状态?
public class NotificationWorker extends Worker {
    private static int notificationId;
    public NotificationWorker(
            @NonNull Context context,
            @NonNull WorkerParameters params) {
        super(context, params);
    }
    @Override
    public Result doWork() {
        createNotificationChannel(getApplicationContext());
        final String username = getInputData().getString("username");
        final NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), "Catting Around")
                .setSmallIcon(R.drawable.logo)
                .setContentTitle("Catting Around")
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);
        final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        final DatabaseReference latest = database.getReference(username + "/latest");
        latest.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String name = snapshot.getValue(String.class);
                if (!name.equals(username)) {
                    latest.setValue(username);
                    notificationManager.notify(notificationId++, builder.setContentText("You received a new message from " + name + "!").build());
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(getApplicationContext(), "Could not connect to the database...", Toast.LENGTH_SHORT).show();
            }
        });
        return Result.success();
    }
    private void createNotificationChannel(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = "Catting Around";
            String description = "Catting Around";
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel("Catting Around", name, importance);
            channel.setDescription(description);
            NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }
}
英文:
I want to give the user notifications, even after they have closed the app. I have tried a BroadcastReceiver, Service and a Worker, but the notifications stop coming in after the user swipes the app away. How do I keep my ValueEventListener alive?
public class NotificationWorker extends Worker {
    private static int notificationId;
    public NotificationWorker(
            @NonNull Context context,
            @NonNull WorkerParameters params) {
        super(context, params);
    }
    @Override
    public Result doWork() {
        createNotificationChannel(getApplicationContext());
        final String username=getInputData().getString("username");
        final NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), "Catting Around")
                .setSmallIcon(R.drawable.logo)
                .setContentTitle("Catting Around")
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);
        final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
        FirebaseDatabase database=FirebaseDatabase.getInstance();
        final DatabaseReference latest = database.getReference(username + "/latest");
        latest.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String name=snapshot.getValue(String.class);
                if(!name.equals(username)) {
                    latest.setValue(username);
                    notificationManager.notify(notificationId++, builder.setContentText("You received a new message from " + name + "!").build());
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(getApplicationContext(), "Could not connect to the database...", Toast.LENGTH_SHORT).show();
            }
        });
        return Result.success();
    }
    private void createNotificationChannel(Context context) {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = "Catting Around";
            String description = "Catting Around";
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel("Catting Around", name, importance);
            channel.setDescription(description);
            // Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }
}
专注分享java语言的经验与见解,让所有开发者获益!



评论