Android:Umeng(友盟)消息推送(二)
在已集成友盟统计的情况下:Android:Umeng(友盟)数据统计(一)
第一步:
个人中心---U-Push(消息推送)---添加新应用---从已有应用中添加 如图:
获得Appkey和secret:
第三步:
下载消息推送SDK:http://dev.umeng.com/push/android/sdk-download
第四步:
把下载的SDK里面的PushSDK当做Module导入自己的项目
第五步:
将PushSDKModule包下的manifest中的${applicationId}修改为app对应的包名,如图:
app包名可在build.gradle中找到:
第六步:
在PushSDKModule包下的manifest中添加Appkey和secret:
第七步:
在App入口(Application,此处BaseApplication为自己定义)中添加(结合上一篇文章统计分析):
public class BaseApplication extends Application{ @Override public void onCreate() { super.onCreate(); initYoumeng(); } private void initYoumeng() { //------------------友盟统计---------------------- //禁止默认的页面统计方式 MobclickAgent.openActivityDurationTrack(false); /** 设置是否对日志信息进行加密, 默认false(不加密). */ AnalyticsConfig.enableEncrypt(!BuildConfig.DEBUG); //捕获程序崩溃日志 MobclickAgent.setCatchUncaughtExceptions(true); //------------------友盟推送------------------ final PushAgent mPushAgent = PushAgent.getInstance(this); //开启推送并设置注册的回调处理 mPushAgent.enable(new IUmengRegisterCallback() { @Override public void onRegistered(String registrationId) { //onRegistered方法的参数registrationId即是device_token } }); }}
第八步:
统计应用启动数据,在主Activity中添加(此处的BaseActivity为所有Activity的父类):
public class BaseActivity extends AppCompatActivity{ protected Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = getApplicationContext(); //友盟统计应用启动数据 PushAgent.getInstance(mContext).onAppStart(); } @Override protected void onResume() { super.onResume(); MobclickAgent.onResume(this);//友盟统计 } @Override protected void onPause() { super.onPause(); MobclickAgent.onPause(this);//友盟统计 }}
至此简单的消息推送集成完成。
测试:
通过mPushAgent.isEnabled()
来查询状态。状态表示有没有启用/关闭推送功能, 不表示推送后台服务的运行状态。
通过UmengRegistrar.getRegistrationId(context)来获取设备的device_token
进入友盟消息推送界面,选择测试模式,添加设备:
填写设备名称即获取到的device_token,即可开始测试;
深入了解 自定义消息处理:
实现一个类,继承 UmengBaseIntentService, 重写onMessage(Context context, Intent intent) 方法,并调用super.onMessage(context, intent)。
public class YouMengPushIntentService extends UmengBaseIntentService{ @Override protected void onMessage(Context context, Intent intent) { super.onMessage(context, intent); try { Intent data = new Intent(intent); data.setClass(context, DialogActivity.class); data.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//需为Intent添加Flag:Intent.FLAG_ACTIVITY_NEW_TASK,否则无法启动Activity。 context.startActivity(data); } catch (Exception e) { e.printStackTrace(); } }}
public class DialogActivity extends BaseActivity{ public static final String TAG = "DialogActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { //可以通过MESSAGE_BODY取得消息体 final String message = getIntent().getStringExtra(BaseConstants.MESSAGE_BODY); if (TextUtils.isEmpty(message)) return; final UMessage msg = new UMessage(new JSONObject(message)); UTrack.getInstance(mContext).trackMsgClick(msg); Map extra = msg.extra; Log.d(TAG, "message=" + message); //消息体 Log.d(TAG, "custom="+msg.custom); //自定义消息的内容 Log.d(TAG, "title="+msg.title); //通知标题 Log.d(TAG, "text=" + msg.text); //通知内容 AlertDialog dialog; if (null != extra && extra.containsKey("msgType")) dialog = new AlertDialog.Builder(this) .setTitle("消息提示") .setMessage(msg.text) .setCancelable(false) .setPositiveButton("确认", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .create(); else dialog = new AlertDialog.Builder(this) .setTitle("消息提示") .setMessage(msg.text) .setCancelable(false) .setPositiveButton("确认", null) .create(); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { onBackPressed(); } }); dialog.show(); } catch (Exception e) { e.printStackTrace(); } }}
在app AndroidManifest.xml 中声明:
别忘了app AndroidManifest.xml 中声明 DialogActivity:
在Application中调用:
mPushAgent.setPushIntentServiceClass(YouMengPushIntentService.class);
结合之前的代码,如图:
private void initYoumeng() { //------------------友盟统计---------------------- //禁止默认的页面统计方式 MobclickAgent.openActivityDurationTrack(false); /** 设置是否对日志信息进行加密, 默认false(不加密). */ AnalyticsConfig.enableEncrypt(!BuildConfig.DEBUG); //捕获程序崩溃日志 MobclickAgent.setCatchUncaughtExceptions(true); //------------------友盟推送------------------ final PushAgent mPushAgent = PushAgent.getInstance(this); //开启推送并设置注册的回调处理 mPushAgent.enable(new IUmengRegisterCallback() { @Override public void onRegistered(String registrationId) { //onRegistered方法的参数registrationId即是device_token } });// Toast.makeText(this, mPushAgent.isEnabled() + "", Toast.LENGTH_SHORT).show(); mPushAgent.setPushIntentServiceClass(YouMengPushIntentService.class); }}
注:
1、在onMessage()中,请务必调用super.onMessage(context, intent);否则,后台无法统计消息的到达。
2、打开消息行为的数据统计:默认情况下,SDK将用户点击通知栏的行为定义为“打开消息”。使用PushIntentService自定义处理后,SDK只能记录消息送达的数据,无法记录消息打开的数据。要记录消息打开的数据,你可以在应用中定义打开消息的语义,并使用以下接口向服务器发送消息打开的数据以便统计:UTrack.getInstance(context).trackMsgClick(msg);
3、也可以根据需要对自定义处理的消息进行忽略统计:UTrack.getInstance(context).trackMsgDismissed(msg);
4、如果需要打开Activity,需为Intent添加Flag:Intent.FLAG_ACTIVITY_NEW_TASK,否则无法启动Activity。
5、如果使用了完全自定义处理后,又想恢复成友盟的默认的处理,可以通过如下设置来恢复mPushAgent.setPushIntentServiceClass(null);
更多相关文章
- android主线程报ANR的问题!
- Android(安卓)RabbitMQ入门第一章
- Android消息机制的Handler
- Android输入法框架中按键消息的处理流程
- Android的Message机制(简单小结)
- Android开机自动启动程序设置
- android源码阅读--线程间通信Handler消息机制
- Android中 广播发送 和 接受 的简单示例
- Android的消息机制(异步处理)