Android接入极光消息推送

标签: Android推送 极光推送 Android接入极光推送
65人阅读 评论(0) 收藏 举报
分类:

极光消息推送:

极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接

主要功能

  • 保持与服务器的长连接,以便消息能够即时推送到达客户端
  • 接收通知与自定义消息,并向开发者App 传递相关信息

主要特点

  • 客户端维持连接占用资源少、耗电低
  • SDK丰富的接口,可定制通知栏提示样式
  • 服务器大容量、稳定

接入步骤

1.打开极光官网进行注册
2.登录极光官网进入用户的后台管理进行创建应用(按照步骤一步一步来)
3.应用创建成功后,可以拿到AppKey(后期用于在Android清单文件中配置)
4.下载极光推送Android SDK
5.下载成功后将Jpush-android-3.x.x-release.zip压缩包的内容解压如下图所示目录结构

这里写图片描述

example 是官方的demo案例
libs是JPush的Jar包和so文件
AndroidManifest.xml JPush清单文件配置
1.将libs目录下的所有jar包复制到Android Studio中的Project目录结构下的libs目录
2.将libs目录下的所有so文件复制到Android Studio中的jniLibs目录下。如下图所示
这里写图片描述
6.配置AndroidManifest.xml清单文件
根据 SDK 压缩包里的 AndroidManifest.xml样例文件,来配置应用程序项目的AndroidManifest.xml 。
主要步骤为:

  • 复制备注为 “Required” 的部分
  • 将标注为“您应用的包名”的部分,替换为当前应用程序的包名
  • 将标注为“您应用的Appkey”的部分,替换为在JPush官网上注册该应用的的AppKey,例如:9fed5bcb7b9b87413678c407
    清单文件示例

在你应用的Application中的onCrate()方法中进行初始化例如:

public class ExampleApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        JPushInterface.setDebugMode(true);
        JPushInterface.init(this);
    }
}

测试确认

  • 确认所需的权限都已经添加。如果必须的权限未添加,日志会提示错误。
  • 确认 AppKey(在Portal上生成的)已经正确的写入 Androidmanifest.xml 。
  • 确认在程序启动时候调用了init(context) 接口
  • 确认测试手机(或者模拟器)已成功连入网络 + 客户端调用 init 后不久,如果一切正常,应有登录成功的日志信息
  • 启动应用程序,在 Portal 上向应用程序发送自定义消息或者通知栏提示。详情请参考管理Portal。
  • 在几秒内,客户端应可收到下发的通知或者正定义消息,如果 SDK 工作正常,则日志信息会如下:
    [JPushInterface] action:init

    …….

    [PushService] Login succeed!

如图所示,客户端启动分为 4 步:

  • 检查 metadata 的 appKey 和 channel ,如果不存在,则启动失败
  • 初始化 JPush SDK,检查 JNI 等库文件的有效性,如果库文件无效,则启动失败
  • 检查 Androidmanifest.xml,如果有 Required 的权限不存在,则启动失败
  • 连接服务器登录,如果存在网络问题,则登陆失败,或者前面三步有问题,不会启动JPush SDK
    测试JPush消息推送
    进入你的极光推送后台管理选择刚才创建的应用进行推送。推送的类型如下图所示
    这里写图片描述
    可以自行到后台管理查看配置

这时候如果前面的配置都没有问题的话,在后台推送消息后,前台是可以正确收到的。

别名与标签使用

为什么需要别名与标签?

推送消息时,要指定推送的对象:全部,某一个人,或者某一群人。
全部很好办,针对某应用“群发”就好了。Portal与API都支持向指定的 appKey 群发消息。

要指定向某一个特定的人,或者某一群特定的人,则相对复杂。因为对于 JPush 来说,某一个人就是一个注册ID,这个注册ID与开发者App没有任何关系,或者说对开发者App是没有意义的。

如果要对开发者App有意义的某个特定的用户推送消息,则需要:把 JPush 注册用户与开发者App 用户绑定起来。

这个绑定有两个基本思路:
  • 把绑定关系保存到 JPush 服务器端
  • 把绑定关系保存到开发者应用服务器中

