自己做Android开发有一段时间了,但是很少分享一些东西。最近公司组织分享会,感觉也有必要记录一些东西,给一些遇到同样问题的新手一些提示,让他们少走一些弯路。
由于经验有限,或许分享的内容中存在错误,欢迎大家指正!
首先感谢一下两篇文章的作者:(有些东西直接从他们那边摘抄了)
1.点击打开链接
2.点击打开链接
1.Android推送基础知识:
在移动互联网时代以前的手机,如果有事情发生需要通知用户,则会有一个窗口弹出,将告诉用户正在发生什么事情。可能是未接电话的提示,日历的提醒,或是一封新的彩信。推送功能最早是被用于Email中,用来提示我们新的信息。由于时代的发展和移动互联网的热潮,推送功能更加地普及,已经不再仅仅用在推送邮件了,更多地用在我们的APP中了。
当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如《地震应急通》就需要及时获取服务器上最新的地震信息。要获取服务器上不定时更新的信息,一般来说有两种方法:第一种是客户端使用Pull(拉)的方式,就是隔一段时间就去服务器上获取一下信息,看是否有更新的信息出现。第二种就是服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。这样,客户端就能自动的接收到消息。
虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push方式比Pull方式更优越。因为Pull方式更费客户端的网络流量,更主要的是费电量,还需要我们的程序不停地去监测服务端的变化。
在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息。我们只需要在Android或IPhone的通知栏处向下一拉,就展开了Notification Panel,可以集中一览各种各样通知消息。
2.Android推送几种常见的方式:
1)轮询(Pull)方式:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。
2)SMS(Push)方式:在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,我们需要向移动公司缴纳相应的费用。我们目前很难找到免费的短消息发送网关来实现这种方案。
3)持久连接(Push)方式:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电量。
3.Android推送几种常见的解决方案:
(具体可参考:点击打开链接)
1)C2DM云端推送功能。
2)MQTT协议实现Android推送功能。
3)RSMB实现推送功能。
4)XMPP协议实现Android推送功能。
5)使用第三方平台。
4.第三方推送:(主要介绍个推)
现在的第三方推送主要有:个推、极光推送、百度云推送以及谷歌的GCM(Google Cloud Messaging)等。
集成步骤:
(申请账号等不走省略了,那个比较容易,该填什么就填什么,这里就不说明了)
1). Maven集成(推荐)点击打开链接
2). 通过服务端推送(这里的客户端按照上面的配置即可,无需做特别的配置)
3). 通过服务端推送并跳转到指定页面
个推要跳转到指定的页面需自定义一个通知栏(或者是你需要显示一个与个推提供的样式不一样的也需要自定义),服务端通过透传消息发送,客户 端接收,并进行一些处理。自定义通知栏具体代码如下:
@SuppressLint("NewApi")
private void showNotification(String title, String content,Class Cls) {
nm = (NotificationManager) mContext
.getSystemService(Context.NOTIFICATION_SERVICE);
notice = new Notification();
notice.flags = Notification.FLAG_AUTO_CANCEL;
notice.icon = R.drawable.ic_launcher;
notice.tickerText = "新消息";
notice.defaults|=Notification.DEFAULT_VIBRATE;//震动
notice.defaults|=Notification.DEFAULT_SOUND;//声音
Intent intent = new Intent(mContext, Cls);
pIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
if (android.os.Build.VERSION.SDK_INT >= 11) {
notice.largeIcon = BitmapFactory.decodeResource(
mContext.getResources(), R.drawable.ic_launcher);
}
notice.when = System.currentTimeMillis();
notice.contentView = new RemoteViews(mContext.getPackageName(), R.layout.notify);
notice.contentIntent = pIntent;
notice.contentView.setTextViewText(R.id.tv_notify_text, title);
notice.contentView.setTextViewText(R.id.tv_notify_sub_text, content);
nm.notify(UPDATENOTICENUMBER, notice);
}
更多自定义通知栏可以参考这篇文章,写得挺详细了
点击打开链接
Demo下载