学习使用Android极光消息推送

极光官网:www.jpush.cn
官方指南:http://docs.jpush.io/guideline/android_guide/

下载SDK

地址:http://docs.jpush.io/resources/#android-sdk
选择你需要的进行下载,并导入到的项目中。

配置

依照如下形式在清单文件中添加代码,并把包名和Appkey换成自己的包名。


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="包名"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="14" />
    <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.SYSTEM_ALERT_WINDOW"/>  
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <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" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:name="包名.MyApplication"
        android:theme="@style/AppTheme" >
        <activity
            android:name="你的Activity"
            android:launchMode="singleTask"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>

        
        <activity
            android:name="cn.jpush.android.ui.PushActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:configChanges="orientation|keyboardHidden" >
            <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>


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

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

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

        
        <receiver
            android:name="你的自定义MyReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.REGISTRATION" /> 
                <action android:name="cn.jpush.android.intent.UNREGISTRATION" />  
                <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" />
                <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/>
                <action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" />
                <category android:name="包名" />
            intent-filter>
        receiver>


        
        <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
        <meta-data android:name="JPUSH_APPKEY" android:value="XXX 你的AppKey XXX" /> 

    application>

manifest>

初始化极光推送

自定义application

import cn.jpush.android.api.JPushInterface;
import android.app.Application;

/** 
 * @author yangshuai
 * @version 创建时间:2015-4-13 上午10:16:44 
 * 类说明 :自定义application
 */
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        JPushInterface.setDebugMode(true);//设置显示调试
        JPushInterface.init(this);//初始化API
    }
}

停止推送代码:

JPushInterface.stopPush(getApplicationContext());

恢复推送代码:

JPushInterface.resumePush(getApplicationContext());

自定义Receiver接受推送

/**
 * @author yangshuai
 * @version 创建时间:2015-4-13 上午10:07:10 
 * 类说明 :自定义Receive接受推送
 */