前者,就是这里要说到的:别名与标签的功能。这个机制简单易用,适用于大多数开发者。

后者,则是 JPush 提供的另外一套 RegistrationID 机制。这套机制开发者需要有应用服务器来维护绑定关系,不适用于普通开发者。Android SDK 1.6.0 版本开始支持。
使用方式
别名与标签的机制,其工作方式是:

客户端开发者App调用 setAlias或者setTags API 来设置关系
JPush SDK 把该关系设置保存到 JPush Server 上
在服务器端推送消息时,指定向之前设置过的别名或者标签推送
使用标签
用于给某一群人推送消息。

标签类似于博客里为文章打上 tag ,即为某资源分类。
动态标签
JPush 提供的设置标签的 API 是在客户端的。开发者如何做到在自己的服务器端动态去设置分组呢? 比如一个企业OA系统,经常需要去变更部门人员分组。以下是大概的思路:

设计一种自定义消息格式(业务协议),App解析后可以调用 JPush SDK setAliasAndTags API 来重新设置标签(分组)
例:

{"action":"resetTags", "newTags":["dep_level_1":"A公司", "dep_level_2":"技术部", "dep_level_3":"Android开发组", "address":"深圳", "lang":"zh"]}

要动态设置分组时,推送这条自定义消息给指定的用户
使用别名的机制,推送到指定的用户。
客户端App 调用 JPush SDK API 来设置新的标签
别名与标签设置异常处理
由于网络连接不稳定的原因,有一定的概率 JPush SDK 设置别名与标签会失败。 App 开发者合理地处理设置失败,则偶尔失败对应用的正常使用 JPush 影响是有限的。

自定义通知栏样式教程

参考官方文档Android 集成指南

通知 vs 自定义消息

极光推送包含有通知与自定义消息两种类型的推送。本文描述他们的区别,以及建议的应用场景。
两者的区别 - 功能角度

通知

通知(Notification),指在手机的通知栏(状态栏)上会显示的一条通知信息。这是 Android / iOS 的基本功能。通知主要用于提示用户。一条通知,简单的填写纯文本的通知内容即可。应用加上通知功能,有利于提高应用的活跃度。

自定义消息

自定义消息不是通知,默认不会被SDK展示到通知栏上,极光推送仅负责透传给SDK。其内容和展示形式完全由开发者自己定义。自定义消息主要用于应用的内部业务逻辑和特殊展示需求。

两者的区别 - 开发者使用角度

通知

简单场景下的通知,用户可以不写一行代码,而完全由SDK来负责默认的效果展示,以及默认用户点击时打开应用的主界面。JPush Android SDK 提供了 API让开发者来定制通知栏的效果,请参考:自定义通知栏样式教程;也提供了 接收推送消息Receiver 让你来定制在收到通知时与用户点击通知时的不同行为。

自定义消息

SDK 不会把自定义消息展示到通知栏。所以调试时,需要到日志里才可以看到服务器端推送的自定义消息。自定义消息一定要由开发者写 接收推送消息Receiver 来处理收到的消息。

注意:

当自定义消息内容msg_content为空时,SDK不会对消息进行广播,使得app无法接收到推送的消息,因此建议在使用自定义消息推送时添加内容。

使用通知

请参考以下示例代码。

public class MyReceiver extends BroadcastReceiver {
    private static final String TAG = "MyReceiver";

    private NotificationManager nm;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (null == nm) {
            nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        }

        Bundle bundle = intent.getExtras();
        Logger.d(TAG, "onReceive - " + intent.getAction() + ", extras: " + AndroidUtil.printBundle(bundle));

        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            Logger.d(TAG, "JPush用户注册成功");

        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
            Logger.d(TAG, "接受到推送下来的自定义消息");

        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Logger.d(TAG, "接受到推送下来的通知");

            receivingNotification(context,bundle);

        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Logger.d(TAG, "用户点击打开了通知");

