集成极光推送

创建极光推送开发者帐号

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

集成极光推送_第1张图片

Portal上创建应用

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

下载应用Example

点击 ”下载应用Example “

集成极光推送_第2张图片

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

集成极光推送_第3张图片

把 Example 导入 Android Studio 里

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

集成极光推送_第4张图片

运行 Example 这个应用

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

集成极光推送_第5张图片

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

Portal上推送通知

集成极光推送_第6张图片

手机上收到通知

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

集成极光推送_第7张图片

集成步骤

解压缩 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 示例


<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" />

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

    
    <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" />

    
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 
    <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">

        
        
        <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>

        
        
         <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>

        
        <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>
            
            <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>

        
        <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>

        
        <service
            android:name="cn.jpush.android.service.DownloadService"
            android:enabled="true"
            android:exported="false" >
        service>

        
        <receiver android:name="cn.jpush.android.service.AlarmReceiver" />

        
         <receiver
             android:name="您自己定义的Receiver"
             android:enabled="true">
             <intent-filter>
                 
                 <action android:name="cn.jpush.android.intent.REGISTRATION" /> 
                  
                 <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> 
                 
                 <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> 
                 
                 <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> 
                 
                 <action android:name="cn.jpush.android.intent.CONNECTION" />
                 <category android:name="您应用的包名" />
             intent-filter>
         receiver>

        
        
        
        
        
        
        <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
        
        <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 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错误。

你可能感兴趣的:(安卓必备知识)