public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        Bundle bundle = arg1.getExtras();

        // 消息标题,对应 API 消息内容的 title 字段,Portal 推送消息界上不作展示
        if (bundle.containsKey(JPushInterface.EXTRA_TITLE)) {
            String titleString = bundle.getString(JPushInterface.EXTRA_TITLE);
        }

        // 附加字段,是个 JSON 字符串,对应 API 消息内容的 extras 字段.
        // 对应 Portal推送消息界面上的“可选设置”里的附加字段
        if (bundle.containsKey(JPushInterface.EXTRA_EXTRA)) {
            String extrasString = bundle.getString(JPushInterface.EXTRA_EXTRA);
        }

        // 内容类型,对应 API 消息内容的 content_type 字段
        if (bundle.containsKey(JPushInterface.EXTRA_CONTENT_TYPE)) {
            String typeString = bundle
                    .getString(JPushInterface.EXTRA_CONTENT_TYPE);
        }

        // 唯一标识消息的 ID, 可用于上报统计等。
        if (bundle.containsKey(JPushInterface.EXTRA_MSG_ID)) {
            String msgIdString = bundle.getString(JPushInterface.EXTRA_MSG_ID);
        }

        /**
         * 对action行为的判断
         */
        if (JPushInterface.ACTION_REGISTRATION_ID.equals(arg1.getAction())) {
            // SDK 向 JPush Server 注册所得到的注册 全局唯一的 ID ,可以通过此 ID 向对应的客户端发送消息和通知。
            String registrationIdString = bundle
                    .getString(JPushInterface.EXTRA_REGISTRATION_ID);

        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(arg1
                .getAction())) {
            System.out.println("收到了自定义消息。消息内容是:"
                    + bundle.getString(JPushInterface.EXTRA_MESSAGE));
            // 自定义消息不会展示在通知栏,完全要开发者写代码去处理

            // 消息内容,对应 API 消息内容的 message 字段,对应 Portal 推送消息界面上的"自定义消息内容”字段
            if (bundle.containsKey(JPushInterface.EXTRA_MESSAGE)) {
                String messageString = bundle
                        .getString(JPushInterface.EXTRA_MESSAGE);
            }
            processCustomMessage(arg0, bundle);//传送内容到主界面上

        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(arg1
                .getAction())) {
            System.out.println("收到了通知");
            // 在这里可以做些统计,或者做些其他工作

            // 通知的标题,对应 API 通知内容的 n_title 字段,对应 Portal 推送通知界面上的“通知标题”字段
            String notificationTileString = bundle
                    .getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
            // 通知内容,对应 API 通知内容的 n_content 字段,对应 Portal 推送通知界面上的“通知内容”字段
            String alertString = bundle.getString(JPushInterface.EXTRA_ALERT);
            // 通知栏的Notification ID,可以用于清除Notification
            int notificationId = bundle
                    .getInt(JPushInterface.EXTRA_NOTIFICATION_ID);

        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(arg1
                .getAction())) {
            System.out.println("用户点击打开了通知");
            // 在这里可以自己写代码去定义用户点击后的行为
            Toast.makeText(arg0, "你表点人家啦。。。。", Toast.LENGTH_SHORT).show();
            JPushInterface.reportNotificationOpened(arg0,
                    bundle.getString(JPushInterface.EXTRA_MSG_ID));// 用于上报用户的通知栏被打开

        } else if (JPushInterface.ACTION_CONNECTION_CHANGE.equals(arg1
                .getAction())) {// 网络断开,连接
            boolean connected = arg1.getBooleanExtra(
                    JPushInterface.EXTRA_CONNECTION_CHANGE, false);
            // Toast.makeText(arg0, "网络连接" + connected,
            // Toast.LENGTH_SHORT).show();

        } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(arg1
                .getAction())) {
            // 接受富推送

            // 富文本页面 Javascript 回调API,获取参数参数 ”params“
            if (bundle.containsKey(JPushInterface.EXTRA_EXTRA)) {
                String params = arg1.getStringExtra(JPushInterface.EXTRA_EXTRA);
            }

            // 富媒体通消息推送下载后的文件路径和文件名。
            if (bundle.containsKey(JPushInterface.EXTRA_RICHPUSH_FILE_PATH)) {
                String filePathString = bundle
                        .getString(JPushInterface.EXTRA_RICHPUSH_FILE_PATH);
            }

            // 富媒体通知推送下载的HTML的文件路径,用于展现WebView。
            if (bundle.containsKey(JPushInterface.EXTRA_RICHPUSH_HTML_PATH)) {
                String fileHtmlPath = bundle
                        .getString(JPushInterface.EXTRA_RICHPUSH_HTML_PATH);
            }

            // 富媒体通知推送下载的图片资源的文件名,多个文件名用 “,” 分开,路径为 fileHtmlPath
            if (bundle.containsKey(JPushInterface.EXTRA_RICHPUSH_HTML_RES)) {
                String fileImageStr = bundle
                        .getString(JPushInterface.EXTRA_RICHPUSH_HTML_RES);
                String[] fileNames = fileImageStr.split(",");
            }
        } else {
            Log.d("其它的action行为", "Unhandled intent - " + arg1.getAction());
        }
    }

    // send msg to MainActivity
    private void processCustomMessage(Context context, Bundle bundle) {
        if (MainActivity.isForeground) {
            String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
            String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
            Intent msgIntent = new Intent(MainActivity.MESSAGE_RECEIVED_ACTION);
            msgIntent.putExtra(MainActivity.KEY_MESSAGE, message);
            if (!MyUtil.isEmpty(extras)) {
                try {
                    JSONObject extraJson = new JSONObject(extras);
                    if (null != extraJson && extraJson.length() > 0) {
                        msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras);
                    }
                } catch (JSONException e) {

                }

            }
            context.sendBroadcast(msgIntent);
        }
    }

    // 打印所有的 intent extra 数据
    private static String printBundle(Bundle bundle) {
        StringBuilder sb = new StringBuilder();
        for (String key : bundle.keySet()) {
            if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
                sb.append("\nkey:" + key + ", value:" + bundle.getInt(key));
            } else if (key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)) {
                sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key));
            } else {
                sb.append("\nkey:" + key + ", value:" + bundle.getString(key));
            }
        }
        return sb.toString();
    }
}

主要使用方法

公共类,所有的主要方法都在里面,调用即可:

/**
 * @author yangshuai
 * @version 创建时间:2015-4-13 下午4:19:06 类说明 :工具类
 */
public class MyUtil {

