zoukankan      html  css  js  c++  java
  • android集成极光消息推送

     
        推送功能现在在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"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="您应用的包名"   
          android:versionCode="180"
          android:versionName="1.8.0"
          >
          <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="17"/>
          <!--Required自定义用来收发消息的相关权限-->               
          <permission
              android:name="您应用的包名.permission.JPUSH_MESSAGE"
              android:protectionLevel="signature"/>
        
          <!--Required  一些系统要求的权限,如访问网络等-->
          <uses-permission android:name="您应用的包名.permission.JPUSH_MESSAGE"/>
          <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
          <uses-permission android:name="android.permission.INTERNET"/>
          <uses-permission android:name="android.permission.WAKE_LOCK"/>
          <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
          <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
          <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
          <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
          <uses-permission android:name="android.permission.VIBRATE"/>
          <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
          <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
          <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>  
       
          <!--Optionalfor location -->
          <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
          <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
          <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
          <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
          <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
          <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
          
          <application
              android:icon="@drawable/ic_launcher"
              android:label="@string/app_name"> 
              <!--Required SDK核心功能-->
              <activity
                  android:name="cn.jpush.android.ui.PushActivity"
                  android:configChanges="orientation|keyboardHidden" 
                  android:exported="false">
                  <intent-filter>
                      <action android:name="cn.jpush.android.ui.PushActivity"/>
                      <category android:name="android.intent.category.DEFAULT"/>
                      <category android:name="您应用的包名"/>
                  </intent-filter>
              </activity>
              <!--Required  SDK核心功能-->
              <service
                  android:name="cn.jpush.android.service.DownloadService"
                  android:enabled="true"
                  android:exported="false">
              </service>    
              <!--Required SDK 核心功能-->
              <service
                  android:name="cn.jpush.android.service.PushService"
                  android:enabled="true"
                  android:exported="false">
                  <intent-filter>
                      <action android:name="cn.jpush.android.intent.REGISTER"/>
                      <action android:name="cn.jpush.android.intent.REPORT"/>
                      <action android:name="cn.jpush.android.intent.PushService"/>
                      <action android:name="cn.jpush.android.intent.PUSH_TIME"/> 
                  </intent-filter>
              </service>
              <!--Required SDK 核心功能-->
              <service 
                  android:name="cn.jpush.android.service.DaemonService"
                  android:enabled="true"
                  android:exported="true">
                  <intent-filter >
                      <action android:name="cn.jpush.android.intent.DaemonService"/>
                      <category android:name="您应用的包名"/>
                  </intent-filter>
              </service>
              <!--Required SDK核心功能-->
              <receiver
                  android:name="cn.jpush.android.service.PushReceiver"
                  android:enabled="true"
                  android:exported="false">
                   <intent-filter android:priority="1000">
                      <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/>   <!--Required  显示通知栏-->
                      <category android:name="您应用的包名"/>
                  </intent-filter>
                  <intent-filter>
                      <action android:name="android.intent.action.USER_PRESENT"/>
                      <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
                  </intent-filter>
                   <!--Optional-->
                  <intent-filter>
                      <action android:name="android.intent.action.PACKAGE_ADDED"/>
                      <action android:name="android.intent.action.PACKAGE_REMOVED"/>
                      <data android:scheme="package"/>
                  </intent-filter>
              </receiver>
              
              <!--Required SDK核心功能-->
              <receiver android:name="cn.jpush.android.service.AlarmReceiver"/>
              
              <!--User defined.    用户自定义的广播接收器,如果不需要这个对推送消息进行处理,这个广播接收器不用定义-->
              <receiver
                  android:name="您自己定义的Receiver"
                  android:enabled="true">
                  <intent-filter>
                      <action android:name="cn.jpush.android.intent.REGISTRATION"/><!--Required  用户注册SDK的intent-->
                      <action android:name="cn.jpush.android.intent.UNREGISTRATION"/>  
                      <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED"/><!--Required  用户接收SDK消息的intent-->
                      <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED"/><!--Required  用户接收SDK通知栏信息的intent-->
                      <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/><!--Required  用户打开自定义通知栏的intent-->
                      <action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK"/><!--Optional用户接受RichPushJavascript回调函数的intent-->
                      <action android:name="cn.jpush.android.intent.CONNECTION"/><!--接收网络变化连接/断开 since 1.6.3-->
                      <category android:name="您应用的包名"/>
                  </intent-filter>
              </receiver>
       
              
              <!--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="您的Appkey"/><!--  </>值来自开发者平台取得的AppKey-->
              
          </application>
      </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;
      import java.io.Serializable;
      import java.util.HashSet;
      import java.util.Set;
      import android.content.Context;
      import android.os.Handler;
      import android.text.TextUtils;
      import android.util.Log;
      import android.widget.Toast;
      import cn.jpush.android.api.JPushInterface;
      import cn.jpush.android.api.TagAliasCallback;
      import com.centrvideo.parkapp.util.SharedPreferenceUtil;
      /**
       * 极光推送封装,极光管理类
       * @ClassName: JPushManager 
       * @Description: 
       * @author xiaoxiao
       * @date modify by 2015-9-2 上午11:12:10 
       *
       */
      public class JPushManager {
          private String TAG = "JPushManager";
          private final String KEY = "JpushConfig";
          private static JPushManager jPushManager;
          private static Context context;
          public static JPushManager newInstence(Context context) {
              JPushManager.context = context;
              if (jPushManager == null) {
                  jPushManager = new JPushManager();
              }
              return jPushManager;
          }
          /**
           * 初始化极光,一般可以放到程序的启动Activity或是Application的onCreate方法中调用
           */
          public void initJPush() {
              JPushInterface.setDebugMode(true); // 设置开启日志,发布时请关闭日志
              JPushInterface.init(context); // 初始化 JPush
          }
          /**
           * 退出极光,一般是程序退出登录时候,具体还是需要看项目的实际需求
           */
          public void stopJPush() {
      //        JPushInterface.stopPush(context);//
              setAliasAndTags("","");//通过清空别名来停止极光
          }
          /**
           * 设置AliasAndTag,设置多组tag,如果不需要设置tag的化,直接将此参数设为null;
           * 一般在程序登录成功,注册成功等地方调用。别名一般是用户的唯一标识,如userId等
           * @param alias
           * @param tags
           */
          public void setAliasAndTags(final String alias, Set<String> tags) {
              if (TextUtils.isEmpty(alias)) {
                  Toast.makeText(context, "别名为空", Toast.LENGTH_SHORT).show();
                  return;
              }
              // 调用 Handler 来异步设置别名
              // TODO Auto-generated method stub
              AliasAndTagsInfo aliasAndTagsInfo = new AliasAndTagsInfo();
              aliasAndTagsInfo.setAlias(alias);
              aliasAndTagsInfo.setTag(tags);
              mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS,
                      aliasAndTagsInfo));
          }
          /**
           * 设置AliasAndTag,设置一组tag,如果不需要设置tag的化,直接将此参数设为null;
           * @param alias
           * @param tags
           */
          public void setAliasAndTags(final String alias, String tag) {
              if (TextUtils.isEmpty(alias)) {
                  Toast.makeText(context, "别名为空", Toast.LENGTH_SHORT).show();
                  return;
              }
              // 调用 Handler 来异步设置别名
              // TODO Auto-generated method stub
              AliasAndTagsInfo aliasAndTagsInfo = new AliasAndTagsInfo();
              aliasAndTagsInfo.setAlias(alias);
              Set<String> tags = new HashSet<String>();
              tags.add(tag);
              aliasAndTagsInfo.setTag(tags);
              mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS,
                      aliasAndTagsInfo));
          }
          private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
              @Override
              public void gotResult(int code, String alias, Set<String> tags) {
                  String logs;
                  switch (code) {
                  case 0:
                      logs = "Set tag and alias success";
                      Log.d(TAG, logs);
                      // 建议这里往 SharePreference 里写一个成功设置的状态。成功设置一次后,以后不必再次设置了。
                      saveAlias(alias);
                      break;
                  case 6002:
                      logs = "Failed to set alias and tags due to timeout. Try again after 60s.";
                      Log.d(TAG, logs);
                      // 延迟 60 秒来调用 Handler 设置别名
                      mHandler.sendMessageDelayed(
                              mHandler.obtainMessage(MSG_SET_ALIAS, alias), 1000 * 60);
                      break;
                  default:
                      logs = "Failed with errorCode = " + code;
                      Log.d(TAG, logs);
                  }
              }
          };
          /**
           * 保存别名到属性文件。
           * 
           * @param alias
           */
          private void saveAlias(String alias) {
              SharedPreferenceUtil.saveString(context, KEY, alias);
          }
          /**
           * 从属性文件取得别名
           * 
           * @param userName
           * @return
           */
          private String getAlias(String userName) {
              return SharedPreferenceUtil.getString(context, KEY, null);
          }
          private static final int MSG_SET_ALIAS = 1001;
          private final Handler mHandler = new Handler() {
              @Override
              public void handleMessage(android.os.Message msg) {
                  super.handleMessage(msg);
                  AliasAndTagsInfo aliasAndTagsInfo = (AliasAndTagsInfo) msg.obj;
                  switch (msg.what) {
                  case MSG_SET_ALIAS:
                      Log.d(TAG, "Set alias in handler.");
                      // 调用 JPush 接口来设置别名。
                      JPushInterface.setAliasAndTags(context,
                              aliasAndTagsInfo.getAlias(), aliasAndTagsInfo.getTag(),
                              mAliasCallback);
                      break;
                  default:
                      Log.d(TAG, "Unhandled msg - " + msg.what);
                  }
              }
          };
          public class AliasAndTagsInfo implements Serializable {
              private static final long serialVersionUID = 1L;
              private String alias;
              private Set<String> tag;
              public String getAlias() {
                  return alias;
              }
              public void setAlias(String alias) {
                  this.alias = alias;
              }
              public Set<String> getTag() {
                  return tag;
              }
              public void setTag(Set<String> tag) {
                  this.tag = tag;
              }
          }
      }  
      

        

     
     
     
     
     
     
     
     





    附件列表

  • 相关阅读:
    转C++的一点点
    无向图hash
    字符串相关
    Tutte矩阵求一般图最大匹配
    FFT的常数优化
    洲阁筛
    半平面交
    非旋treap套线段树
    点分治 [IOI2011]Race
    treap
  • 原文地址:https://www.cnblogs.com/xiaoxiao-study/p/897237cd25240e622ceed5b6e36e9060.html
Copyright © 2011-2022 走看看