在Android的聊天应用程序的用户列表视图中的新邮件通知 [英] New message notification in list view of users in android chat application
问题描述
您好我正在开发使用解析为后端和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屋!