首先,在官网新建应用配置好,会有一个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来发送,和后台商量好就行。