由于Android暂时没办法使用系统级的推送服务,再加上千奇百怪的第三方rom,所以我们不得不选择一款成
熟的第三方平台做我们的推送服务。现在市场上的推送平台很多,比如信鸽、极光、小米、友盟、阿里推送等,由于自己的项目中使用的是信鸽推送,所以我就简单说说使用信鸽推送的流程。
1.首先第一步,在信鸽官网 (http://xg.qq.com)注册账号并登录,然后点击“介入推送应用”
2.输入应用名称、包名并选择所属分类,点击“接入应用”
注意:包名不要写错3.提示成功之后在应用列表界面就可以看到创建的应用了
新创建的应用4.创建好了应用,接下来就是在项目中的使用了,首先下载信鸽的sdk
点击下载sdk5.解压sdk
6.先看看注意事项,毕竟都写了“必读”是吧(一定要看哈!)
7.集成到项目中也很简单,打开官方文档
http://developer.xg.qq.com/wiki/xg/Android%E6%8E%A5%E5%85%A5/Android%20SDK%E5%BF%AB%E9%80%9F%E6%8E%A5%E5%85%A5/Android%20SDK%E5%BF%AB%E9%80%9F%E6%8E%A5%E5%85%A5.html
按照流程一步一步来,文档是已eclipse为例,那现在很多开发者都使用的是Android Studio,那我们就以AS为例:
(1).将信鸽 SDK目录下的libs目录所有文件拷贝到工程的libs目录下并导入项目
(2).添加.so文件
拷贝这个目录下所有的文件 将拷贝的文件放到jinLibs文件夹下面(3).打开Androidmanifest.xml,添加以下配置(建议参考下载的sdk里面demo的配置文件)
<!-- 【必须】 信鸽SDK所需权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 【常用】 信鸽SDK所需权限 -->
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 【可选】 信鸽SDK所需权限 -->
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<!-- 【必须】 (2.30及以上版新增)展示通知的activity -->
<activity
android:name="com.tencent.android.tpush.XGPushActivity"
android:theme="@android:style/Theme.Translucent"
android:exported="false" >
<intent-filter>
<!-- 若使用AndroidStudio,请设置android:name="android.intent.action"-->
<action android:name="" />
</intent-filter>
</activity>
<!-- 【必须】 信鸽receiver广播接收 -->
<receiver
android:name="com.tencent.android.tpush.XGPushReceiver"
android:process=":xg_service_v2" >
<intent-filter android:priority="0x7fffffff" >
<!-- 【必须】 信鸽SDK的内部广播 -->
<action android:name="com.tencent.android.tpush.action.SDK" />
<action android:name="com.tencent.android.tpush.action.INTERNAL_PUSH_MESSAGE" />
<!-- 【必须】 系统广播:网络切换 -->
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<!-- 【可选】 系统广播:开屏 -->
<action android:name="android.intent.action.USER_PRESENT" />
<!-- 【可选】 一些常用的系统广播,增强信鸽service的复活机会,请根据需要选择。当然,你也可以添加APP自定义的一些广播让启动service -->
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
<!-- 【可选】 usb相关的系统广播,增强信鸽service的复活机会,请根据需要添加 -->
<intent-filter android:priority="0x7fffffff" >
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
<action android:name="android.intent.action.MEDIA_CHECKING" />
<action android:name="android.intent.action.MEDIA_EJECT" />
<data android:scheme="file" />
</intent-filter>
</receiver>
<!-- 【必须】 信鸽service -->
<service
android:name="com.tencent.android.tpush.service.XGPushService"
android:exported="true"
android:persistent="true"
android:process=":xg_service_v2" />
<!-- 【必须】 通知service,其中android:name部分要改为当前包名 -->
<service
android:name="com.tencent.android.tpush.rpc.XGRemoteService"
android:exported="true" >
<intent-filter>
<!-- 【必须】 请修改为当前APP名包.PUSH_ACTION,如demo的包名为:com.qq.xgdemo -->
<action android:name="com.qq.xgdemo.PUSH_ACTION" />
</intent-filter>
</service>
<!-- 已废弃,可删除之;若不删除也不会有任何副作用 -->
<!--<service
android:name="com.tencent.android.tpush.service.XGDaemonService"
android:process=":qq_push_daemon" />
-->
<!-- 【可选】信鸽拉起其他APP应用,若应用在本地找不到可以自动下载 -->
<!--
<service
android:name="com.tencent.android.tpush.XGDownloadService"
android:enabled="true"
android:exported="false" />
-->
<!-- 【可选】APP实现的Receiver,用于接收消息透传和操作结果的回调,请根据需要添加 -->
<!-- YOUR_PACKAGE_PATH.CustomPushReceiver需要改为自己的Receiver: -->
<receiver android:name="com.qq.xgdemo.receiver.MessageReceiver"
android:exported="true" >
<intent-filter>
<!-- 接收消息透传 -->
<action android:name="com.tencent.android.tpush.action.PUSH_MESSAGE" />
<!-- 监听注册、反注册、设置/删除标签、通知被点击等处理结果 -->
<action android:name="com.tencent.android.tpush.action.FEEDBACK" />
</intent-filter>
</receiver>
<!-- 【必须】 请修改为APP的AccessId,“21”开头的10位数字,中间没空格 -->
<meta-data
android:name="XG_V2_ACCESS_ID"
android:value="2100047428" />
<!-- 【必须】 请修改为APP的AccessKey,“A”开头的12位字符串,中间没空格 -->
<meta-data
android:name="XG_V2_ACCESS_KEY"
android:value="AKH3A5485ETM" />
注意上面的注释,自己看,需要修改的地方已经写的很清楚了。
(4).启动并注册APP,打开工程的主Activity,在其onCreate(Bundle savedInstanceState)重载方法内,添加以下代码,完成信鸽服务的启动与APP注册过程(当然不是非要写在oncreate方法里面,根据自己的项目需要,自己可以修改位置)。
/**
* 账号注册信鸽推送
*/
private void getXGPushReceiver() {
Context context = getApplicationContext();
final PreferenceStorage ps = new PreferenceStorage(context);
// 开启logcat输出,方便debug,发布时请关闭
XGPushConfig.enableDebug(this, true);
// 获取信鸽token
XGPushManager.registerPush(context, ps.getUsername(), new XGIOperateCallback() { @Override
public void onSuccess(Object data, int flag)
{
String mToken = (String) data;
LogUtils.d("TPush", "获取token:" + mToken);
}
@Override
public void onFail(Object data, int errCode, String msg)
{
Log.d(TAG, "获取token失败:");
}
});
//(2.36之前的版本)已知MIUI V6上会禁用所有静态广播,若出现有类似的情况,请添加以下代码兼容该系统。
Intent service = new Intent(context, XGPushService.class); context.startService(service);}
我这里选择的是使用账号进行注册,当然也可以选择使用APP进行注册(只需要修改注册的方法XGPushManager.registerPush(context)),不传用户名就可以啦,那么两种不同的注册方式有什么区别呢,我是这么理解的,如果使用账号进行注册,则只有这个账号登录后才可以收到推送,如果使用APP注册,则不管是哪个账号登录的,都可以收到推送。
(5).代码嵌入完成后,启动APP,如果在logcat中的TPush标签看到以下类似的输出,说明已经注册成功,并返回token。注意:Android Token长度为40位
(6).去管理台推送验证
前往信鸽前台,选择“创建通知”,输入“标题”和“内容”,点击“确认推送”。稍等几秒后,如果顺利的话,终端设备应该能够收到这条通知。此时,APP已经具备接收通知推送的能力。
(7) .可能碰到的问题解决方法
1.设备是否正常联网?
2.检查AndroidManifest.xml是否配置正确?(建议直接参考demo的例子改)
- accessId、accessKey设置是否与前台注册的一致?
- 相关权限是否齐全?
- receiver、service和activity相关组件是否配置好?
3.设备是否注册成功?
4.当前APP包名是否与前台注册的一致,如果不一致请在前台选中“使用多包名”选项?
5.前台下发通知时,“时段控制”选项里的时间段是否符合终端设备当前时间?
6.2.30及以上版本请检查xml配置文件是否添加com.tencent.android.tpush.XGPushActivity相关的内容
7.停留在后台的APP点击通知不能打开APP:被打开的activity(特别是LAUNCHER)启动模式为SingleTop,SingleTask或SingleInstance,请在该activity重载onNewIntent方法:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);// 必须要调用这句
}
8.对于使用AndriodStudio的同学,若AndroidManifest.xml编译不通过,XGPushActivity配置改为:
<action android:name="android.intent.action"/>
9.请检查AndroidManifest.xml是否已正确配置XGRemoteService,且intent-filter中是否正确设置:
<action android:name="应用包名.PUSH_ACTION"/>应用包名为当前APP包名,如com.tencent.xgdemo
10.是否已设置APP默认的icon?由于系统原因,若没有icon,通知将不能展示。
11.(2.36之前的版本)已知MIUI V6上会禁用所有静态广播,若出现有类似的情况,请添加以下代码兼容该系统。
// 在XGPushManager.registerPush(context)或其它版本的注册接口之后调用以下代码
// 使用ApplicationContext
Context context = getApplicationContext();
Intent service = new Intent(context, XGPushService.class);
context.startService(service);
12.点击通知,出现不能打开activity的情况,请在AndroidManifest.xml中将XGPushActivity的exported属性设置为true。
13.点击通知,出现重复打开APP的情况,请将被打开的Activity启动模式改为SingleTop,SingleTask或SingleInstance。
差不多就是这么多了,如果还需要更多的高级功能, 可以再仔细看看 《SDK开发指南》,其实文档已经写得很详细了,只要我们仔细阅读文档,实现我们想要的功能还是不难的。
网友评论
<service android:name="com.tencent.android.tpush.rpc.XGRemoteService"
android:exported="true" >
<intent-filter>
<!-- 【必须】 请修改为当前 APP 名包.PUSH_ACTION,如 demo 的包名为:com.qq.xgdemo -->
<action android:name="com.xxxx.xxx.PUSH_ACTION" />
</intent-filter>
</service>
我这样配置后,为什么会出现这个错误:
#72 java.lang.ClassNotFoundException
Didn't find class "com.tencent.android.tpush.rpc.XGRemoteService" on path: DexPathList[[zip file "/data/app/com.powerfox.qp.klmj-1/base.apk"],nativeLibraryDirectories=[/data/app/com.powerfox.qp.klmj-1/lib/arm, /vendor/lib, /system/lib]]
android.app.ActivityThread.handleCreateService(ActivityThread.java:2782)
context.startService(service); 你可以在注册信鸽推送的时候,加上这句试试