集成极光推送

创建极光推送开发者帐号

要创建极光推送开发者帐号,请访问极光推送官方网站https://www.jiguang.cn/push

这里写图片描述

Portal上创建应用

使用注册账号登陆,进入极光控制台后,点击“创建应用”按钮。创建帐号进入极光推送后,首先显示的是创建应用的界面。填上你的应用程序的名称,以及 Android包名这二项就可以了。

这里写图片描述

下载应用Example

点击 ”下载应用Example “

这里写图片描述

你将下载到一个 .zip 压缩文件。解压后,即看到一个同名目录。这个目录下,是一个 Android 项目里的所有文件。

这里写图片描述

把 Example 导入 Android Studio 里

在 Android Studio 中,新建一个项目。 通过 import module 导入 JPush Example

这里写图片描述

运行 Example 这个应用

导入 module 后在 Android studio 内运行到指定设备上。

这里写图片描述

如果你的 Android 手机接在电脑上了,则这个 JPush Example 应用就可以安装上,并运行起来了。
做下一步动作之前,请确保你的手机上的网络是可用的。

Portal上推送通知

这里写图片描述

手机上收到通知

在上述步骤安装 JPush Example 的手机上,你就可以收到推送的通知了。

这里写图片描述

集成步骤

解压缩 jpush-android-release-3.x.y.zip 集成压缩包。
复制 libs/jcore-android_v1.x.y.jar 到工程 libs/ 目录下。
复制 libs/jpush-android_v3.x.y.jar 到工程 libs/ 目录下。
复制 libs/(cpu-type)/libjcore1xy.so 到你的工程中存放对应cpu类型的目录下。
复制 res/ 中drawable-hdpi, layout, values文件夹中的资源文件到你的工程中 res/ 对应同名的目录下。

说明 1:若没有res/drawable-xxxx/jpush_notification_icon这个资源默认使用应用图标作为通知icon,在5.0以上系统将应用图标作为statusbar icon可能显示不正常,用户可定义没有阴影和渐变色的icon替换这个文件,文件名不要变。
说明 2:使用android studio的开发者,如果使用jniLibs文件夹导入so文件,则仅需将所有cpu类型的文件夹拷进去;如果将so文件添加在module的libs文件夹下,注意在module的gradle配置中添加一下配置:

android {
        ......
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
                ......
            }
            ......
        }
        ......
    }

配置 AndroidManifest.xml

根据 SDK 压缩包里的 AndroidManifest.xml 样例文件,来配置应用程序项目的 AndroidManifest.xml 。
主要步骤为:
复制备注为 “Required” 的部分
将标注为“您应用的包名”的部分,替换为当前应用程序的包名
将标注为“您应用的Appkey”的部分,替换为在Portal上注册该应用的的Key,例如:9fed5bcb7b9b87413678c407
小帖士
如果使用android studio, 可在AndroidManifest中引用applicationId的值,在build.gradle配置中 defaultConfig节点下配置,如:

defaultConfig {
      applicationId "cn.jpush.example" // <--您应用的包名
      ……
 }

