码迷,mamicode.com
首页 > 移动开发 > 详细

android集成极光消息推送

时间:2015-09-02 13:44:48      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:

 
    推送功能现在在app中已是成常用的功能,而要实现推送功能,为了省时省力一般考虑采用第三方推送sdk来实现,这里总结是极光推送(JPush)这也是本人在项目中经常用到的第三方推送sdk , 总的来说集成起来挺简单的,只要按照官方的文档一步步集成还是能够完成,本人第一次集成的时候也是这样干的,其实其它的第三方sdk一般都是根据官方的文档文档一步步集成的,但对于一些从来没有用过极光推送或是刚开始的人来说,总会有这样的那样的问题,会走一些弯路,会躺过一些坑,现在将以前的集成经验进行流程化,再此做些记录,便于以后自己集成时候参照,同时也希望能够为其他需要的提供一些帮助。
 
1:前期的准备工作及注意点:
官网创建应用,生成appkey  ,这是现在的第三方的sdk通用的准备工作,一般需要填写程序的包名(有些还需要程序的签名,如微信开放平台),这个包名一般都是一旦指定就不可更改。如果需要更改一般只能重新创建应用了,这时候的appkey就与之前不一样了,程序中也需要相应的修改。
技术分享 
然后按照官方的android sdk集成指南进行集成就可以了。
 
注意几点:
1 导包;导包完成后的目录结构应该是:
 
 
技术分享 
技术分享 
 
2.注意权限配置:
技术分享 
配置两个都需要,而且这两个配置很相似,容易大意出错(本人和同事曾在这里坑过)
 
3.注意查看Log日志,和错误信息: 
1:打开极光的日志,JPushInterface.setDebugMode(true); // 设置开启日志,发布时请关闭日志
2:通过JPush tag进行日志过滤
技术分享 
 
 
 
另外遇到问题可以查阅官方文档中 androi常见问题 中对常见问题的解决方法。
 