    /**
     * 同时设置别名与标签
     * 
     * @param context
     * @param alias
     *            为null时不设置此值,"" (空字符串)表示取消之前的设置,字母(区分大小写)、数字、下划线、汉字,长度限制为 40
     *            字节。(判断长度需采用UTF-8编码)
     * @param tags
     *            为null时不设置此值,空数组或列表表示取消之前的设置,字母(区分大小写)、数字、下划线、汉字,长度限制为 40
     *            字节,最多支持设置 100 个 tag,但总长度不得超过1K字节。(判断长度需采用UTF-8编码)
     * @param callback
     *            在 TagAliasCallback 的 gotResult 方法,返回对应的参数 alias,
     *            tags。并返回对应的状态码:0为成功
     * 
     * @描述 每次调用设置有效的别名,覆盖之前的设置。
     */
    public static void setAliasAndTags(Context context, String alias,
            Set tags, TagAliasCallback callback) {
        JPushInterface.setAliasAndTags(context, alias, tags, callback);
    }

    /**
     * 设置别名
     * 
     * @param context
     * @param alias
     *            "" (空字符串)表示取消之前的设置,字母(区分大小写)、数字、下划线、汉字
     * @param callback
     *            在TagAliasCallback 的 gotResult 方法,返回对应的参数 alias,
     *            tags。并返回对应的状态码:0为成功
     * @描述:每次调用设置有效的别名,覆盖之前的设置。alias 命名长度限制为 40 字节。(判断长度需采用UTF-8编码)
     * 
     */
    public static void setAlias(Context context, String alias,
            TagAliasCallback callback) {
        JPushInterface.setAlias(context, alias, callback);
    }

    /**
     * 设置标签
     * 
     * @param context
     * @param tags
     *            空数组或列表表示取消之前的设置,字母(区分大小写)、数字、下划线、汉字
     * @param callback
     *            在 TagAliasCallback 的 gotResult 方法,返回对应的参数 alias,
     *            tags。并返回对应的状态码:0为成功
     * @描述: 每次调用至少设置一个 tag,覆盖之前的设置,不是新增.每个 tag 命名长度限制为 40 字节,最多支持设置 100 个
     *      tag,但总长度不得超过1K字节。(判断长度需采用UTF-8编码).单个设备最多支持设置 100 个 tag。App 全局 tag
     *      数量无限制。
     */
    public static void setTags(Context context, Set tags,
            TagAliasCallback callback) {
        JPushInterface.setTags(context, tags, callback);
    }

    /**
     * 滤掉无效的 tags
     * @param tags
     * @return 有效的 tag 集合。
     */
    public static Set filterValidTags(Set tags){
        return JPushInterface.filterValidTags(tags);
    }

    /**
     * 设置推送时间
     * 
     * @param context
     *            ApplicationContext
     * @param startHour
     *            int startHour 允许推送的开始时间 (24小时制:startHour的范围为0到23)
     * @param endHour
     *            int endHour 允许推送的结束时间 (24小时制:endHour的范围为0到23)
     * @param integers
     *            0表示星期天,1表示星期一,以此类推。
     *            (7天制,Set集合里面的int范围为0到6),set的值为null,则任何时间都可以收到消息和通知
     *            ,set的size为0,则表示任何时间都收不到消息和通知.
     */
    public static void setPushTime(Context context, int startHour, int endHour,
            Integer... integers) {
        // 设置推送时间
        Set daysIntegers = new HashSet();
        if (integers == null) {
            daysIntegers = null;
        } else {
            for (int i = 0; i < integers.length; i++) {

                daysIntegers.add(integers[i]);
            }
        }
        JPushInterface.setPushTime(context, daysIntegers, startHour, endHour);
    }

    /**
     * 设置通知静默时间段
     * 
     * @param context
     *            ApplicationContext
     * @param startHour
     *            int startHour 静音时段的开始时间 - 小时 (24小时制,范围:0~23 )
     * @param startMinute
     *            int startMinute 静音时段的开始时间 - 分钟(范围:0~59 )
     * @param endHour
     *            int endHour 静音时段的结束时间 - 小时 (24小时制,范围:0~23 )
     * @param endMinute
     *            int endMinute 静音时段的结束时间 - 分钟(范围:0~59 )
     */
    public static void setSilenceTime(Context context, int startHour,
            int startMinute, int endHour, int endMinute) {
        JPushInterface.setSilenceTime(context, startHour, startMinute, endHour,
                endMinute);
    }

