在Android的聊天应用程序的用户列表视图中的新邮件通知 [英] New message notification in list view of users in android chat application

查看:170
本文介绍了在Android的聊天应用程序的用户列表视图中的新邮件通知的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好我正在开发使用解​​析为后端和sinch服务的机器人聊天应用程序。
一切正常如发送和我还利用parse.com推送通知两款Android devices.I之间接收消息。
现在,我想修改,当新邮件到达时,它喜欢的应用程序必须表明该消息是在我的聊天应用程序相同待定
什么-应用

Hi I am developing an android chat application using parse as back end and sinch service. Everything is working fine like sending and receiving messages between two android devices.I am also using push notification from parse.com. Now i want to modify the applications like when the new message arrives it must show that the message is pending in my chat application same as that Whats-App

下面是我的code

ListUserActivity.java

    private void setConversationsList() {
    currentUserId = ParseUser.getCurrentUser().getObjectId();
    names = new ArrayList<String>();
    ParseQuery<ParseUser> query = ParseUser.getQuery();
    query.whereNotEqualTo("objectId", currentUserId);
    query.findInBackground(new FindCallback<ParseUser>() {
        public void done(List<ParseUser> userList, com.parse.ParseException    e) {
            if (e == null) {
                for (int i=0; i<userList.size(); i++) {
                    names.add(userList.get(i).getUsername().toString());
                }
                usersListView = (ListView)findViewById(R.id.usersListView);
                namesArrayAdapter =
                        new ArrayAdapter<String>(getApplicationContext(),
                                R.layout.user_list_item, names);
                usersListView.setAdapter(namesArrayAdapter);

                usersListView.setOnItemClickListener(new    AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> a, View v, int i,   long l) {
                        try {
                            System.out.println(i);
                            openConversation(names, i);
                        }
                        catch (IndexOutOfBoundsException e1){
                            System.out.println(e1.getMessage());
                        }
                    }
                });
            } else {
                Toast.makeText(getApplicationContext(),
                        "Error loading user list",
                        Toast.LENGTH_LONG).show();
            }
        }
    });
  }

MessagingActivity.java

public class MessagingActivity extends ActionBarActivity {

private String recipientId;
private String name;
private EditText messageBodyField;
private String messageBody;
private MessageService.MessageServiceInterface messageService;
private MessageAdapter messageAdapter;
private ListView messagesList;
private String currentUserId;
private ServiceConnection serviceConnection = new MyServiceConnection();
private MessageClientListener messageClientListener = new MyMessageClientListener();

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

    bindService(new Intent(this, MessageService.class), serviceConnection,   BIND_AUTO_CREATE);

    Intent intent = getIntent();
    recipientId = intent.getStringExtra("RECIPIENT_ID");
    name=intent.getStringExtra("name");
    setTitle(name);
    currentUserId = ParseUser.getCurrentUser().getObjectId();

    // Store app language and version
    ParseInstallation installation =   ParseInstallation.getCurrentInstallation();
    installation.put("userI", currentUserId);
    installation.saveInBackground();

    messagesList = (ListView) findViewById(R.id.listMessages);
    messageAdapter = new MessageAdapter(this);
    messagesList.setAdapter(messageAdapter);
    populateMessageHistory();

    messageBodyField = (EditText) findViewById(R.id.messageBodyField);

    findViewById(R.id.sendButton).setOnClickListener(new   View.OnClickListener() {
        @Override
        public void onClick(View view) {
            sendMessage();
        }
    });
}

//get previous messages from parse & display
private void populateMessageHistory() {
    String[] userIds = {currentUserId, recipientId};
    ParseQuery<ParseObject> query = ParseQuery.getQuery("ParseMessage") ;
    query.whereContainedIn("senderId", Arrays.asList(userIds));
    query.whereContainedIn("recipientId", Arrays.asList(userIds));
    query.orderByAscending("createdAt");
    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> messageList,   com.parse.ParseException e) {
            if (e == null) {
                for (int i = 0; i < messageList.size(); i++) {
                    WritableMessage message = new    WritableMessage(messageList.get(i).get("recipientId").toString(),  messageList.get(i).get("messageText").toString());
                    if  (messageList.get(i).get("senderId").toString().equals(currentUserId)) {
                        messageAdapter.addMessage(message,   MessageAdapter.DIRECTION_OUTGOING);
                    } else {
                        messageAdapter.addMessage(message,  MessageAdapter.DIRECTION_INCOMING);
                    }
                }
            }
        }
    });
}

