1 首界面Login判断是否连接,如连接直接跳转到ContactList,没有连接的话判断是否配置过,若没有配置过则进入Account.java创建新账户或者使用帐号登录
首界面启动后 通过调用BeemApplication中的如下代码获得登录帐号
mSettings = PreferenceManager.getDefaultSharedPreferences(this);
String login = mSettings.getString(BeemApplication.ACCOUNT_USERNAME_KEY, "");
String password = mSettings.getString(BeemApplication.ACCOUNT_PASSWORD_KEY, "");
如果使用帐号登录,则在AccountConfigure中使用如下代码保存登录信息
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor edit = settings.edit();
edit.putString(BeemApplication.ACCOUNT_USERNAME_KEY, mAccountJID.getText().toString());
edit.putString(BeemApplication.ACCOUNT_PASSWORD_KEY, mAccountPassword.getText().toString());
2 首界面的onStart函数中执行LoginAnim实现登录,登录后进入ContactList
3 在ContactList中点击某个用户后进入Chat.java界面。实现聊天。
4 在Chat.java界面中的sendMessage()函数通过调用接口IChat中的sendMessage函数实现发送消息给其他用户
5 在Chat.java界面中的重载的processMessage函数实现对接收的消息的处理。
关于接收消息,通过注册继承自IMessageListener.Stub 的OnMessageListener实现。而Stub 继承自android.os.Binder,通过重载onTransact函数通过判断消息码,若是TRANSACTION_processMessage消息则接收消息,并通过processMessage函数实现消息的处理。
在onTransact函数中( onTransact的函数定义为Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException) 中,若是TRANSACTION_processMessage消息, 则通过如下代码实现获得消息
com.beem.project.beem.service.Message _arg1;
if ((0!=data.readInt())) {
_arg1 = com.beem.project.beem.service.Message.CREATOR.createFromParcel(data);
}
_arg1 就是接收到的消息。data是接收到的系统数据
下面是Stub 中函数processMessage的说明
/**
* This method is executed when a chat receive a message.
* @param chat the chat receiving the message.
* @param msg the message received in the chat.
*/
public void processMessage(com.beem.project.beem.service.aidl.IChat chat, com.beem.project.beem.service.Message msg) throws android.os.RemoteException
onTransact函数是android.os.Binder的一个请求分发函数。而android的binder机制则提供了一种进程间通信的方法。
另外可参见http://www.docin.com/p-386955447.html(android内核剖析,讲解了 Binder、aidl等等),有本书叫《android内核剖析》。了解更多。