           openNotification(context,bundle);

        } else {
            Logger.d(TAG, "Unhandled intent - " + intent.getAction());
        }
    }

   private void receivingNotification(Context context, Bundle bundle){
        String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
        Logger.d(TAG, " title : " + title);
        String message = bundle.getString(JPushInterface.EXTRA_ALERT);
        Logger.d(TAG, "message : " + message);
        String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
        Logger.d(TAG, "extras : " + extras);
    }

   private void openNotification(Context context, Bundle bundle){
        String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
        String myValue = "";
        try {
            JSONObject extrasJson = new JSONObject(extras);
            myValue = extrasJson.optString("myKey");
        } catch (Exception e) {
            Logger.w(TAG, "Unexpected: extras is not a valid json", e);
            return;
        }
        if (TYPE_THIS.equals(myValue)) {
            Intent mIntent = new Intent(context, ThisActivity.class);
            mIntent.putExtras(bundle);
            mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(mIntent);
        } else if (TYPE_ANOTHER.equals(myValue)){
            Intent mIntent = new Intent(context, AnotherActivity.class);
            mIntent.putExtras(bundle);
            mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(mIntent);
        }
    }
}

使用自定义消息

使用自定义消息,在客户端App里一定要写代码,去接受 JPush SDK 的广播,从而取得推送下来的消息内容。具体请参考文档:接收推送消息Receiver。

public class TalkReceiver extends BroadcastReceiver {
    private static final String TAG = "TalkReceiver";

    private NotificationManager nm;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (null == nm) {
            nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        }

        Bundle bundle = intent.getExtras();
        Logger.d(TAG, "onReceive - " + intent.getAction() + ", extras: " + AndroidUtil.printBundle(bundle));

        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            Logger.d(TAG, "JPush用户注册成功");

        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
            Logger.d(TAG, "接受到推送下来的自定义消息");

            // Push Talk messages are push down by custom message format
            processCustomMessage(context, bundle);

        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Logger.d(TAG, "接受到推送下来的通知");

            receivingNotification(context,bundle);

        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Logger.d(TAG, "用户点击打开了通知");

           openNotification(context,bundle);

        } else {
            Logger.d(TAG, "Unhandled intent - " + intent.getAction());
        }
    }

    private void processCustomMessage(Context context, Bundle bundle) {
        String title = bundle.getString(JPushInterface.EXTRA_TITLE);
        String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
        if (StringUtils.isEmpty(title)) {
            Logger.w(TAG, "Unexpected: empty title (friend). Give up");
            return;
        }

        boolean needIncreaseUnread = true;

        if (title.equalsIgnoreCase(Config.myName)) {
            Logger.d(TAG, "Message from myself. Give up");
            needIncreaseUnread = false;
            if (!Config.IS_TEST_MODE) {
                return;
            }
        }

        String channel = null;
        String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
        try {
            JSONObject extrasJson = new JSONObject(extras);
            channel = extrasJson.optString(Constants.KEY_CHANNEL);
        } catch (Exception e) {
            Logger.w(TAG, "Unexpected: extras is not a valid json", e);
        }

        // Send message to UI (Webview) only when UI is up
        if (!Config.isBackground) {
            Intent msgIntent = new Intent(MainActivity.MESSAGE_RECEIVED_ACTION);
            msgIntent.putExtra(Constants.KEY_MESSAGE, message);
            msgIntent.putExtra(Constants.KEY_TITLE, title);
            if (null != channel) {
                msgIntent.putExtra(Constants.KEY_CHANNEL, channel);
            }

            JSONObject all = new JSONObject();
            try {
                all.put(Constants.KEY_TITLE, title);
                all.put(Constants.KEY_MESSAGE, message);
                all.put(Constants.KEY_EXTRAS, new JSONObject(extras));
            } catch (JSONException e) {
            }
            msgIntent.putExtra("all", all.toString());

            context.sendBroadcast(msgIntent);
        }

        String chatting = title;
        if (!StringUtils.isEmpty(channel)) {
            chatting = channel;
        }

        String currentChatting = MyPreferenceManager.getString(Constants.PREF_CURRENT_CHATTING, null);
        if (chatting.equalsIgnoreCase(currentChatting)) {
            Logger.d(TAG, "Is now chatting with - " + chatting + ". Dont show notificaiton.");
            needIncreaseUnread = false;
            if (!Config.IS_TEST_MODE) {
                return;
            }
        }

        if (needIncreaseUnread) {
            unreadMessage(title, channel);
        }

        NotificationHelper.showMessageNotification(context, nm, title, message, channel);
    }

    // When received message, increase unread number for Recent Chat
    private void unreadMessage(final String friend, final String channel) {
        new Thread() {
            public void run() {
                String chattingFriend = null;
                if (StringUtils.isEmpty(channel)) {
                    chattingFriend = friend;
                }

                Map<String, String> params = new HashMap<String, String>();
                params.put("udid", Config.udid);
                params.put("friend", chattingFriend);
                params.put("channel_name", channel);

                try {
                    HttpHelper.post(Constants.PATH_UNREAD, params);
                } catch (Exception e) {
                    Logger.e(TAG, "Call pushtalk api to report unread error", e);
                }
            }
        }.start();
    }
}

