文介绍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表示目标设备的网络地址],关于模拟器的详细信息,大家可参阅相关资料,这里不再详述.
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
- config.properties
- apiKey=1234567890
- admin.console.host=127.0.0.1
- admin.console.port=7070
- xmpp.ssl.storeType=JKS
- xmpp.ssl.keystore=conf/security/keystore
- xmpp.ssl.keypass=changeit
- xmpp.ssl.truststore=conf/security/truststore
- xmpp.ssl.trustpass=changeit
- spring-config.xml
- <bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
- init-method="bind" destroy-method="unbind">
- <property name="defaultLocalAddress" value=":5222" />
- <property name="handler" ref="xmppHandler" />
- <property name="filterChainBuilder" ref="filterChainBuilder" />
- <property name="reuseAddress" value="true" />
- </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();
}
}
}
如果想使用登录的用户名和密码 使用如下代码
- //保存到推送的用户名
- SharedPreferences sharedPrefs = getSharedPreferences(Constants.SHARED_PREFERENCE_NAME,
- Context.MODE_PRIVATE);
- Editor editor= sharedPrefs.edit();
- editor.putString(Constants.XMPP_USERNAME, "wuhualong1314");
- editor.putString(Constants.XMPP_PASSWORD, "pass");
- editor.commit();
并且修改 RegisterTask
- if (!xmppManager.isRegistered()) {
- /*final String newUsername = newRandomUUID();
- final String newPassword = newRandomUUID();*/
- final String newUsername = username;
- final String newPassword = password;
服务器运行主界面:
推送信息:
测试结果如下图:
这里查看的通知消息 只是客户端自带的一个查看的activity .org.androidpn.client.Notifier
- Intent intent = new Intent(context,
- NotificationDetailsActivity.class);
- intent.putExtra(Constants.NOTIFICATION_ID, notificationId);
- intent.putExtra(Constants.NOTIFICATION_API_KEY, apiKey);
- intent.putExtra(Constants.NOTIFICATION_TITLE, title);
- intent.putExtra(Constants.NOTIFICATION_MESSAGE, message);
- intent.putExtra(Constants.NOTIFICATION_URI, uri);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);