    public static class CustomNotificationBuilder {
        private Context context;
        private int number;
        private int layoutId;
        private int iconTipId = -1;
        private int iconShowId = -1;
        private int notificationFlags = -1;
        private int notificationDefaults = 0;

        /**
         * 
         * @param context
         *            Context
         */
        public CustomNotificationBuilder(Context context) {
            super();
            this.context = context;
        }

        /**
         * 设置编号
         * 
         * @param number
         *            编号
         * @return
         */
        public CustomNotificationBuilder setNumber(int number) {
            this.number = number;
            return this;
        }

        /**
         * 设置通知栏显示布局
         * 
         * @param layoutId
         *            布局id
         * @return
         */
        public CustomNotificationBuilder setLayout(int layoutId) {
            this.layoutId = layoutId;
            return this;
        }

        /**
         * 设置最顶层状态栏小图标
         * 
         * @param iconTipId
         *            图片id
         * @return
         */
        public CustomNotificationBuilder setIconTip(int iconTipId) {
            this.iconTipId = iconTipId;
            return this;
        }

        /**
         * 设置下拉状态栏时显示的通知图标
         * 
         * @param iconShowId
         *            图片id
         * @return
         */
        public CustomNotificationBuilder setIconShow(int iconShowId) {
            this.iconShowId = iconShowId;
            return this;
        }

        /**
         * 设置行为
         * 
         * @param flags
         *            例如 Notification.FLAG_AUTO_CANCEL; 自动消失
         * @return
         */
        public CustomNotificationBuilder setFlags(int flags) {
            this.notificationFlags = flags;
            return this;
        }

        /**
         * 设置铃声,震动,提示灯
         * 
         * @param defaults
         *            铃声 Notification.DEFAULT_SOUND; 震动
         *            Notification.DEFAULT_VIBRATE ; 提示灯
         *            Notification.DEFAULT_LIGHTS
         * @return
         */
        public CustomNotificationBuilder setDefaults(int... defaults) {
            for (int i = 0; i < defaults.length; i++) {
                notificationDefaults |= defaults[i];
            }
            return this;
        }

        public void init() {
            // 指定定制的 Notification Layout
            CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(
                    context, layoutId, R.id.custom_push_notification_icon,
                    R.id.custom_push_notification_title,
                    R.id.custom_push_notification_text);
            if (iconTipId != -1) {
                // 指定最顶层状态栏小图标
                builder.statusBarDrawable = iconTipId;
            }
            if (iconShowId != -1) {
                // 指定下拉状态栏时显示的通知图标
                builder.layoutIconDrawable = iconShowId;
            }
            // 设置行为
            if (notificationFlags != -1) {
                builder.notificationFlags = notificationFlags;
            }
            // 设置铃声,震动,提示灯。
            if (notificationDefaults != 0) {
                builder.notificationDefaults = notificationDefaults;
            }

            JPushInterface.setPushNotificationBuilder(number, builder);
        }

    }

    /**
     * 自定义通知栏
     * 
     * @param context
     * @param number
     *            编号
     * @param layoutId
     *            布局Id
     * @param iconTipId
     *            指定最顶层状态栏小图标
     * @param iconShowId
     *            指定下拉状态栏时显示的通知图标
     * @param flags
     *            设置行为
     * @param defaults
     *            设置铃声,震动,提示灯
     * 
     * @params flags 例如 Notification.FLAG_AUTO_CANCEL; 自动消失
     * @params defaults 铃声 Notification.DEFAULT_SOUND; 震动
     *         Notification.DEFAULT_VIBRATE ; 提示灯 Notification.DEFAULT_LIGHTS
     */
    public static void initCustomPushNotificationBuilder(Context context,
            int number, int layoutId, int iconTipId, int iconShowId, int flags,
            int... defaults) {
        CustomNotificationBuilder builder = new CustomNotificationBuilder(
                context);
        builder.setLayout(layoutId);
        builder.setIconTip(iconTipId);
        builder.setIconShow(iconShowId);
        builder.setNumber(number);
        builder.setFlags(flags);
        builder.setDefaults(defaults);
        builder.init();
    }