相关API说明

API - setDebugMode设置调试模式
注:该接口需在init接口之前调用,避免出现部分日志没打印的情况。多进程情况下建议在自定义的Application中onCreate中调用。

API - init
初始化推送服务。调用了本 API 后,JPush推送服务进行初始化。建议在自定义的Application中的onCreate中调用。

API - resumePush恢复推送服务
调用了此 API 后,极光推送完全恢复正常工作。

API - isPushStopped
用来检查 Push Service 是否已经被停止

API - setAlias
调用此 API 来设置别名。
需要理解的是,这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。

API - deleteAlias
调用此 API 来删除别名。

API - getAlias
调用此 API 来查询别名。

API - setTags
调用此 API 来设置标签。
需要理解的是,这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。

API - addTags
调用此 API 来新增标签。

API - deleteTags
调用此 API 来删除指定标签。

API - cleanTags
调用此 API 来清除所有标签。

API - getAllTags
调用此 API 来查询所有标签。

API - checkTagBindState
调用此 API 来查询指定tag与当前用户绑定的状态。

API - setMobileNumber
调用此API设置手机号码。该接口会控制调用频率,频率为 10s之内最多三次。

新的消息回调方式说明

Class - cn.jpush.android.service.JPushMessageReceiver

       新的消息回调方式中相关回调类。
       新的tag与alias操作回调会在开发者定义的该类的子类中触发。
       手机号码设置的回调会在开发者定义的该类的子类中触发。
       该类为回调父类,开发者需要继承该类并在Manifest中配置您对应实现的类,接口操作的结果会在您配置的类中的如下方法中回调。

Class - cn.jpush.android.api.JPushMessage

       新的消息回调方式中相关回调的结果类,使用该类对象可获取对应的操作结果。
       当前仅仅新的tag与alias操作回调会涉及到该类
JPushMessageReceiver用法示例
public class MyJPushMessageReceiver extends JPushMessageReceiver {

    /**
     * tag增删查改的操作会在此方法中回调结果。
     *
     * @param context
     * @param jPushMessage
     */
    @Override
    public void onTagOperatorResult(Context context, JPushMessage jPushMessage) {
        super.onTagOperatorResult(context, jPushMessage);
    }
    /**
     * 查询某个tag与当前用户的绑定状态的操作会在此方法中回调结果。
     *
     * @param context
     * @param jPushMessage
     */
    @Override
    public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) {
        super.onCheckTagOperatorResult(context, jPushMessage);
    }
    /**
     * alias相关的操作会在此方法中回调结果。
     *
     * @param context
     * @param jPushMessage
     */
    @Override
    public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
        super.onAliasOperatorResult(context, jPushMessage);
    }
    /**
     * 设置手机号码会在此方法中回调结果。
     *
     * @param context
     * @param jPushMessage
     */
    @Override
    public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) {
        super.onMobileNumberOperatorResult(context, jPushMessage);
    }
}

接收推送消息Receiver