根据在邻里,新东方项目的集成经验现总结如下:
主要是参考JPush官方文档。
1.集成前的准备工作
a.在极光官网注册开发者账号。
b.登录后创建应用,查看应用详情,获得AppKey如图:
技术分享
c.点击图中的绿色按钮,下载Android Example,即官方Demo
以上步骤可以根据文档。3分钟Demo指导完成。
技术分享
2.在自己的项目中集成。
这是可以根据之前下载的官方demo进行快速集成。
解压下载的官方demo压缩文件,打开可以看到如下目录结构:
技术分享
在自己的项目中需要集成以下几部分。
1.jar包,导入 SDK 开发包到你自己的应用程序项目
这里只需将libs目录下的所有文件拷贝到我们工程目录下的libs下即可。
技术分享
2.配置 AndroidManifest.xml
打开dmeo的AndroidManifest.xml文件。
拷贝下面代码到自己项目的AndroidManifes.xml文件中
注意将其中的 "您应用的包名: 修改为自己的程序包名
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="您应用的包名"   
  4.     android:versionCode="180"
  5.     android:versionName="1.8.0"
  6.     >
  7.     <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="17"/>
  8.     <!--Required自定义用来收发消息的相关权限-->               
  9.     <permission
  10.         android:name="您应用的包名.permission.JPUSH_MESSAGE"
  11.         android:protectionLevel="signature"/>
  12.   
  13.     <!--Required  一些系统要求的权限,如访问网络等-->
  14.     <uses-permission android:name="您应用的包名.permission.JPUSH_MESSAGE"/>
  15.     <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
  16.     <uses-permission android:name="android.permission.INTERNET"/>
  17.     <uses-permission android:name="android.permission.WAKE_LOCK"/>
  18.     <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  19.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  20.     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  21.     <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
  22.     <uses-permission android:name="android.permission.VIBRATE"/>
  23.     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  24.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  25.     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>  
  26.  
  27.     <!--Optionalfor location -->
  28.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  29.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  30.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
  31.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  32.     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
  33.     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
  34.     
  35.     <application
  36.         android:icon="@drawable/ic_launcher"
  37.         android:label="@string/app_name"> 
  38.         <!--Required SDK核心功能-->
  39.         <activity
  40.             android:name="cn.jpush.android.ui.PushActivity"
  41.             android:configChanges="orientation|keyboardHidden" 
  42.             android:exported="false">
  43.             <intent-filter>
  44.                 <action android:name="cn.jpush.android.ui.PushActivity"/>
  45.                 <category android:name="android.intent.category.DEFAULT"/>
  46.                 <category android:name="您应用的包名"/>
  47.             </intent-filter>
  48.         </activity>
  49.         <!--Required  SDK核心功能-->
  50.         <service
  51.             android:name="cn.jpush.android.service.DownloadService"
  52.             android:enabled="true"
  53.             android:exported="false">
  54.         </service>    
  55.         <!--Required SDK 核心功能-->
  56.         <service
  57.             android:name="cn.jpush.android.service.PushService"
  58.             android:enabled="true"
  59.             android:exported="false">
  60.             <intent-filter>
  61.                 <action android:name="cn.jpush.android.intent.REGISTER"/>
  62.                 <action android:name="cn.jpush.android.intent.REPORT"/>
  63.                 <action android:name="cn.jpush.android.intent.PushService"/>
  64.                 <action android:name="cn.jpush.android.intent.PUSH_TIME"/> 
  65.             </intent-filter>
  66.         </service>
  67.         <!--Required SDK 核心功能-->
  68.         <service 
  69.             android:name="cn.jpush.android.service.DaemonService"
  70.             android:enabled="true"
  71.             android:exported="true">
  72.             <intent-filter >
  73.                 <action android:name="cn.jpush.android.intent.DaemonService"/>
  74.                 <category android:name="您应用的包名"/>
  75.             </intent-filter>
  76.         </service>
  77.         <!--Required SDK核心功能-->
  78.         <receiver
  79.             android:name="cn.jpush.android.service.PushReceiver"
  80.             android:enabled="true"
  81.             android:exported="false">
  82.              <intent-filter android:priority="1000">
  83.                 <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/>   <!--Required  显示通知栏-->
  84.                 <category android:name="您应用的包名"/>
  85.             </intent-filter>
  86.             <intent-filter>
  87.                 <action android:name="android.intent.action.USER_PRESENT"/>
  88.                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
  89.             </intent-filter>
  90.              <!--Optional-->
  91.             <intent-filter>
  92.                 <action android:name="android.intent.action.PACKAGE_ADDED"/>
  93.                 <action android:name="android.intent.action.PACKAGE_REMOVED"/>
  94.                 <data android:scheme="package"/>
  95.             </intent-filter>
  96.         </receiver>
  97.         
  98.         <!--Required SDK核心功能-->
  99.         <receiver android:name="cn.jpush.android.service.AlarmReceiver"/>
  100.         
  101.         <!--User defined.    用户自定义的广播接收器,如果不需要这个对推送消息进行处理,这个广播接收器不用定义-->
  102.         <receiver
  103.             android:name="您自己定义的Receiver"
  104.             android:enabled="true">
  105.             <intent-filter>
  106.                 <action android:name="cn.jpush.android.intent.REGISTRATION"/><!--Required  用户注册SDKintent-->
  107.                 <action android:name="cn.jpush.android.intent.UNREGISTRATION"/>  
  108.                 <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED"/><!--Required  用户接收SDK消息的intent-->
  109.                 <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED"/><!--Required  用户接收SDK通知栏信息的intent-->
  110.                 <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/><!--Required  用户打开自定义通知栏的intent-->
  111.                 <action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK"/><!--Optional用户接受RichPushJavascript回调函数的intent-->
  112.                 <action android:name="cn.jpush.android.intent.CONNECTION"/><!--接收网络变化连接/断开 since 1.6.3-->
  113.                 <category android:name="您应用的包名"/>
  114.             </intent-filter>
  115.         </receiver>
  116.  
  117.         
  118.         <!--Required  .Enable it you can get statistics data with channel -->
  119.         <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
  120.         <meta-data android:name="JPUSH_APPKEY" android:value="您的Appkey"/><!--  </>值来自开发者平台取得的AppKey-->
  121.         
  122.     </application>
  123. </manifest>
 