    /**
     * 自定义通知栏
     * 
     * @param context
     * @param number
     *            编号
     * @param layoutId
     *            布局Id
     * @param iconTipId
     *            指定最顶层状态栏小图标
     * @param iconShowId
     *            指定下拉状态栏时显示的通知图标
     */
    public static void customPushNotification(Context context, int number,
            int layoutId, int iconTipId, int iconShowId) {
        // 指定定制的 Notification Layout
        CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(
                context, layoutId, R.id.custom_push_notification_icon,
                R.id.custom_push_notification_title,
                R.id.custom_push_notification_text);

        // 指定最顶层状态栏小图标
        builder.statusBarDrawable = iconTipId;

        // 指定下拉状态栏时显示的通知图标
        builder.layoutIconDrawable = iconShowId;

        JPushInterface.setPushNotificationBuilder(number, builder);
    }

    /**
     * 自定义通知栏
     * 
     * @param context
     * @param number
     *            编号
     * @param layoutId
     *            布局Id
     */
    public static void customPushNotification(Context context, int number,
            int layoutId) {
        // 指定定制的 Notification Layout
        CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(
                context, layoutId, R.id.custom_push_notification_icon,
                R.id.custom_push_notification_title,
                R.id.custom_push_notification_text);

        // 指定最顶层状态栏小图标
        builder.statusBarDrawable = R.drawable.ic_launcher;

        // 指定下拉状态栏时显示的通知图标
        builder.layoutIconDrawable = R.drawable.ic_launcher;

        JPushInterface.setPushNotificationBuilder(number, builder);
    }

    /**
     * 设置保留最近通知条数
     * 
     * @param context
     * @param maxNum
     *            最多显示的条数
     */
    public static void setLatestNotificationNumber(Context context, int maxNum) {
        JPushInterface.setLatestNotificationNumber(context, maxNum);
    }

    /**
     * 本地通知工具帮助类
     * 
     * @author yangshuai
     * 
     */
    public static class localNotificationBuilder {
        private Context context;
        private JPushLocalNotification ln = new JPushLocalNotification();

        /**
         * getApplicationContext
         * 
         * @param context
         */
        public localNotificationBuilder(Context context) {
            this.context = context;
        }

        /**
         * 设置编号
         * 
         * @param number
         * @return
         */
        public localNotificationBuilder setBuilderId(long number) {
            ln.setBuilderId(number);
            return this;
        }

        /**
         * 设置标题
         * 
         * @param title
         * @return
         */
        public localNotificationBuilder setTitle(String title) {
            ln.setTitle(title);
            return this;
        }

        /**
         * 设置内容
         * 
         * @param content
         * @return
         */
        public localNotificationBuilder setContent(String content) {
            ln.setContent(content);
            return this;
        }

        /**
         * 设置额外的数据信息extras为json字符串
         * 
         * @param extras
         *            Map
         * @return
         */
        public localNotificationBuilder setExtras(Map extras) {
            JSONObject json = new JSONObject(extras);
            ln.setExtras(json.toString());
            return this;
        }

        /**
         * 设置本地通知触发时间
         * 
         * @param broadCastTime
         *            long
         * @return
         */
        public localNotificationBuilder setBroadcastTime(long broadCastTime) {
            ln.setBroadcastTime(broadCastTime);
            return this;
        }

        /**
         * 设置本地通知触发时间
         * 
         * @param date
         *            Date
         * @return
         */
        public localNotificationBuilder setBroadcastTime(Date date) {
            ln.setBroadcastTime(date);
            return this;
        }

        public localNotificationBuilder setBroadcastTime(int year, int month,
                int day, int hour, int minute, int second) {
            ln.setBroadcastTime(year, month, day, hour, minute, second);
            return this;
        }

        /**
         * 设置本地通知的ID
         * 
         * @param notificationId
         * @return
         */
        public localNotificationBuilder setNotificationId(long notificationId) {
            ln.setNotificationId(notificationId);
            return this;
        }

        public void create() {

            JPushInterface.addLocalNotification(context, ln);
        }

    }

    /**
     * 显示本地通知
     * 
     * @param context
     * @param number
     * @param title
     * @param content
     * @param notificationId
     * @param time
     */
    public static void showLocalNotification(Context context, long number,
            String title, String content, long notificationId, long time) {
        MyUtil.localNotificationBuilder builder = new localNotificationBuilder(
                context);
        builder.setBuilderId(number);
        builder.setContent(content);
        builder.setTitle(title);
        builder.setNotificationId(notificationId);
        builder.setBroadcastTime(time);
        builder.create();
    }