JPush SDK 收到推送,通过广播的方式,转发给开发者App,这样开发者就可以灵活地进行处理。这个动作不是必须的。用户有需要才定义 Receiver 类来处理 SDK过来的广播。如果不做这个动作,即不写自定义 Receiver,也不在AndroidManifest.xml 里配置这个 Receiver,则默认的行为是:

  • 接收到推送的自定义消息,则没有被处理
  • 可以正常收到通知,用户点击打开应用主界面

如果全部类型的广播都接收,则需要在 AndroidManifest.xml 里添加如下的配置信息:

<receiver
    android:name="Your Receiver"
    android:enabled="true">
    <intent-filter>
        <action android:name="cn.jpush.android.intent.REGISTRATION" />
        <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
        <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
        <action android:name="cn.jpush.android.intent.NOTIFICATION_CLICK_ACTION" />
        <action android:name="cn.jpush.android.intent.CONNECTION" />
        <category android:name="You package Name" />
    </intent-filter>
</receiver>

每个 Receiver action 详细解释可参考官网文档,也可参考笔者的JPushDemo代码示例的注释代码

/**
 * 自定义消息接收器
 * <p>
 *     如果不定义这个 Receiver,则:
 *     1) 默认用户会打开主界面
 *     2) 接收不到自定义消息
 * </p>
 *
 */