在AndroidManifest中使用 ${applicationId} 引用gradle中定义的包名
AndroidManifest 示例

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="您应用的包名"
    android:versionCode="300"
    android:versionName="3.0.0"
    >
    <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="23" />

    <!-- Required -->
    <permission 
        android:name="您应用的包名.permission.JPUSH_MESSAGE"  
        android:protectionLevel="signature" />

    <!-- Required -->
    <uses-permission android:name="您应用的包名.permission.JPUSH_MESSAGE" />
    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <!-- Optional. Required for location feature -->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:name="Your Application Name">

        <!-- Required SDK 核心功能-->
        <!-- 可配置android:process参数将PushService放在其他进程中 -->
        <service
            android:name="cn.jpush.android.service.PushService"
            android:enabled="true"
            android:exported="false" >
            <intent-filter>
                <action android:name="cn.jpush.android.intent.REGISTER" />
                <action android:name="cn.jpush.android.intent.REPORT" />
                <action android:name="cn.jpush.android.intent.PushService" />
                <action android:name="cn.jpush.android.intent.PUSH_TIME" />
            </intent-filter>
        </service>

        <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
        <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
         <service
             android:name="cn.jpush.android.service.DaemonService"
             android:enabled="true"
             android:exported="true">
             <intent-filter >
                 <action android:name="cn.jpush.android.intent.DaemonService" />
                 <category android:name="您应用的包名"/>
             </intent-filter>
         </service>

        <!-- Required SDK核心功能-->
        <receiver
            android:name="cn.jpush.android.service.PushReceiver"
            android:enabled="true" >
          <intent-filter android:priority="1000"> 
                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> 
                <category android:name="您应用的包名"/> 
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
            <!-- Optional -->
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>

        <!-- Required SDK核心功能-->
        <activity
            android:name="cn.jpush.android.ui.PushActivity"
            android:configChanges="orientation|keyboardHidden"
            android:theme="@android:style/Theme.NoTitleBar"
            android:exported="false" >
            <intent-filter>
                <action android:name="cn.jpush.android.ui.PushActivity" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="您应用的包名" />
            </intent-filter>
        </activity>

        <!-- Required SDK核心功能-->
        <service
            android:name="cn.jpush.android.service.DownloadService"
            android:enabled="true"
            android:exported="false" >
        </service>

        <!-- Required SDK核心功能-->
        <receiver android:name="cn.jpush.android.service.AlarmReceiver" />

        <!-- User defined. 用户自定义的广播接收器-->
         <receiver
             android:name="您自己定义的Receiver"
             android:enabled="true">
             <intent-filter>
                 <!--Required 用户注册SDK的intent-->
                 <action android:name="cn.jpush.android.intent.REGISTRATION" /> 
                 <!--Required 用户接收SDK消息的intent--> 
                 <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> 
                 <!--Required 用户接收SDK通知栏信息的intent-->
                 <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> 
                 <!--Required 用户打开自定义通知栏的intent-->
                 <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> 
                 <!-- 接收网络变化 连接/断开 since 1.6.3 -->
                 <action android:name="cn.jpush.android.intent.CONNECTION" />
                 <category android:name="您应用的包名" />
             </intent-filter>
         </receiver>

        <!-- Required. For publish channel feature -->
        <!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道。-->
        <!-- 例如: -->
        <!-- 发到 Google Play 的APK可以设置为 google-play; -->
        <!-- 发到其他市场的 APK 可以设置为 xxx-market。 -->
        <!-- 目前这个渠道统计功能的报表还未开放。-->
        <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
        <!-- Required. AppKey copied from Portal -->
        <meta-data android:name="JPUSH_APPKEY" android:value="您应用的Appkey"/>  </>值来自开发者平台取得的AppKey-->
    </application>
</manifest>
必须权限说明

权限                                      用途
You Package.permission.JPUSH_MESSAGE    官方定义的权限,允许应用接收JPUSH内部代码发送的广播消息。
RECEIVE_USER_PRESENT    允许应用可以接收点亮屏幕或解锁广播。
INTERNET    允许应用可以访问网络。
WAKE_LOCK   允许应用在手机屏幕关闭后后台进程仍然运行
READ_PHONE_STATE    允许应用访问手机状态。
WRITE_EXTERNAL_STORAGE  允许应用写入外部存储。
READ_EXTERNAL_STORAGE   允许应用读取外部存储。
WRITE_SETTINGS  允许应用读写系统设置项。
VIBRATE 允许应用震动。
MOUNT_UNMOUNT_FILESYSTEMS   允许应用挂载/卸载 外部文件系统。
ACCESS_NETWORK_STATE    允许应用获取网络信息状态,如当前的网络连接是否有效。

集成 JPush Android SDK 的混淆

