极光推送官网是否接受自动推送服务?

前面我们已经实现了通过我们自己的服务器生成消息向极光消息推送服务器发送推送消息的功能,下面我们来看看如何在手机客户端实现消息接收。
一、在极光上建立一个测试项目
如上图所示,下载Android Example
运行效果如图
下面我们通过源代码先看看上面的四行显示TextView的获取。
TextView mAppKey = (TextView) findViewById(R.id.tv_appkey);
String appKey = ExampleUtil.getAppKey(getApplicationContext());
if (null == appKey) appKey = &AppKey异常&;
mAppKey.setText(&AppKey: & + appKey);向下追踪,查看getAppKey方法
// 取得AppKey
public static String getAppKey(Context context) {
Bundle metaData =
String appKey =
ApplicationInfo ai = context.getPackageManager().getApplicationInfo(
context.getPackageName(), PackageManager.GET_META_DATA);
if (null != ai)
metaData = ai.metaD
if (null != metaData) {
appKey = metaData.getString(KEY_APP_KEY);
if ((null == appKey) || appKey.length() != 24) {
} catch (NameNotFoundException e) {
return appK
}我们可以看到首先通过Context类的getPackageManager()方法获取相关信息。
打开Android源代码可以看到Context实际上是一个抽象类,它的实现类是ContextImpl,类之间的关系如图
有关Context类的介绍请看:http://blog.csdn.net/qinjuning/article/details/7310620
打开ContextImpl类可以看到getPackageManager的实现
public PackageManager getPackageManager() {
if (mPackageManager != null) {
return mPackageM
IPackageManager pm = ActivityThread.getPackageManager();
if (pm != null) {
// Doesn't matter if we make more than one instance.
return (mPackageManager = new ApplicationPackageManager(this, pm));
}上面的ActivityThread才是一个android应用的真正入口,可以在该类中查到main函数。
public static final void main(String[] args) {
SamplingProfilerIntegration.start();
Process.setArgV0(&&pre-initialized&&);
Looper.prepareMainLooper();
if (sMainThreadHandler == null) {
sMainThreadHandler = new Handler();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, &ActivityThread&));
Looper.loop();
if (Process.supportsProcesses()) {
throw new RuntimeException(&Main thread loop unexpectedly exited&);
thread.detach();
String name = (thread.mInitialApplication != null)
? thread.mInitialApplication.getPackageName()
: &&unknown&&;
Slog.i(TAG, &Main thread of & + name + & is now exiting&);
有关PackageManager部分的详细介绍请看:http://blog.csdn.net/stonecao/article/details/6591454
我们现在先不关心怎么获取PackageManager,先来看看PackageManager能干什么
PackageManager类是对所有基于加载信息的数据结构的封装,包括以下功能:
安装,卸载应用查询permission相关信息
查询Application相关信息(application,activity,receiver,service,provider及相应属性等)
查询已安装应用
增加,删除permission
清除用户数据、缓存,代码段等
通过获取ApplicationInfo得到PackageItemInfo类中的Bundle内部类对象
PackageIteminfo类是AndroidManifest.xml文件中所有节点的基类,提供了这些节点的基本信息
在manifest文件中可以看到如下两行代码
&!-- Required
. Enable it you can get statistics data with channel --&
&meta-data android:name=&JPUSH_CHANNEL& android:value=&developer-default&/&
&meta-data android:name=&JPUSH_APPKEY& android:value=&5d30bebd186& /& &!--
&/&值来自开发者平台取得的AppKey--&再看到ExampleUtil中的如下代码应该恍然开朗了吧
public static final String KEY_APP_KEY = &JPUSH_APPKEY&;
好啦,下面我们将服务器端推送消息方法改成如下:
MessageResult msgResult = jpush.sendNotificationWithAppKey(sendNo, msgTitle, msgContent);全部代码:
package com.meritit.tuisong.
import java.util.HashM
import java.util.M
import cn.jpush.api.ErrorCodeE
import cn.jpush.api.IOSE
import cn.jpush.api.JPushC
import cn.jpush.api.MessageR
public class JPushClientExample {
private static final String appKey =&5d30bebd5486&; //必填,例如466ffb7bda89
private static final String masterSecret = &0e0cc80c6f6a4703bec9ed19&;//&13ac09b1d8a1&;//必填,每个应用都对应一个masterSecret
private static JPushClient jpush =
* 保存离线的时长。秒为单位。最多支持10天(864000秒)。
* 0 表示该消息不保存离线。即:用户在线马上发出,当前不在线用户将不会收到此消息。
* 此参数不设置则表示默认,默认为保存1天的离线消息(86400秒)。
private static long timeToLive =
60 * 60 * 24;
public static void main(String[] args) {
* Example1: 初始化,默认发送给android和ios,同时设置离线消息存活时间
* jpush = new JPushClient(masterSecret, appKey, timeToLive);
* Example2: 只发送给android
* jpush = new JPushClient(masterSecret, appKey, DeviceEnum.Android);
* Example3: 只发送给IOS
* jpush = new JPushClient(masterSecret, appKey, DeviceEnum.IOS);
* Example4: 只发送给android,同时设置离线消息存活时间
* jpush = new JPushClient(masterSecret, appKey, timeToLive, DeviceEnum.Android);
jpush = new JPushClient(masterSecret, appKey, timeToLive);
* 是否启用ssl安全连接, 可选
* 参数:启用true, 禁用false,默认为非ssl连接
//jpush.setEnableSSL(true);
//测试发送消息或者通知
testSend();
private static void testSend() {
// 在实际业务中,建议 sendNo 是一个你自己的业务可以处理的一个自增数字。
// 除非需要覆盖,请确保不要重复使用。详情请参考 API 文档相关说明。
int sendNo = getRandomSendNo();
String msgTitle = &+;//jpush\&\&&;
String msgContent = &\\&;w\&\&a--【\npush】&;
* IOS设备扩展参数,
* 设置badge,设置声音
Map&String, Object& extra = new HashMap&String, Object&();
IOSExtra iosExtra = new IOSExtra(10, &WindowsLogonSound.wav&);
extra.put(&ios&, iosExtra);
//对所有用户发送通知, 更多方法请参考文档
MessageResult msgResult = jpush.sendNotificationWithAppKey(sendNo, msgTitle, msgContent);
//MessageResult msgResult = jpush.sendCustomMessageWithAppKey(sendNo,msgTitle, msgContent);
//MessageResult msgResult
= jpush.sendNotificationWithAlias(sendNo, &a&, msgTitle, msgContent);
//覆盖指定msgId的消息,msgId可以从msgResult.getMsgid()获取。
//MessageResult msgResult = jpush.sendNotificationWithAppKey(sendNo, msgTitle, msgContent, 0, extra,msgResult.getMsgid());
if (null != msgResult) {
System.out.println(&服务器返回数据: & + msgResult.toString());
if (msgResult.getErrcode() == ErrorCodeEnum.NOERROR.value()) {
System.out.println(String.format(&发送成功, sendNo= %s,messageId= %s&,msgResult.getSendno(),msgResult.getMsg_id()));
System.out.println(&发送失败, 错误代码=& + msgResult.getErrcode() + &, 错误消息=& + msgResult.getErrmsg());
System.out.println(&无法获取数据&);
public static final int MAX = Integer.MAX_VALUE;
public static final int MIN = (int) MAX/2;
* 保持 sendNo 的唯一性是有必要的
* It is very important to keep sendNo unique.
* @return sendNo
public static int getRandomSendNo() {
return (int) (MIN + Math.random() * (MAX - MIN));
运行结果:
这样就可以实现通过自己的服务器来自动生成消息内容了。
demo下载:http://download.csdn.net/detail/lxq_xsyu/6909577
&此文从网络中自动搜索生成,不代表本网站赞成被搜索网站的内容或立场
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&
软件世界网- &2014 蜀ICP备号 三峰网旗下网站的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.003 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益58cv网址导航有没有做过极光推送(JPUSH)的?
[问题点数:40分,结帖人fengzhileiyi]
有没有做过极光推送(JPUSH)的?
[问题点数:40分,结帖人fengzhileiyi]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2014年11月 .NET技术大版内专家分月排行榜第二2014年5月 .NET技术大版内专家分月排行榜第二2014年4月 .NET技术大版内专家分月排行榜第二2012年2月 多媒体/设计/Flash/Silverlight 开发大版内专家分月排行榜第二
2014年12月 .NET技术大版内专家分月排行榜第三2014年10月 .NET技术大版内专家分月排行榜第三2014年9月 .NET技术大版内专家分月排行榜第三2014年1月 .NET技术大版内专家分月排行榜第三2013年12月 .NET技术大版内专家分月排行榜第三2013年10月 .NET技术大版内专家分月排行榜第三2013年5月 .NET技术大版内专家分月排行榜第三2011年9月 .NET技术大版内专家分月排行榜第三2011年2月 .NET技术大版内专家分月排行榜第三2010年2月 .NET技术大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。Android开发记录18-集成推送服务的一点说明
关于推送服务,国内有很多选择,笔者也对它们进行了一个详细的对比,一般我们产品选择推送服务主要考量以下几个要素: 1、是否收费,如何收费? 2、推送内容是是什么(是否包含通知、消息、富媒体等等) 3、稳定性、及时性如何? 4、集成难度是否简单 5、支持平台有哪些(主流Android、IOS) 6、服务端支持语言(Java、C#、PHP、Python等)下面笔者例举国内主要的一些推送服务: 来自Devstore的统计,共收录了国内21家推送服务,分别是(按关注度排列):1.个推(个信互动(北京)网络科技有限公司)2.百度云推送(百度)3.极光推送(深圳市和讯华谷信息技术有限公司)4.友盟推送(友盟)5.小米推送(小米)6.腾讯信鸽推送(腾讯公司)7.Bmob推送(广州市比目网络科技有限公司)8.云巴推送(深圳市微智云科技有限公司)9.华为推送(华为公司)10.智游推送(北京智游网安科技有限公司)11.盛大云推送(盛大网络)12.原子推送(原子技术有限公司)13.魔桥推送(魔桥)14.魔泊网推送(魔泊网)15.有推推送(中国移动通信)16.WeCloud(WeCloud )17.Learn Cloud推送(美味书签信息技术有限公司)18.亚马逊推送(亚马逊公司)19.魔方推送(魔方公司)20.语盒团推送(语盒团公司)21.移动消息推送开发者可以针对产品的需求,来对比选择适合自己应用的推送服务。笔者这里选择了“极光推送”,它是部分收费的,收费模式各位可以到官网查看;支持推送的内容有通知、消息、富媒体,稳定性好、能及时到达、提供服务API、支持Android、iOS平台,服务端支持Java、PHP、Python、C#、Ruby、Node.js。集成极光推送笔者这里也不详细写,主要提几点:1、使用Portal来进行测试 Portal是服务提供的传送门,我们可以使用控制台来进行推送测试,实际应用时一般是根据推送服务提供的服务端API来实现定制推送。极光Portal如下: 2、通知与消息的区别通知就是可以再通知栏显示提醒用户的信息,而消息不会在通知栏显示,业务逻辑可以完全有开发者来定。3、推送对象可以分为: 广播:会把通知无区别的推送到每个人身上。设置标签:这一般用于群组推送。设置别名:适用于单播,根据客户端设置的别名来推送。设置注册ID:适用于单播推送,指定推送给某一个人,可以使注册过的用户ID,主要用来区分。4、自定义通知栏样式、附加字段的作用我们有时候可能不想直接用Android原生的通知栏样式,如果服务提供相应的API的话,我们可以通过自定义布局来达到这个目的。极光这里提供了以下方法: // 自定义Notification样式
CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(
getApplicationContext(),
R.layout.customer_notitfication_layout, R.id.icon, R.id.title,
R.id.text);
builder.layoutIconDrawable = R.drawable.ic_
builder.developerArg0 = &developerArg2&;
JPushInterface.setPushNotificationBuilder(2, builder);
Toast.makeText(getApplicationContext(), &Custom Builder - 2&,
Toast.LENGTH_SHORT).show();我们只需要指定通知栏编号,下次推送通知的时候就会以自定义的通知栏样式来显示。这里还有一个附加字段,我们有时候可能需要根据推送的不同消息来实现跳转不同的页面,这时候就可能需要用到附加字段了,我们在Broadcast Receiver来接受推送下来的消息,解析附加字段内容,来达到我们的目的。代码示例:package com.infzm.daily.know.
import org.json.JSONE
import org.json.JSONO
import android.content.BroadcastR
import android.content.C
import android.content.I
import android.os.B
import cn.jpush.android.api.JPushI
import com.infzm.daily.know.ArticleDetailA
import com.infzm.daily.know.MainA
import com.infzm.daily.know.utils.LogU
public class PushReceiver extends BroadcastReceiver {
private static final String TAG = &JPush&;
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
LogUtils.logi(TAG, &[PushReceiver] onReceive - & + intent.getAction() + &, extras: &+ printBundle(bundle));
if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
LogUtils.logi(TAG, &[PushReceiver] 接收Registeration Id : & + regId);
} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
LogUtils.logi(TAG, &[PushReceiver] 接收到推送下来的自定义消息: & + bundle.getString(JPushInterface.EXTRA_MESSAGE));
}else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
LogUtils.logi(TAG, &[PushReceiver] 接收到推送下来的通知&);
int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
LogUtils.logi(TAG, &[PushReceiver] 接收到推送下来的通知的ID: & + notifactionId);
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
LogUtils.logi(TAG, &[PushReceiver] 用户点击打开了通知&);
String type = bundle.getString(JPushInterface.EXTRA_EXTRA);
LogUtils.loge(TAG, &type:& + type);
JSONObject jsonObject = new JSONObject(type);
String str = jsonObject.getString(&key&);
if (str.equals(&1&)) {
//打开自定义的Activity
Intent i = new Intent(context, MainActivity.class);
bundle.putInt(&index&, 1);
i.putExtras(bundle);
//i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
context.startActivity(i);
} catch (JSONException e) {
e.printStackTrace();
} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
LogUtils.logi(TAG, &[PushReceiver] 用户收到到RICH PUSH CALLBACK: & + bundle.getString(JPushInterface.EXTRA_EXTRA));
//在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等..
} else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
LogUtils.logi(TAG, &[PushReceiver]& + intent.getAction() +& connected state change to &+connected);
LogUtils.logi(TAG, &[PushReceiver] Unhandled intent - & + intent.getAction());
// 打印所有的 intent extra 数据
private static String printBundle(Bundle bundle) {
StringBuilder sb = new StringBuilder();
for (String key : bundle.keySet()) {
if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
sb.append(&\nkey:& + key + &, value:& + bundle.getInt(key));
}else if(key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)){
sb.append(&\nkey:& + key + &, value:& + bundle.getBoolean(key));
sb.append(&\nkey:& + key + &, value:& + bundle.getString(key));
return sb.toString();
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1071538次
积分:17024
积分:17024
排名:第177名
原创:551篇
转载:81篇
评论:1322条
阅读:28307
阅读:17321
文章:12篇
阅读:28368
文章:11篇
阅读:43455
文章:10篇
阅读:30892
文章:13篇
阅读:14213
文章:13篇
阅读:122999
(5)(5)(6)(7)(2)(13)(11)(11)(8)(14)(10)(16)(8)(15)(23)(13)(12)(12)(11)(17)(28)(18)(20)(8)(11)(20)(13)(14)(10)(23)(18)(15)(36)(27)(47)(16)(3)(28)(33)(14)(13)
从入门到成长到成熟再到优秀,大多数程序员走了前面一段相似的道路,而有些人却走得更远一些!!!!

我要回帖

更多关于 极光推 的文章

 

随机推荐