【问题标题】:how to create Notification SERVICE for my chat application?如何为我的聊天应用程序创建通知服务?
【发布时间】:2017-11-08 01:30:44
【问题描述】:

所以我创建了一个消息应用程序,允许用户相互交流。我正在使用 Firebase 来执行此操作。现在的问题是我想在后台创建一个通知(当应用程序在后台或关闭时)。类似于 Messenger/whatsapp,您可以在其中收到未读消息的通知。

我怎样才能创建这个?

聊天室.java

public class Chat_Room  extends AppCompatActivity{

private Button btn_send_msg;
private EditText input_msg;
private TextView chat_conversation;

private String user_name,room_name;
private DatabaseReference root ;
private DatabaseReference Mnotification;
private String temp_key;


NotificationCompat.Builder notification;
private static final int  uniqueID = 1995;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.chat_room);

    btn_send_msg = (Button) findViewById(R.id.btn_send);
    input_msg = (EditText) findViewById(R.id.msg_input);
    chat_conversation = (TextView) findViewById(R.id.textView);







    user_name = getIntent().getExtras().get("user_name").toString();
    room_name = getIntent().getExtras().get("room_name").toString();
    setTitle(" Room - "+room_name);

    root = FirebaseDatabase.getInstance().getReference().child(room_name);
    Mnotification = FirebaseDatabase.getInstance().getReference().child("notifications");

    btn_send_msg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Map<String,Object> map = new HashMap<String, Object>();
            temp_key = root.push().getKey();
            root.updateChildren(map);

            DatabaseReference message_root = root.child(temp_key);
            Map<String,Object> map2 = new HashMap<String, Object>();
            map2.put("name",user_name);
            map2.put("msg",input_msg.getText().toString());

            message_root.updateChildren(map2);
            //not();
            //test();

        }
    });

    root.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            append_chat_conversation(dataSnapshot);

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            append_chat_conversation(dataSnapshot);

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });




}


public void test() {

    String tkn = FirebaseInstanceId.getInstance().getToken();
    String text = chat_msg;
   not();
    Log.d("App", "Token[" + tkn + "]");





}


public void not(){



    notification = new NotificationCompat.Builder(this);
    notification.setAutoCancel(true);

    notification.setSmallIcon(R.drawable.downloadfile);
    notification.setTicker("This is the tocken");
    notification.setWhen(System.currentTimeMillis());
    notification.setContentTitle(user_name);
    notification.setContentText(chat_msg);


    Intent intent = new Intent(Chat_Room.this, Message.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    notification.setContentIntent(pendingIntent);


    NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    nm.notify(uniqueID, notification.build());





}

private String chat_msg,chat_user_name;

private void append_chat_conversation(DataSnapshot dataSnapshot) {

    Iterator i = dataSnapshot.getChildren().iterator();

    while (i.hasNext()){

        chat_msg = (String) ((DataSnapshot)i.next()).getValue();
        chat_user_name = (String) ((DataSnapshot)i.next()).getValue();












        chat_conversation.append(chat_user_name +" : "+chat_msg +" \n");
        input_msg.setText("");
        test();





    }



}

}

【问题讨论】:

    标签: android firebase service notifications


    【解决方案1】:

    要向客户端发送推送通知,您需要运行一个应用服务实例(例如在 Google App Engine 上),或者现在有了 Firebase 函数,通过一个函数就更容易了。简而言之,您需要在服务器上运行一段代码,该代码会响应您的请求并发送通知。

    我发现 Firebase 函数是最简单的方法,因为您已经在使用 Firebase 数据库。您需要编写函数然后部署它们。

    --> firebase deploy --only functions
    

    每当写入新数据 (onCreate())、更新甚至从数据库中删除时,都可以触发您的函数。 (想象一下,您编写的函数使得每当有新消息在“消息”节点写入数据库时​​触发)。

    此外,您需要将用户唯一消息传递“令牌”生成的客户端存储在数据库中,因为稍后您需要在函数中发送通知。在您的函数中,您需要从数据库中检索该令牌并通过 SDK 发送通知。这是我解释的简化代码:

    //your imports ; see sample linked below for a complete example
    //imagine your functions is triggered by any new write in "messages" node in your database
    exports.sendNotification = functions.database.ref('/messages/{keyId}').onWrite(
    
          //get the token that is already saved in db then ; 
          const payload = {
          notification: {
            title: 'You have a new follower!',
            body: `${follower.displayName} is now following you.`,
            icon: follower.photoURL
          }
          };
    
          admin.messaging().sendToDevice(tokens, payload); //which is a promise to handle
    
    }); 
    

    有关通过 Firebase 函数发送通知的示例,请参阅 Here。有关 Firebase 函数示例,请参阅Here。有关 Firebase 函数和触发器的更多信息,请参阅 here。

    有关更多解释,请参阅here(请记住,这是在 Firebase 函数之前编写的),因此它假定您将其部署到应用服务器实例。此外,here 是有关使用云功能(Firebase 功能)发送通知的更多信息。

    【讨论】:

    • 如果我希望设备向包含特定部门用户列表的列表视图发送通知,例如,我将如何在 firebase 中执行此操作?假设经理负责 3 个部门他想向每个部门的每个用户列表发送通知
    • 只要你有每个部门的用户列表,就和我上面回答的一样。您只需要遍历令牌并发送通知。不确定您的情况是否有所不同。请记住,您也可以通过 Firebase 控制台向您的应用的所有用户发送通知或分块发送通知。
    • 是的,我希望一个使用设备的人将他写的通知发送给那些不确定它是否工作的用户,就像设备到多个设备的通知一样
    • 所以基本上你的代码是这样做的:发送者将通知消息发送到数据库中的某个位置,然后你有一个由 write() 触发的函数到数据库中的那个位置,然后它变成上面的。循环遍历人员列表并向他们发送通知。我不确定 Firebase SDK 是否有任何方式向控制台以外的组发送通知。它可能也值得寻找。
    • 除了在控制台之外是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2011-12-26
    相关资源
    最近更新 更多