private void sendMessage() {
    messageBody = messageBodyField.getText().toString();
    if (messageBody.isEmpty()) {
        Toast.makeText(this, "Please enter a message", Toast.LENGTH_LONG).show();
        return;
    }
    messageService.sendMessage(recipientId, messageBody);
    messageBodyField.setText("");
}

@Override
public void onDestroy() {
    messageService.removeMessageClientListener(messageClientListener);
    unbindService(serviceConnection);
    super.onDestroy();
}

private class MyServiceConnection implements ServiceConnection {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        messageService = (MessageService.MessageServiceInterface) iBinder;
        messageService.addMessageClientListener(messageClientListener);
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        messageService = null;
    }
}
private class MyMessageClientListener implements MessageClientListener {
    @Override
    public void onMessageFailed(MessageClient client, Message message,
                                MessageFailureInfo failureInfo) {
        Toast.makeText(MessagingActivity.this, "Message failed to send.",    Toast.LENGTH_LONG).show();
    }


    @Override
    public void onIncomingMessage(MessageClient client, Message message) {
        if (message.getSenderId().equals(recipientId)) {
           //   Toast.makeText(getApplicationContext(),"message",Toast.LENGTH_SHORT).show();
            WritableMessage writableMessage = new WritableMessage(message.getRecipientIds().get(0), message.getTextBody());
            messageAdapter.addMessage(writableMessage,  MessageAdapter.DIRECTION_INCOMING);
        }

    }

    @Override
    public void onMessageSent(MessageClient client, Message message, final String recipientId) {

        final WritableMessage writableMessage = new WritableMessage(message.getRecipientIds().get(0), message.getTextBody());
        messageAdapter.addMessage(writableMessage, MessageAdapter.DIRECTION_OUTGOING);
        //only add message to parse database if it doesn't already exist there
       ParseQuery<ParseObject> query = ParseQuery.getQuery("ParseMessage");
        query.whereEqualTo("sinchId", message.getMessageId());
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> messageList, com.parse.ParseException e) {
                if (e == null) {

                    if (messageList.size() == 0) {
                        ParseObject parseMessage = new ParseObject("ParseMessage");
                        parseMessage.put("senderId", currentUserId);
                        parseMessage.put("recipientId", writableMessage.getRecipientIds().get(0));
                        parseMessage.put("messageText", writableMessage.getTextBody());
                        parseMessage.put("sinchId", writableMessage.getMessageId());
                        parseMessage.put("read",false);
                        parseMessage.saveInBackground();
                        //  messageAdapter.addMessage(writableMessage, MessageAdapter.DIRECTION_OUTGOING);

                        ParseUser user = ParseUser.getCurrentUser();
                        String name = user.getUsername();
                       // Create our Installation query
                        ParseQuery pushQuery = ParseInstallation.getQuery();
                        pushQuery.whereEqualTo("userI", writableMessage.getRecipientIds().get(0));

                        // Send push notification to query
                        ParsePush push = new ParsePush();
                        push.setQuery(pushQuery); // Set our Installation query
                        push.setMessage("Message from"+ name +writableMessage.getTextBody());
                        push.sendInBackground();

                    }
                }
            }
        });
    }

    @Override
    public void onMessageDelivered(MessageClient client, MessageDeliveryInfo deliveryInfo) {
            Toast.makeText(getApplicationContext(),"delivered",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onShouldSendPushData(MessageClient client, Message message,    List<PushPair> pushPairs) {}
}

}

推荐答案

您可以添加一个新列到你的数据库,用于跟踪,如果对话有未读邮件。每当有新邮件到达您标记对话为未读或该列设置为true悬而未决。
当您生成列表,让你的适配器检查此列,并更新生成的列表视图,如果对话有未读邮件。
当用户打开对话,更新列到假

You can add a new column to your database that keeps track if the conversation has unread messages. Whenever a new message arrives you mark the conversation as unread or pending by setting this column to true. When you build the list, make your adapter check this column and update the generated listview if the conversation has unread messages. When the user opens the conversation, update the column to false.

首先,我建议你使用一个ListView与CursorLoader:
http://developer.android.com/guide/topics/ui/layout /listview.html

First I suggest you use a ListView with a CursorLoader: http://developer.android.com/guide/topics/ui/layout/listview.html

每当你的内容提供商的变化,您的适配器将被通报。当通过游标建设每个项目视图循环,检查所需的列。如果设置,可以设置你喜欢上查看任何表明它是未读。

Whenever your content provider changes, your adapter will be notified. When it is looping through the cursor building each list item View, you check the desired column. If it is set, you set whatever you like on that View to indicate it is unread.

这篇关于在Android的聊天应用程序的用户列表视图中的新邮件通知的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