    /**
     * 清除所有的通知
     * 
     * @param context
     *            ApplicationContext
     */
    public static void clearAllNotifications(Context context) {
        JPushInterface.clearAllNotifications(context);
    }

    /**
     * 清除指定Id的通知
     * 
     * @param context
     *            ApplicationContext
     * @param notificationId
     *            通知ID
     */
    public static void clearNotificationById(Context context, int notificationId) {
        JPushInterface.clearNotificationById(context, notificationId);
    }

    public static final String KEY_APP_KEY = "JPUSH_APPKEY";

    public static boolean isEmpty(String s) {
        if (null == s)
            return true;
        if (s.length() == 0)
            return true;
        if (s.trim().length() == 0)
            return true;
        return false;
    }

    // 校验Tag Alias 只能是数字,英文字母和中文
    public static boolean isValidTagAndAlias(String s) {
        Pattern p = Pattern.compile("^[\u4E00-\u9FA50-9a-zA-Z_-]{0,}$");
        Matcher m = p.matcher(s);
        return m.matches();
    }

    // 取得AppKey
    public static String getAppKey(Context context) {
        Bundle metaData = null;
        String appKey = null;
        try {
            ApplicationInfo ai = context.getPackageManager()
                    .getApplicationInfo(context.getPackageName(),
                            PackageManager.GET_META_DATA);
            if (null != ai)
                metaData = ai.metaData;
            if (null != metaData) {
                appKey = metaData.getString(KEY_APP_KEY);
                if ((null == appKey) || appKey.length() != 24) {
                    appKey = null;
                }
            }
        } catch (NameNotFoundException e) {

        }
        return appKey;
    }

    // 取得版本号
    public static String GetVersion(Context context) {
        try {
            PackageInfo manager = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), 0);
            return manager.versionName;
        } catch (NameNotFoundException e) {
            return "Unknown";
        }
    }

    public static void showToast(final String toast, final Context context) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                Looper.prepare();
                Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
                Looper.loop();
            }
        }).start();
    }

    public static boolean isConnected(Context context) {
        ConnectivityManager conn = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = conn.getActiveNetworkInfo();
        return (info != null && info.isConnected());
    }
}

TagAliasCallback错误参数描述:
学习使用Android极光消息推送_第1张图片

富文本页面 Javascript 回调API

在你的html中调用如下功能函数:
1

JPushWeb.close();//关闭当前页

2

JPushWeb.startMainActivity(String params)//打开主Activity

在HTML中调用此函数后,会打开程序的主Activity, 并在对应的 Intent 传入参数 ”params“ ,Key 为 JPushInterface.EXTRA_EXTRA。

对应 Activity 获取 params 示例代码:

Intent intent = getIntent();
if (null != intent ) {
    String params = intent.getStringExtra(JPushInterface.EXTRA_EXTRA);
}

3

JPushWeb.triggerNativeAction(String params)//触发App里执行动作

在HTML中调用此函数后,会以广播的形式传递 ”params“ 到应用程序并触发客户端动作,对应的receiver:

<receiver  android:name="MyReceiver">
     ................
     <intent-filter>
    <action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" /> 
    <category android:name="包名" />
     </intent-filter>
</receiver>

获取:

if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
        Log.d(TAG, "用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
        //在这里根据 JPushInterface.EXTRA_EXTRA 的内容触发客户端动作,比如打开新的Activity 、打开一个网页等.     
   }

html代码示例引用官方的:


<html>
 <head>
  <title>JPush Webview Testtitle>
  <script>
       function clickButton() {
         JPushWeb.close();
       }

      function openUrl() {
         var json = "{'action':'open', 'url':'www.jpush.cn'}";
         JPushWeb.triggerNativeAction(json);
         JPushWeb.close(); //客服端在广播中收到json 后,可以打开对应的URL。
      }
 script>
 head>
 <body>
     <button onclick="javascript:clickButton(this);return false;">Closebutton>
     <button onclick="javascript:JPushWeb.startMainActivity('test - startMainActivity');return false;">StartMainActivitybutton>
     <button onclick="javascript:JPushWeb.triggerNativeAction('test - triggerNativeAction');Javascript:JPushWeb.close();">triggerNativeAction and Close current webwiewbutton>
     <button onclick="javascript:JPushWeb.startActivityByName('com.example.jpushdemo.TestActivity','test - startActivityByName');">startActivityByNamebutton>
     <button onclick="javascript:openUrl();">open a urlbutton>
 body>