public class MyReceiver extends BroadcastReceiver {
    private static final String TAG = "MyReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            Bundle bundle = intent.getExtras();
            LogUtil.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));

            if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
                //SDK 向 JPush Server 注册所得到的注册 ID
                LogUtil.d(TAG, "接收RegistrationId");
                String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
                //收到了自定义消息 Push
                LogUtil.d(TAG, "接收到推送下来的自定义消息");
                //1.消息标题
                String title = bundle.getString(JPushInterface.EXTRA_TITLE);
                //2.消息内容
                String content = bundle.getString(JPushInterface.EXTRA_MESSAGE);
                //3.消息附加字段
                String extra = bundle.getString(JPushInterface.EXTRA_EXTRA);
                //4.消息唯一标识ID
                String msgId = bundle.getString(JPushInterface.EXTRA_MSG_ID);

            } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
                //收到了通知 Push
                LogUtil.d(TAG, "接收到推送下来的通知");
                //1.消息标题
                String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
                //2.消息内容
                String content = bundle.getString(JPushInterface.EXTRA_ALERT);
                //3.消息附加字段
                String extra = bundle.getString(JPushInterface.EXTRA_EXTRA);
                //4.通知栏的Notification ID,可以用于清除Notification
                String notificationId = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_ID);
                //5.富媒体通知推送下载的HTML的文件路径,用于展现WebView。
                String fileHtml = bundle.getString(JPushInterface.EXTRA_RICHPUSH_HTML_PATH);
                //6.富媒体通知推送下载的图片资源的文件名
                String fileStr = bundle.getString(JPushInterface.EXTRA_RICHPUSH_HTML_RES);
                String[] fileNames = fileStr.split(",");
                //7.唯一标识通知消息的 ID, 可用于上报统计等。
                String msgId = bundle.getString(JPushInterface.EXTRA_MSG_ID);
                //8.大文本通知样式中大文本的内容。
                String bigText = bundle.getString(JPushInterface.EXTRA_BIG_TEXT);
                //9.大图片通知样式中大图片的路径/地址
                String bigPicPath = bundle.getString(JPushInterface.EXTRA_BIG_PIC_PATH);
                //10.收件箱通知样式中收件箱的内容
                String inboxJson = bundle.getString(JPushInterface.EXTRA_INBOX);
                //11.通知的优先级。默认为0,范围为 -2~2 ,其他值将会被忽略而采用默认。
                String priority = bundle.getString(JPushInterface.EXTRA_NOTI_PRIORITY);
                //12.通知分类。
                String category = bundle.getString(JPushInterface.EXTRA_NOTI_CATEGORY);
            } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
                //(1)用户点击了通知。 一般情况下,用户不需要配置此 receiver action。
                //(2)如果开发者在 AndroidManifest.xml 里未配置此 receiver action,那么,SDK 会默认打开应用程序的主 Activity,相当于用户点击桌面图标的效果。
                //(3)如果开发者在 AndroidManifest.xml 里配置了此 receiver action,那么,当用户点击通知时,SDK 不会做动作。开发者应该在自己写的 BroadcastReceiver 类里处理,比如打开某 Activity 。
                LogUtil.d(TAG, "[用户点击打开了通知");
                //1.消息标题
                String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
                //2.消息内容
                String content = bundle.getString(JPushInterface.EXTRA_ALERT);
                //3.消息附加字段
                String extra = bundle.getString(JPushInterface.EXTRA_EXTRA);
                //4.知栏的Notification ID,可以用于清除Notification
                int notificationId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
                //5.唯一标识调整消息的 ID, 可用于上报统计等。
                String msgId = bundle.getString(JPushInterface.EXTRA_MSG_ID);
            } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
                //(1)用户点击了通知栏中自定义的按钮。(SDK 3.0.0 以上版本支持)
                //(2)使用普通通知的开发者不需要配置此 receiver action。只有开发者使用了 MultiActionsNotificationBuilder 构建携带按钮的通知栏的通知时,可通过该 action 捕获到用户点击通知栏按钮的操作,并自行处理。
                LogUtil.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
                /**
                 * <p>
                 *     private void setAddActionsStyle() {
                 *        MultiActionsNotificationBuilder builder = new MultiActionsNotificationBuilder(PushSetActivity.this);
                 *        builder.addJPushAction(R.drawable.jpush_ic_richpush_actionbar_back, "first", "my_extra1");
                 *        builder.addJPushAction(R.drawable.jpush_ic_richpush_actionbar_back, "second", "my_extra2");
                 *        builder.addJPushAction(R.drawable.jpush_ic_richpush_actionbar_back, "third", "my_extra3");
                 *        JPushInterface.setPushNotificationBuilder(10, builder);
                 *        Toast.makeText(PushSetActivity.this, "AddActions Builder - 10", Toast.LENGTH_SHORT).show();
                         }
                 * </p>
                 */
                /**
                 * <p>
                 *      Log.d(TAG, "[MyReceiver] 用户点击了通知栏按钮");
                        String nActionExtra = intent.getExtras().getString(JPushInterface.EXTRA_NOTIFICATION_ACTION_EXTRA);
                        //开发者根据不同 Action 携带的 extra 字段来分配不同的动作。
                        if(nActionExtra==null){
                        Log.d(TAG,"ACTION_NOTIFICATION_CLICK_ACTION nActionExtra is null");
                        return;
                      }
                        if (nActionExtra.equals("my_extra1")) {
                        Log.d(TAG, "[MyReceiver] 用户点击通知栏按钮一");
                      } else if (nActionExtra.equals("my_extra2")) {
                        Log.d(TAG, "[MyReceiver] 用户点击通知栏按钮二");
                      } else if (nActionExtra.equals("my_extra3")) {
                        Log.d(TAG, "[MyReceiver] 用户点击通知栏按钮三");
                      } else {
                      Log.d(TAG, "[MyReceiver] 用户点击通知栏按钮未定义");
                 }
                 * </p>
                 */

            } else if (JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
                //JPush 服务的连接状态发生变化。(注:不是指 Android 系统的网络连接状态。)
                LogUtil.w(TAG, "JPush服务连接状态发生改变");
                boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
            } else {
                LogUtil.d(TAG, "未处理的Intent");
            }
        } catch (Exception e) {

        }

    }

    // 打印所有的 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));
            } else if (key.equals(JPushInterface.EXTRA_EXTRA)) {
                if (TextUtils.isEmpty(bundle.getString(JPushInterface.EXTRA_EXTRA))) {
                    LogUtil.i(TAG, "This message has no Extra data");
                    continue;
                }

                try {
                    JSONObject json = new JSONObject(bundle.getString(JPushInterface.EXTRA_EXTRA));
                    Iterator<String> it = json.keys();

                    while (it.hasNext()) {
                        String myKey = it.next();
                        sb.append("\nkey:" + key + ", value: [" +
                                myKey + " - " + json.optString(myKey) + "]");
                    }
                } catch (JSONException e) {
                    LogUtil.e(TAG, "Get message extra JSON error!");
                }

            } else {
                sb.append("\nkey:" + key + ", value:" + bundle.getString(key));
            }
        }
        return sb.toString();
    }
}

