现在的位置: 首页 > 综合 > 正文

android-pushNotification-消息推送-学习笔记

2013年12月05日 ⁄ 综合 ⁄ 共 6026字 ⁄ 字号 评论关闭

文介绍AndroidPn项目实现推送的使用过程。

 

上个博文中提到在Android中实现信息推送,其中一个比较成熟的解决方案便是使用XMPP协议实现。而AndroidPn项目就是使用XMPP协议实现信息推送的一个开源项目。在这里给大家介绍其使用过程。

 

Apndroid Push Notification的特点: 

快速集成:提供一种比C2DM更加快捷的使用方式,避免各种限制.  

无需架设服务器:通过使用"云服务",减少额外服务器负担.

可以同时推送消息到网站页面,android 手机

耗电少,占用流量少.

 

具体配置过程: 

首先, 我们需要下载androidpn-client-0.5.0.zip和androidpn-server-0.5.0-bin.zip。

下载地址:http://sourceforge.net/projects/androidpn/ 

推荐 修改之后的JAR 和源码下载: http://download.csdn.net/detail/wuhualong1314/4639394

解压两个包,Eclipse导入client,配置好目标平台,打开raw/androidpn.properties文件,配置客户端程序。

 

1. 如果是模拟器来运行客户端程序,把xmppHost配置成10.0.2.2[模拟器把10.0.2.2认为是所在主机的地址,127.0.0.1是模拟器本身的回环地址,10.0.2.1表示网关地址,10.0.2.3表示DNS地址,10.0.2.15表示目标设备的网络地址],关于模拟器的详细信息,大家可参阅相关资料,这里不再详述.

xmppPort=5222 是服务器的xmpp服务监听端口

 

运行androidpn-server-0.5.0\bin\run.bat启动服务器,从浏览器访问http://127.0.0.1:7070/index.do (androidPN Server有个轻量级的web服务器,在7070端口监听请求,接受用户输入的文本消息)

 

运行客户端,客户端会向服务器发起连接请求,注册成功后,服务器能识别客户端,并维护和客户端的IP长连接。

 

2. 如果是在同一个局域网内的其他机器的模拟器测试(或者使用同一无线路由器wifi上网的真机) ,则需要把这个值设置为服务器机器的局域网ip.  

例如 你的电脑和android手机 都通过同一个无线路由器wifi上网, 电脑的ip地址为 192.168.1.2 而 手机的ip地址为 192.168.1.3, 这个时候 需要把这个值修改为 xmppHost=192.168.1.1 或是电脑的IP地址,就可以在手机上使用了. 

 

3. 如果是不在同一个局域网的真机测试,我们需要将这个值设置为服务器的IP地址。 

 

具体配置如下图所示:

 

 

我的电脑IP是:192.168.8.107 

相关的配置可以查看 服务器的config.properties,和spring-config.xml

  1. config.properties  
  2.   
  3. apiKey=1234567890  
  4. admin.console.host=127.0.0.1  
  5. admin.console.port=7070  
  6. xmpp.ssl.storeType=JKS  
  7. xmpp.ssl.keystore=conf/security/keystore  
  8. xmpp.ssl.keypass=changeit  
  9. xmpp.ssl.truststore=conf/security/truststore  
  10. xmpp.ssl.trustpass=changeit  


  1. spring-config.xml  
  2.   
  3.   
  4. <bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"  
  5.         init-method="bind" destroy-method="unbind">  
  6.         <property name="defaultLocalAddress" value=":5222" />  
  7.         <property name="handler" ref="xmppHandler" />  
  8.         <property name="filterChainBuilder" ref="filterChainBuilder" />  
  9.         <property name="reuseAddress" value="true" />  
  10.     </bean>  


