之前没有接入过个推,现在总结下接入个推的坑。接入文档就不说了,官方已经很详细了。
下面只说重点和遇到的坑
1. build.gradle配置文件
manifestPlaceholders = [
GETUI_APP_ID : "APP_ID",
GETUI_APP_KEY : "APP_KEY",
GETUI_APP_SECRET : "APP_SECRET"
]
2. 通知栏图标
最好和官方说的尺寸一样,重点是命名,客户端图片名字要和公司服务器配置推送的图标一样,比如getui_push.png。要两端一致,不能有改动。
3.模拟器上要运行程序需要加些配置,但加了个推就失效了
/**
* 运行到真机上,必须注释掉下面代码,否则所有推送设置失效
*/
// splits {
// abi {
// enable true
// reset()
// include 'x86', 'armeabi-v7a','x86_64'
// universalApk true
// }
// }
4.处理信息地方(只能处理透传信息,通知栏的标题和内容是处理不到的)
@Override
public void onReceiveMessageData(Context context, GTTransmitMessage msg) {
String appid = msg.getAppid();
String taskid = msg.getTaskId();
String messageid = msg.getMessageId();
byte[] payload = msg.getPayload();
String pkg = msg.getPkgName();
String cid = msg.getClientId();
// 第三方回执调用接口,actionid范围为90000-90999,可根据业务场景执行
boolean result = PushManager.getInstance().sendFeedbackMessage(context, taskid, messageid, 90001);
if (payload == null) {
Log.e(TAG, "receiver payload = null");
} else {
sendMessage(new String(payload), 0);
}
}
private void sendMessage(String data, int what) {
Message msg = Message.obtain();
msg.what = what;
msg.obj = data;
MyApplication.sendMessage(msg);
}
在MyApplication处理信息,显示等操作
public class PushHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
//处理推送信息
if (null != msg.obj) {
String msgCustom = (String) msg.obj;
ToastUtils.showLong(sContext,msgCustom);
LogUtils.i("msgCustom", msgCustom);
}
}
}
}
5.应用前台,后台运行,不运行(这只是finish所有Activity,没有关闭进程)判断。注:关闭进程是收不到推送
经常需要用到前台和后台处理不同的逻辑的。项目中用到的是通知栏绑定透传信息+透传信息来处理
/** * 辅助返回应用启动状态 */ private int checkAppRunning(Context context) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(100); for (ActivityManager.RunningTaskInfo info : list) { if (info.baseActivity.getPackageName().equals(MY_PKG_NAME)) { return APP_BASE;//不用,经常有问题 } if (info.topActivity.getPackageName().equals(MY_PKG_NAME)) { return APP_TOP;//不用,经常有问题 } } return APP_NOT_STARTED;//可用,用来返回不运行状态,但没有关闭进程的 }
public int isRunningForeground(Context context){
String packageName=getPackageName(context);
String topActivityClassName=getTopActivityName(context);
//System.out.println("packageName="+packageName+",topActivityClassName="+topActivityClassName);
if (packageName!=null&&topActivityClassName!=null&&topActivityClassName.startsWith(packageName)) {
//System.out.println("---> isRunningForeGround");
return APP_TOP; //前台运行,用户正在用
} else {
//System.out.println("---> isRunningBackGround");
return APP_BASE; //后台运行,用户在用其他应用
}
}
public String getTopActivityName(Context context){
String topActivityClassName=null;
ActivityManager activityManager =
(ActivityManager)(context.getSystemService(android.content.Context.ACTIVITY_SERVICE )) ;
List<ActivityManager.RunningTaskInfo> runningTaskInfos = activityManager.getRunningTasks(1) ;
if(runningTaskInfos != null){
ComponentName f=runningTaskInfos.get(0).topActivity;
topActivityClassName=f.getClassName();
}
return topActivityClassName;
}
public String getPackageName(Context context){
String packageName = context.getPackageName();
return packageName;
}
6.有时点击通知栏不启动收起问题
/**
*
* 收起通知栏
* @param context
*/
public static void collapseStatusBar(Context context) {
try {
Object statusBarManager = context.getSystemService("statusbar");
Method collapse;
if (Build.VERSION.SDK_INT <= 16) {
collapse = statusBarManager.getClass().getMethod("collapse");
} else {
collapse = statusBarManager.getClass().getMethod("collapsePanels");
}
collapse.invoke(statusBarManager);
} catch (Exception localException) {
localException.printStackTrace();
}
}
差不多遇到的问题就这些,还有问题或者不对的,加我QQ:893151960