总结

极光推送Android的接入并不是很难。按照官网一步一步走下来即可。具体详细的介绍文档,可以进入极光官网,查看Android 接入指南。很详细,很清晰。如果读者接入的过程中遇到问题,可以在官网查看问题的描述,以及相关的解决方案。

查看评论

Android极光推送(Android studio 3.0+)

使用步骤: Step 1.创建应用: 进入极光控制台后,点击“创建应用”按钮,进入创建应用的界面。 填上你的应用程序的名称以及应用包名这二项就可以了, 最后点击最下方的 “创建我的应用”按钮,...
  • Konfyt_Android
  • Konfyt_Android
  • 2018-01-12 09:33:23
  • 255

极光推送配置和使用

极光平台流程: 客户端集成 极光推送,然后在软件启动的时候,获取RID(也可以自定义别名和标签) 然后上传值给服务器,当触发了某个事件时,进行网络请求,服务器端接收到会通过极光推送,发送推送(给不同...
  • weixin_37577039
  • weixin_37577039
  • 2018-03-02 15:12:04
  • 330

Android 中使用极光推送消息详细介绍(一)

简介在Android开发中,服务器有时候会向客户端推送一些用户可能感兴趣的消息,比如:淘宝,网易新闻,美团等都会向我们客户端推送消息.今天我就介绍一个第三方免费推送消息的服务:极光推送官方资源官方文档...
  • Greathfs
  • Greathfs
  • 2016-07-31 01:17:38
  • 36902

Android 极光推送集成与使用详解

极光新建应用首先需要有极光账号,在后台新建应用 新建时会要求上传app图标和填写app名字,然后需要完成推送设置 点击推送设置后出现android 与iOS的按钮,点击android后填写...
  • hjw45611
  • hjw45611
  • 2017-08-03 12:05:22
  • 1857

极光推送自动集成工具

说明 : 使用jcenter自动集成的开发者,不需要在项目中添加jar和so,jcenter会自动完成依赖;在AndroidManifest.xml中不需要添加任何JPush SDK 相关的配置,jc...
  • a821265960
  • a821265960
  • 2018-03-20 16:48:30
  • 42

Android集成极光推送

第一步 下载极光推送SDK,下载地址https://docs.jiguang.cn/jpush/resources/ 解压后进入libs将jar复制到项目libs文件夹下,main新建jniLib...
  • gao_blog
  • gao_blog
  • 2018-03-21 14:59:10
  • 77

Android集成极光推送踩坑(二)升级篇

前段时间针对集成极光推送写了篇文章( Android集成极光推送和踩过的坑),后来提测以后发现了各种问题。一直没时间总结一下,趁着周末有点时间,赶紧把这段时间里针对Push这块儿遇到的问题梳理一下。并...
  • mohan6
  • mohan6
  • 2017-07-02 16:50:57
  • 1694

Android之极光推送发送自定义消息

Android端实现主要代码: [java] view plain copy "font-size:14px;">import java.io.IO...
  • LWJdear
  • LWJdear
  • 2017-10-17 10:15:04
  • 402

Android JPush(极光推送)的使用教程

首先进入官网https://www.jpush.cn/,先注册一个账号。 注册号以后,创建应用 1、点击右上角进入个人中心 2、点击创建应用 3、在创建应用界面输入自己项目的应用名和应...
  • LM_ZP
  • LM_ZP
  • 2016-05-12 09:31:37
  • 12397

简述Android中极光推送的运用步骤

极光推送(JPush)是独立的第三方云推送平台,致力于为全球移动应用开发者提供专业、高效的移动消息推送服务。开发者只需在客户端集成极光推送 SDK,即可轻松地添加Push功能到他的App中。   但是...
  • SuperDHQ
  • SuperDHQ
  • 2016-09-01 19:15:33
  • 3290
    个人资料
    等级:
    访问量: 2576
    积分: 155
    排名: 110万+
    文章分类
    文章存档
    最新评论