html>

学习使用Android极光消息推送_第2张图片

Activity应用中的使用

首先是自定的通知栏布局R.layout.customer_notitfication_layout_one:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/custom_push_notification_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/custom_push_notification_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#A4C638"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/custom_push_notification_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#FFB6FF"
            android:textSize="20sp" />
    LinearLayout>


LinearLayout>

主布局是两个按钮和一个文本框显示接受到的自定义消息,这里就不贴代码了。

Activity中的代码主要用于接受自定义消息、发送本地通知、清楚本地通知、自定义通知栏:

public class MainActivity extends Activity implements
        android.view.View.OnClickListener {

    private EditText messageTv;
    public static boolean isForeground;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyUtil.initCustomPushNotificationBuilder(this, 1,
                R.layout.customer_notitfication_layout_one,
                R.drawable.tip_icon, R.drawable.show_icon,
                Notification.FLAG_AUTO_CANCEL, Notification.DEFAULT_SOUND,
                Notification.DEFAULT_LIGHTS);// 自定义编号1的通知栏

        ((Button) findViewById(R.id.local_alert_btn)).setOnClickListener(this);
        ((Button) findViewById(R.id.local_alert_clear_btn))
                .setOnClickListener(this);
        messageTv = ((EditText) findViewById(R.id.messageString));

        registerMessageReceiver();// 初始化从Receiver接受自定义消息
    }

    /**
     * 重写onResume()和onPause()用于统计分析 API
     */
    // /
    @Override
    protected void onResume() {
        super.onResume();
        isForeground = true;
        JPushInterface.onResume(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        isForeground = false;
        JPushInterface.onPause(this);
    }

    // //
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mMessageReceiver);
    }

    @Override
    public void onClick(View arg0) {
        switch (arg0.getId()) {
        case R.id.local_alert_btn://本地通知按钮被点击,编号为111111
            MyUtil.showLocalNotification(getApplicationContext(), 1, "本地title",
                    "本地content哈哈", 111111,
                    java.lang.System.currentTimeMillis() + 10);
            break;
        case R.id.local_alert_clear_btn://按编号清楚本地通知
            MyUtil.clearNotificationById(getApplicationContext(), 111111);
            break;

        default:
            break;
        }
    }

    // 从Receiver接受自定义消息
    private MessageReceiver mMessageReceiver;
    public static final String MESSAGE_RECEIVED_ACTION = "com.yunmo.mypushdemo.permission.JPUSH_MESSAGE";
    public static final String KEY_TITLE = "title";
    public static final String KEY_MESSAGE = "message";
    public static final String KEY_EXTRAS = "extras";

    public void registerMessageReceiver() {
        mMessageReceiver = new MessageReceiver();
        IntentFilter filter = new IntentFilter();
        filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
        filter.addAction(MESSAGE_RECEIVED_ACTION);
        registerReceiver(mMessageReceiver, filter);
    }

    public class MessageReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(MainActivity.this, "xxxxxx", Toast.LENGTH_SHORT)
                    .show();
            if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) {
                String messge = intent.getStringExtra(KEY_MESSAGE);
                String extras = intent.getStringExtra(KEY_EXTRAS);
                StringBuilder showMsg = new StringBuilder();
                showMsg.append(KEY_MESSAGE + " : " + messge + "\n");
                if (!MyUtil.isEmpty(extras)) {
                    showMsg.append(KEY_EXTRAS + " : " + extras + "\n");
                }
                setCostomMsg(showMsg.toString());
            }
        }
    }

    private void setCostomMsg(String msg) {
        if (null != messageTv) {
            messageTv.setText(msg);
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            messageTv.setVisibility(View.VISIBLE);
        }
    }
}

demo下载(内含工具类)

Android极光推送demo - 下载频道 - CSDN.NET
http://download.csdn.net/detail/yang786654260/8596151

你可能感兴趣的:(Android)