至于客户端的用户名和密码,那个是自动生成的,可以不管,源码查看。org.androidpn.client.XmppManager

 /**
     * A runnable task to register a new user onto the server. 
     */
    private class RegisterTask implements Runnable {

        final XmppManager xmppManager;

        private RegisterTask() {
            xmppManager = XmppManager.this;
        }

        public void run() {
            Log.i(LOGTAG, "RegisterTask.run()...");

            if (!xmppManager.isRegistered()) {
                final String newUsername = newRandomUUID();
                final String newPassword = newRandomUUID();

                Registration registration = new Registration();

                PacketFilter packetFilter = new AndFilter(new PacketIDFilter(
                        registration.getPacketID()), new PacketTypeFilter(
                        IQ.class));

                PacketListener packetListener = new PacketListener() {

                    public void processPacket(Packet packet) {
                        Log.d("RegisterTask.PacketListener",
                                "processPacket().....");
                        Log.d("RegisterTask.PacketListener", "packet="
                                + packet.toXML());

                        if (packet instanceof IQ) {
                            IQ response = (IQ) packet;
                            if (response.getType() == IQ.Type.ERROR) {
                                if (!response.getError().toString().contains(
                                        "409")) {
                                    Log.e(LOGTAG,
                                            "Unknown error while registering XMPP account! "
                                                    + response.getError()
                                                            .getCondition());
                                }
                            } else if (response.getType() == IQ.Type.RESULT) {
                                xmppManager.setUsername(newUsername);
                                xmppManager.setPassword(newPassword);
                                Log.d(LOGTAG, "username=" + newUsername);
                                Log.d(LOGTAG, "password=" + newPassword);

                                Editor editor = sharedPrefs.edit();
                                editor.putString(Constants.XMPP_USERNAME,
                                        newUsername);
                                editor.putString(Constants.XMPP_PASSWORD,
                                        newPassword);

                                editor.commit();
                                Log
                                        .i(LOGTAG,
                                                "Account registered successfully");
                                xmppManager.runTask();
                            }
                        }
                    }
                };

                connection.addPacketListener(packetListener, packetFilter);

                registration.setType(IQ.Type.SET);
                // registration.setTo(xmppHost);
                // Map<String, String> attributes = new HashMap<String, String>();
                // attributes.put("username", rUsername);
                // attributes.put("password", rPassword);
                // registration.setAttributes(attributes);
                registration.addAttribute("username", newUsername);
                registration.addAttribute("password", newPassword);
                connection.sendPacket(registration);

            } else {
                Log.i(LOGTAG, "Account registered already");
                xmppManager.runTask();
            }
        }
    }

如果想使用登录的用户名和密码 使用如下代码

  1. //保存到推送的用户名  
  2.         SharedPreferences sharedPrefs = getSharedPreferences(Constants.SHARED_PREFERENCE_NAME,  
  3.                 Context.MODE_PRIVATE);  
  4.         Editor editorsharedPrefs.edit();  
  5.         editor.putString(Constants.XMPP_USERNAME, "wuhualong1314");  
  6.         editor.putString(Constants.XMPP_PASSWORD, "pass");  
  7.         editor.commit();  

并且修改 RegisterTask 

  1. if (!xmppManager.isRegistered()) {  
  2.                 /*final String newUsername = newRandomUUID();  
  3.                 final String newPassword = newRandomUUID();*/  
  4.                 final String newUsername = username;  
  5.                 final String newPassword = password;  




服务器运行主界面:

 

 

 

 

 

推送信息: 

 

测试结果如下图: 

 

 

 

这里查看的通知消息 只是客户端自带的一个查看的activity .org.androidpn.client.Notifier

  1.   Intent intent = new Intent(context,  
  2.                     NotificationDetailsActivity.class);  
  3.             intent.putExtra(Constants.NOTIFICATION_ID, notificationId);  
  4.             intent.putExtra(Constants.NOTIFICATION_API_KEY, apiKey);  
  5.             intent.putExtra(Constants.NOTIFICATION_TITLE, title);  
  6.             intent.putExtra(Constants.NOTIFICATION_MESSAGE, message);  
  7.             intent.putExtra(Constants.NOTIFICATION_URI, uri);  
  8.             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  9.             intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);  
  10.             intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);  

抱歉!评论已关闭.