第一次用极光推送避免不了各种坑。总结一下。

关于架包引入
请先参考官方文档,
Android SDK 集成指南

这里文档说的是最新版架包在AndroidStudio中引入的方法,
直接可以在build中使用compile引入,并进行相关配置。

如果全部配置完成检查app中是否生成有.so文件,
null
注意:
包名必须是jniLibs,如果没有的话,或者目录下文件是空,可以在libs下
找到极光的jar包,把里面的这些文件全拷贝到jinLibs下,

如果是eclipse,则在libs目录下
null

如果遇到getRegistrationID为空等异常可以参考之前写的博客
《极光推送getRegistrationID为空,UnsatisfiedLinkError异常》

关于使用
因为是采用广播的方式完成推送,所以要写一个MyReceiver 继承BroadcastReceiver ,在这里面处理收到的系统通知,和自定义通知。

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

    private NotificationManager nm;

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        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);
        }

这里有两个是常用的

自定义通知:
JPushInterface.ACTION_MESSAGE_RECEIVED
在这里可以进行一些ui上的实现,可以弹窗推送,比如有些系统提示维护的弹窗,或者一些不常用的但是又非常重要需要实时提示的可以自定义。

对系统通知的操作:
JPushInterface.ACTION_NOTIFICATION_OPENED
也就是处理系统栏的推送,

代码示例:

cn.jpush.android.intent.MESSAGE_RECEIVED, extras: 
                                                             key:cn.jpush.android.EXTRA, value:{"pushinfo":{"money":0,"bid":"89510","btype":0,"bbid":"89510","messageid":"14768","pbid":0},"pushtype":"bills"}
                                                             key:cn.jpush.android.TITLE, value:您有新的奖金入帐
                                                             key:cn.jpush.android.MESSAGE, value:您有新的奖金入帐,奖金帐单流水号:89510!
                                                             key:cn.jpush.android.CONTENT_TYPE, value:type
                                                             key:cn.jpush.android.APPKEY, value:**********************
                                                             key:cn.jpush.android.MSG_ID, value:************

......

cn.jpush.android.intent.NOTIFICATION_RECEIVED, extras:                                    key:cn.jpush.android.NOTIFICATION_DEVELOPER_ARG0, value:developerArg0
                                                             key:cn.jpush.android.ALERT, value:您有新的奖金入帐
                                                             key:cn.jpush.android.EXTRA, value:{}
                                                             key:cn.jpush.android.NOTIFICATION_ID, value:*********
                                                             key:cn.jpush.android.NOTIFICATION_CONTENT_TITLE, value:顺道嘉
                                                             key:cn.jpush.android.MSG_ID, value:**********

这里是后台返回的数据,我们要做的就是判断消息类型。

String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
            model = getEntityByJsonObject(extras);

获取我们所有的消息,然后解析存放到我们的model中。
需要用的时候直接调用

利用model判断消息类型。

这里的页面就是一个自定义的系统提示弹窗,在MESSAGE_RECEIVED中处理,收到推送后会弹出提示窗。

            //极光自定义推送message消息类型,打开弹窗页面
if (model.pushtype.equals("message")){
                    if (AppManager.isAction(context)){
                        JPushModel.JPushMessage jpmsg = (JPushModel.JPushMessage) model.t;
                        Log.e("jpmsg----------------",jpmsg.toString());
                        mp1 = MediaPlayer.create(context,
                                getSystemDefultRingtoneUri());
                        mp1.start();
                        Intent i2 = new Intent(context, SMRZActivity.class);
                        i2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        i2.putExtra("TITLE",
                                bundle.getString(JPushInterface.EXTRA_TITLE));
                        i2.putExtra("CONTENT",
                                bundle.getString(JPushInterface.EXTRA_MESSAGE));
                        i2.putExtra("isOk", jpmsg.isOk);
                        context.startActivity(i2);
                }

同时,在NOTIFICATION_RECEIVED中设置系统通知的状态操作,
点击系统栏跳转到消息列表。

if (model.pushtype.equals("message")) {
                            JPushModel.JPushMessage jm = (JPushModel.JPushMessage) model.t;
                            if (jm.url.equals("")) {
                                Intent i = new Intent(context, MessageListActivity.class);
                                context.startActivity(i);
                            }else {
                                WebViewActivity.start(context, "活动", jm.url);
                            }

设置开关

设置开启/关闭推送
JPush已经为我们设置好了,直接调用就行了。

//关闭
JPushInterface.stopPush(getApplicationContext());
//开启
JPushInterface.resumePush(getApplicationContext());

极光后台
在极光管理后台,我们可以进行点对点,和一些自定义的推送。
RegistrationID可以使用JPushInterface.getRegistrationID(this);获取。
null


能力有限,如果想详细了解极光可以去看官方文档
当然极光的功能也不仅仅局限于这些消息推送,后面还有即时通讯、短信验证码等。

附github:https://github.com/jpush

原文地址:http://www.jianshu.com/p/17daba78454e