请下载4.x及以上版本的proguard.jar, 并替换你Android Sdk “tools\proguard\lib\proguard.jar”
请在工程的混淆文件中添加以下配置:

-dontoptimize
-dontpreverify

-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }

-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }

v2.0.5 ~ v2.1.7 版本有引入 gson 和 protobuf ,增加排除混淆的配置。(2.1.8版本不需配置)

#==================gson && protobuf==========================
-dontwarn com.google.**
-keep class com.google.gson.** {*;}
-keep class com.google.protobuf.** {*;}

以下代码定制一个本应用程序 Application 类。需要在 AndoridManifest.xml 里配置。请参考上面 AndroidManifest.xml 片断,或者 example 项目。

public class ExampleApplication extends Application {
@Override
    public void onCreate() {
        super.onCreate();
        JPushInterface.setDebugMode(true);  // 设置开启日志,发布时请关闭日志
        JPushInterface.init(this);          // 初始化 JPush
    }
}

通过以上步骤就可以实现 简单的基本消息推送 (MyReceiver 继承广播 之后
用于接收推送消息
* 点击通知后可以知道通知里面是什么内容)
*

/**
 * Created by zhang on 2017/2/14.
 * 用于接收推送消息
 *  点击通知后可以知道通知里面是什么内容
 */

public class MyReceiver extends BroadcastReceiver {
    private static final String TAG = "MyJpushReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle bundle = intent.getExtras();
        Log.d(TAG, "onReceive - " + intent.getAction());

        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);
            System.out.println("[MyReceiver] 接收Registration Id : " + regId);

        }else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "收到了自定义消息。消息内容是:" + bundle.getString(JPushInterface.EXTRA_MESSAGE));
            System.out.println("收到了自定义消息。消息内容是:" + bundle.getString(JPushInterface.EXTRA_MESSAGE));

            // 自定义消息不会展示在通知栏,完全要开发者写代码去处理
        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "收到了通知");
            System.out.println("收到了通知 : ");
            // 在这里可以做些统计,或者做些其他工作
        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Log.d(TAG, "用户点击打开了通知");
            // 在这里可以自己写代码去定义用户点击后的行为


//            Intent i = new Intent(context, TestActivity.class);  //自定义打开的界面
//            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//            context.startActivity(i);

            String string = bundle.getString(JPushInterface.EXTRA_EXTRA);
            System.out.println("附加字段 : " + string);


        } else {
            Log.d(TAG, "Unhandled intent - " + intent.getAction());
        }

    }

以上内容就完成了 消息推送的 内容运行 应用程序后 可通过极光后台来进行推送消息检测

示例代码 : http://download.csdn.net/detail/q9104422999/9754826


别名与标签 API

  JPushInterface.setAliasAndTags(getApplicationContext(), SharePreferenceUtil.getInstance(this).getMyLoginPhoneNum(), null, tagAliasCallback);

    //设置标签和别名回调结果
    TagAliasCallback tagAliasCallback = new TagAliasCallback() {
        @Override
        public void gotResult(int code, String s, Set<String> set) {
            switch (code) {
                case 0:
                    Log.i("tag", "Set tag and alias success");
                    break;
                case 6002:
                    Log.i("tag", "Failed to set alias and tags due to timeout. Try again after 60s.");
                    if (isConnected()) {
                        mHandler.sendMessageDelayed(mHandler.obtainMessage(1010101, SharePreferenceUtil.getInstance(getApplicationContext()).getMyLoginPhoneNum()), 1000 * 60);
                    } else {
                        Log.i("tag", "No network");
                    }
                    break;
                default:
                    Log.e("tag", "Failed with errorCode = " + code);
            }
        }
    };
 //判断是否联网
    public boolean isConnected() {
        ConnectivityManager conn = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = conn.getActiveNetworkInfo();
        return (info != null && info.isConnected());
    }

注意 :

设置标签别名请注意处理call back结果。只有call back 返回值为 0 才设置成功,
才可以向目标推送。否则服务器 API 会返回1011错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值