3.拷贝相关java代码。(主要是MyReceiver类,如果不需要对推送的通知进行特殊处理,可以不用拷贝相关java代码,
AndroidManifest文件中也不需要定义自定义Receiver,这时候点击推送的通知,默认是打开应用
在自己项目包名目录下建立一个jpush包名:将demo的src目录下的所有java代码拷贝到jpush包目录下。这样整体拷贝,不用更改包名,比较方便。这里我需要是关注MyReceiver中的代码,这个是核心,这个是极光广播的监听,通过这个类可以针对推送的消息进行处理,比如实现点击消息通知跳转到特定的界面等功能。
技术分享
4.拷贝res目录下的资源文件到自己的项目中。
将demo目录下res下所有的res资源文件与自己的项目资源文件进行合并。
 
5.在自己项目进行jpush初始化,别名,tag等设置。
在登录Activity或欢迎Activity等合适的Activity中进行JPush初始化以及别名,或tag设置。
这里将这些代码统一写一个管理类,以便在以后的项目中使用。
 
  1. package com.centrvideo.parkapp.jpush;
  2. import java.io.Serializable;
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. import android.content.Context;
  6. import android.os.Handler;
  7. import android.text.TextUtils;
  8. import android.util.Log;
  9. import android.widget.Toast;
  10. import cn.jpush.android.api.JPushInterface;
  11. import cn.jpush.android.api.TagAliasCallback;
  12. import com.centrvideo.parkapp.util.SharedPreferenceUtil;
  13. /**
  14.  * 极光推送封装,极光管理类
  15.  * @ClassName: JPushManager 
  16.  * @Description: 
  17.  * @author xiaoxiao
  18.  * @date modify by 2015-9-2 上午11:12:10 
  19.  *
  20.  */
  21. public class JPushManager {
  22.     private String TAG = "JPushManager";
  23.     private final String KEY = "JpushConfig";
  24.     private static JPushManager jPushManager;
  25.     private static Context context;
  26.     public static JPushManager newInstence(Context context) {
  27.         JPushManager.context = context;
  28.         if (jPushManager == null) {
  29.             jPushManager = new JPushManager();
  30.         }
  31.         return jPushManager;
  32.     }
  33.     /**
  34.      * 初始化极光,一般可以放到程序的启动Activity或是Application的onCreate方法中调用
  35.      */
  36.     public void initJPush() {
  37.         JPushInterface.setDebugMode(true); // 设置开启日志,发布时请关闭日志
  38.         JPushInterface.init(context); // 初始化 JPush
  39.     }
  40.     /**
  41.      * 退出极光,一般是程序退出登录时候,具体还是需要看项目的实际需求
  42.      */
  43.     public void stopJPush() {
  44. //        JPushInterface.stopPush(context);//
  45.         setAliasAndTags("","");//通过清空别名来停止极光
  46.     }
  47.     /**
  48.      * 设置AliasAndTag,设置多组tag,如果不需要设置tag的化,直接将此参数设为null;
  49.      * 一般在程序登录成功,注册成功等地方调用。别名一般是用户的唯一标识,如userId等
  50.      * @param alias
  51.      * @param tags
  52.      */
  53.     public void setAliasAndTags(final String alias, Set<String> tags) {
  54.         if (TextUtils.isEmpty(alias)) {
  55.             Toast.makeText(context, "别名为空", Toast.LENGTH_SHORT).show();
  56.             return;
  57.         }
  58.         // 调用 Handler 来异步设置别名
  59.         // TODO Auto-generated method stub
  60.         AliasAndTagsInfo aliasAndTagsInfo = new AliasAndTagsInfo();
  61.         aliasAndTagsInfo.setAlias(alias);
  62.         aliasAndTagsInfo.setTag(tags);
  63.         mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS,
  64.                 aliasAndTagsInfo));
  65.     }
  66.     /**
  67.      * 设置AliasAndTag,设置一组tag,如果不需要设置tag的化,直接将此参数设为null;
  68.      * @param alias
  69.      * @param tags
  70.      */
  71.     public void setAliasAndTags(final String alias, String tag) {
  72.         if (TextUtils.isEmpty(alias)) {
  73.             Toast.makeText(context, "别名为空", Toast.LENGTH_SHORT).show();
  74.             return;
  75.         }
  76.         // 调用 Handler 来异步设置别名
  77.         // TODO Auto-generated method stub
  78.         AliasAndTagsInfo aliasAndTagsInfo = new AliasAndTagsInfo();
  79.         aliasAndTagsInfo.setAlias(alias);
  80.         Set<String> tags = new HashSet<String>();
  81.         tags.add(tag);
  82.         aliasAndTagsInfo.setTag(tags);
  83.         mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS,
  84.                 aliasAndTagsInfo));
  85.     }
  86.     private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
  87.         @Override
  88.         public void gotResult(int code, String alias, Set<String> tags) {
  89.             String logs;
  90.             switch (code) {
  91.             case 0:
  92.                 logs = "Set tag and alias success";
  93.                 Log.d(TAG, logs);
  94.                 // 建议这里往 SharePreference 里写一个成功设置的状态。成功设置一次后,以后不必再次设置了。
  95.                 saveAlias(alias);
  96.                 break;
  97.             case 6002:
  98.                 logs = "Failed to set alias and tags due to timeout. Try again after 60s.";
  99.                 Log.d(TAG, logs);
  100.                 // 延迟 60 秒来调用 Handler 设置别名
  101.                 mHandler.sendMessageDelayed(
  102.                         mHandler.obtainMessage(MSG_SET_ALIAS, alias), 1000 * 60);
  103.                 break;
  104.             default:
  105.                 logs = "Failed with errorCode = " + code;
  106.                 Log.d(TAG, logs);
  107.             }
  108.         }
  109.     };
  110.     /**
  111.      * 保存别名到属性文件。
  112.      * 
  113.      * @param alias
  114.      */
  115.     private void saveAlias(String alias) {
  116.         SharedPreferenceUtil.saveString(context, KEY, alias);
  117.     }
  118.     /**
  119.      * 从属性文件取得别名
  120.      * 
  121.      * @param userName
  122.      * @return
  123.      */
  124.     private String getAlias(String userName) {
  125.         return SharedPreferenceUtil.getString(context, KEY, null);
  126.     }
  127.     private static final int MSG_SET_ALIAS = 1001;
  128.     private final Handler mHandler = new Handler() {
  129.         @Override
  130.         public void handleMessage(android.os.Message msg) {
  131.             super.handleMessage(msg);
  132.             AliasAndTagsInfo aliasAndTagsInfo = (AliasAndTagsInfo) msg.obj;
  133.             switch (msg.what) {
  134.             case MSG_SET_ALIAS:
  135.                 Log.d(TAG, "Set alias in handler.");
  136.                 // 调用 JPush 接口来设置别名。
  137.                 JPushInterface.setAliasAndTags(context,
  138.                         aliasAndTagsInfo.getAlias(), aliasAndTagsInfo.getTag(),
  139.                         mAliasCallback);
  140.                 break;
  141.             default:
  142.                 Log.d(TAG, "Unhandled msg - " + msg.what);
  143.             }
  144.         }
  145.     };
  146.     public class AliasAndTagsInfo implements Serializable {
  147.         private static final long serialVersionUID = 1L;
  148.         private String alias;
  149.         private Set<String> tag;
  150.         public String getAlias() {
  151.             return alias;
  152.         }
  153.         public void setAlias(String alias) {
  154.             this.alias = alias;
  155.         }
  156.         public Set<String> getTag() {
  157.             return tag;
  158.         }
  159.         public void setTag(Set<String> tag) {
  160.             this.tag = tag;
  161.         }
  162.     }
  163. }  
 
 
 
 
 
 
 
 





附件列表

 

android集成极光消息推送

标签:

原文地址:http://www.cnblogs.com/xiaoxiao-study/p/897237cd25240e622ceed5b6e36e9060.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!