首先,在官网新建应用配置好,会有一个demo可以下载,下下来之后把libs文件夹下的东西都考到as工程下的libs包下,然后添加好依赖!

其次,根据demo下的java文件,进行极光推送初始化

/**
 * @author 马鹏昊
 * @date {2016-8-3}
 * @des 随着程序启动而运行的类
 * @updateAuthor
 * @updateDate
 * @updateDes
 */
public class TheApplication extends Application {

    private static Context sContext ;

    @Override
    public void onCreate() {
        super.onCreate();
        sContext = getApplicationContext();
        //极光推送初始化其一
        JPushInterface.setDebugMode(true);     // 设置开启日志,发布时请关闭日志
        JPushInterface.init(this);            // 初始化 JPush
    }

    public static Context getContext(){
        return sContext;
    }
}

在主界面时还要初始化一个内容:

//初始化极光推送
JPushInterface.init(getApplicationContext());

然后把demo中的Manifest文件中的内容有选择的考到项目中的配置文件中(只要包名是JPush官方的都考进去,包名是com.example.demo等的不要),其他的java文件看demo就会明白怎么做的。

如果官网能够正常发送推送了说明集成成功了,但是手机端却收不到推送?

查看Error日志会发现如下错误信息,

[JPushGlobal] Get sdk version fail![获取sdk版本失败!]

[JPushGlobal] JPush .so file do not match JPush .jar file in the project, Failed to init JPush

这一切源于Android Studio的特殊性,在Android Studio中你要在module的build.gradle里的android{}里定义.so文件的加载路径:

sourceSets.main {
    jniLibs.srcDirs = ['libs']  // <-- Set your folder here!
}

配置好再运行,你会发现,之前收不到的推送一股脑儿全来了!

demo中的MyReceiver是接收到推送的地方,一般而言,我们只需要在通知栏接收到推送(不用管,自动实现),然后点击跳转到我们自己定义的activity来显示详细的推送信息,我们在这要做的只有

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

    //打开自定义的Activity
    Intent i = new Intent(context, JPushMessageShow.class);
    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);

其中的JPushMessageShow这个类就是我们自定义的来显示详细的推送信息的类,在这个类里

Intent intent = getIntent();
if (null != intent) {
    Bundle bundle = getIntent().getExtras();
    String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
    String content = bundle.getString(JPushInterface.EXTRA_ALERT);
    pushTitle.setText(title);
    pushContent.setText(content);
}

这样就把推送的标题和详细内容显示出来了。

如果更高级一点,推送只想让某些用户才能收到,就要设置alias或者tag了,在主界面配置:

//极光推送设置别名还是TAG标志位
private static final int MSG_SET_ALIAS = 1001;
private static final int MSG_SET_TAGS = 1002;
private static final String TAG = "JPush";
private final Handler mJPushHandler = new Handler() {
    @Override
    public void handleMessage(android.os.Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
            case MSG_SET_ALIAS:
                Log.d(TAG, "Set alias in handler.");
                JPushInterface.setAliasAndTags(getApplicationContext(), (String) msg.obj, null, mAliasCallback);
                break;

            case MSG_SET_TAGS:
                Log.d(TAG, "Set tags in handler.");
                JPushInterface.setAliasAndTags(getApplicationContext(), null, (Set<String>) msg.obj, mTagsCallback);
                break;

            default:
                Log.i(TAG, "Unhandled msg - " + msg.what);
        }
    }
};



//极光推送用到的设置别名回调方法
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.i(TAG, logs);
                break;

            case 6002:
                logs = "Failed to set alias and tags due to timeout. Try again after 60s.";
                Log.i(TAG, logs);
                if (JPushUtil.isConnected(getApplicationContext())) {
                    mJPushHandler.sendMessageDelayed(mJPushHandler.obtainMessage(MSG_SET_ALIAS, alias), 1000 * 60);
                } else {
                    Log.i(TAG, "No network");
                }
                break;

            default:
                logs = "Failed with errorCode = " + code;
                Log.e(TAG, logs);
        }
        JPushUtil.showToast(logs, getApplicationContext());
    }

};

//极光推送用到的设置TAG回调方法
private final TagAliasCallback mTagsCallback = 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.i(TAG, logs);
                break;

            case 6002:
                logs = "Failed to set alias and tags due to timeout. Try again after 60s.";
                Log.i(TAG, logs);
                if (JPushUtil.isConnected(getApplicationContext())) {
                    mJPushHandler.sendMessageDelayed(mJPushHandler.obtainMessage(MSG_SET_TAGS, tags), 1000 * 60);
                } else {
                    Log.i(TAG, "No network");
                }
                break;

            default:
                logs = "Failed with errorCode = " + code;
                Log.e(TAG, logs);
        }
        JPushUtil.showToast(logs, getApplicationContext());
    }

};

在上面的代码都加上之后,开始设置别名或者TAG:

//设置别名
String alias = GlobalConstantHolder.USER_ID;
if (TextUtils.isEmpty(alias)) {
    //如果非登陆状态不设置别名
}else{
    //调用JPush API设置Alias
    mJPushHandler.sendMessage(mJPushHandler.obtainMessage(MSG_SET_ALIAS, alias));
}

后台也要集成极光推送,发送的时候选择推送的范围就行了,一般把userId作为alias或者Tag来发送,和后台商量好就行。