转载:http://blog.sina.com.cn/s/blog_70083ca10100u2yt.html
前一段时间为了锻炼自己的能力和熟悉Android平台的开发,自己写了一个简单的即时通讯软件,在此和同学分享一下自己所设计的软件框架和开发过程中一些小问题的解决方法。
为了简化模型,我们采用服务器客户端的模式进行开发,所有信息通过服务器进行转发。自然我们需要一个服务器,与客户端通过网络连接,存储账号信息,转发信息和客户的在线状态。本文中具体介绍客户端编写时候遇到的问题,服务器不做过多讨论。
我们知道在Android系统中有Activity和Service这样的运行实体,Activity主要为用户进行信息的展示,而Service一般是后台服务长期运行。根据客户需要和对现有即时通讯软件的分析,我们做了4个Activity用来展示和采集用户所需要的信息,分别用户登录Logon、用户注册register、在线列表Main和聊天界面Talk;然后在后台有一个服务Service来和服务器进行通讯,并和Activity进行信息交互来完成所需信息的展示。
这样的话,我们便存在一个后台服务Service随时在监听服务器那边传来的信息并维护自身的在线状态,即便用户在使用别的应用,收到的信息也可以通过notification在手机的状态栏中及时进行显示,客户端与服务器之间进行通讯的所有复杂协议全部都封装到Service内部,外部透明也便于修改。用户在使用即时通讯这个应用时候,每次打开的Activity均与Service之间进行连接,获取现在的状态与所需的信息进行处理。
因此我们必须处理Activity与Service之间的信息传递。
在这里,为了方便对进程间信息的处理,我们使用Message来对通信的内容进行封装,使用Messenger来对Message进行消息的处理,因此我们在每一个Service和Activity中都需要创建自己所需要的Messenger对象。可以在Handler的继承匿名类中添加多特定消息的处理程序,然后使用Messenger
我们使用Main作为这个应用需要展开的第一个Activity,在恰当的时候可以使用StartService()和bindService()方法分别开启服务并和服务进行信道链接。在链接建立之后便可以通过Message进行通信,根据是否已经登录的信息来判断是否要转到Logon的Activity。
在Service中,有一个方法必须被重写,那便是用来和Activity进行链接的一个重要方法public
在Activity中使用bindService()方法后,Activity便会在恰当的时候主动和Service建立链接并通过调用onBind()将IBinder对象返回给试图建立链接的Activity。在Activity中需要建立一个ServiceConnection的对象来对返回的信息进行处理,此对象必须重写此类中的public
这样我们便可以在Activity和Service中建立一个信道来进行通信,Message类中可以放大量的数据,具体的使用可以参考其他有关的书籍。
在此,我们介绍了一个简化的即时通讯软件的构架模型,并讨论了Activity和Service之间使用Message和Messenger建立通信信道并进行进程间通信的过程,希望能够帮助大家理解,具体的使用可以参考android的开发手册http://developer.android.com/reference/android/app/Service.html#RemoteMessengerServiceSa