首页 > 解决方案 > 如何使用 sse android 发布通知

问题描述

我正在尝试从服务器获取数据并将其发布在屏幕上并推送通知。数据是一个随机数,它每秒都在变化。打开时,服务器正在后台工作并且正在接收数据,但数据一次在屏幕上发布,它没有改变,我无法收到通知。使用按钮,数据完美地发布在屏幕上,并且每秒都在变化,但我无法再次收到通知。

import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import android.os.Bundle;
import com.star_zero.sse.EventHandler;
import com.star_zero.sse.EventSource;
import com.star_zero.sse.MessageEvent;
//STAR-ZERO/sse-android
public class MainActivity extends AppCompatActivity {
    static TextView s;
    String a =null;
    private final String CHANNEL_ID = "server_notifications";
    private final int NOTIFICATIONS_ID = 1;
    public EventSource eventSource;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        s=findViewById(R.id.random);
        final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
        final NotificationCompat.Builder builder = new  NotificationCompat.Builder(this, CHANNEL_ID);
        eventSource = new EventSource("path", new EventHandler() {
            @Override
            public void onOpen() {
            }
            @Override
            public void onMessage(MessageEvent messageEvent) {
                a=messageEvent.getData();
                try {

                    builder.setPriority(NotificationCompat.PRIORITY_MAX)
                            .setAutoCancel(true)
                            .setContentText(a)
                            .setContentTitle("ALERT!!!")
                            .setSmallIcon(R.drawable.noti_icon);
                    notificationManager.notify (NOTIFICATIONS_ID,builder.build());
                    s.setText(a);
                }
                catch (Exception e){
                    e.printStackTrace();
                }
            }
            @Override
            public void onError(Exception e) {
                try {
                    s.setText("error");
                }
                catch (Exception d) {
                    d.printStackTrace();
                }
            }
        });
        eventSource.connect();
        findViewById(R.id.button_open).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                eventSource.connect();
            }
        });
        findViewById(R.id.button_close).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                eventSource.close();
            }
        });
    }
}

标签: javaandroidnotificationsserver-sent-events

解决方案


您不应该在每个通知上构建新通知,onMessage而是维护全局通知引用并更新内容。有关更多详细信息,请参阅此回复:更新通知文本,而不是整个通知


推荐阅读