美文网首页android基础Android 开发技术分享
安卓进阶第三篇之腾讯信鸽推送的简单使用

安卓进阶第三篇之腾讯信鸽推送的简单使用

作者: 起个牛逼的昵称 | 来源:发表于2016-08-23 11:31 被阅读3489次

    由于Android暂时没办法使用系统级的推送服务,再加上千奇百怪的第三方rom,所以我们不得不选择一款成
    熟的第三方平台做我们的推送服务。现在市场上的推送平台很多,比如信鸽、极光、小米、友盟、阿里推送等,由于自己的项目中使用的是信鸽推送,所以我就简单说说使用信鸽推送的流程。

    1.首先第一步,在信鸽官网 (http://xg.qq.com)注册账号并登录,然后点击“介入推送应用”

    登录成功后就可以看到

    2.输入应用名称、包名并选择所属分类,点击“接入应用”

    注意:包名不要写错

    3.提示成功之后在应用列表界面就可以看到创建的应用了

    新创建的应用

    4.创建好了应用,接下来就是在项目中的使用了,首先下载信鸽的sdk

    点击下载sdk

    5.解压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开发指南》,其实文档已经写得很详细了,只要我们仔细阅读文档,实现我们想要的功能还是不难的。

    相关文章

      网友评论

      • 鼓励自己前进:我这里点击通知后,每次都是打开欢迎界面的activity,这是为什么呢
      • c67720c9e4c0:请问:<!-- 【必须】 提高 Service 的存活率 -->
        <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)
        起个牛逼的昵称:@紫_11c2 jar 没导入吧
      • 68f8fdbbde41:请问,你的demo在小米 6.0.1的系统上通知栏有推送吗
        起个牛逼的昵称:@Flippey 小米6.0.1上还没测试过 Intent service = new Intent(context, XGPushService.class);
        context.startService(service); 你可以在注册信鸽推送的时候,加上这句试试

      本文标题:安卓进阶第三篇之腾讯信鸽推送的简单使用

      本文链接:https://www.haomeiwen.com/subject/aqrgsttx.html