1. 程式人生 > >學習使用Android極光訊息推送

學習使用Android極光訊息推送

下載SDK

配置

依照如下形式在清單檔案中新增程式碼,並把包名和Appkey換成自己的包名。

<?xml version="1.0" encoding="utf-8"?>
<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" /> <!-- Required 一些系統要求的許可權,如訪問網路等--> <uses-permission android:name="包名.permission.JPUSH_MESSAGE" /><!-- 官方定義的許可權,允許應用接收JPUSH內部程式碼傳送的廣播訊息。 --> <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" /><!-- 允許應用讀寫系統設定項。 --> <!-- Optional for location --> <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> <!-- Required SDK核心功能--> <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> <!-- Required SDK核心功能--> <service android:name="cn.jpush.android.service.DownloadService" android:enabled="true" android:exported="false" > </service> <!-- Required SDK 核心功能--> <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> <!-- 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" /> <!--Required 顯示通知欄 --> <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核心功能--> <receiver android:name="cn.jpush.android.service.AlarmReceiver" /> <!-- User defined. 使用者自定義的廣播接收器--> <receiver android:name="你的自定義MyReceiver" android:enabled="true"> <intent-filter> <action android:name="cn.jpush.android.intent.REGISTRATION" /> <!--Required 使用者註冊SDK的intent--> <action android:name="cn.jpush.android.intent.UNREGISTRATION" /> <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> <!--Required 使用者接收SDK訊息的intent--> <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <!--Required 使用者接收SDK通知欄資訊的intent--> <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required 使用者開啟自定義通知欄的intent--> <action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收網路變化 連線/斷開 since 1.6.3 --> <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/><!-- 使用者點選了通知 --> <action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" /><!--富文字頁面 Javascript 回撥API --> <category android:name="包名" /> </intent-filter> </receiver> <!-- Required . Enable it you can get statistics data with channel --> <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/> <meta-data android:name="JPUSH_APPKEY" android:value="XXX 你的AppKey XXX" /> <!-- </>值來自開發者平臺取得的AppKey--> </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<String> 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<String> tags,
            TagAliasCallback callback) {
        JPushInterface.setTags(context, tags, callback);
    }

    /**
     * 濾掉無效的 tags
     * @param tags
     * @return 有效的 tag 集合。
     */
    public static Set<String> filterValidTags(Set<String> 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<Integer> daysIntegers = new HashSet<Integer>();
        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<String , Object>
         * @return
         */
        public localNotificationBuilder setExtras(Map<String, Object> 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錯誤引數描述:
這裡寫圖片描述

富文字頁面 Javascript 回撥API

在你的html中呼叫如下功能函式:
1

            
           

相關推薦

學習使用Android極光訊息

下載SDK 配置 依照如下形式在清單檔案中新增程式碼,並把包名和Appkey換成自己的包名。 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http

Android接入極光訊息

極光訊息推送: 極光推送(JPush)是一個端到端的推送服務,使得伺服器端訊息能夠及時地推送到終端使用者手機上,讓開發者積極地保持與使用者的連線 主要功能 保持與伺服器的長連線,以便訊息能夠即時推送到達客戶端 接收通知與自定義訊息,並向開發者App 傳遞

Android 根據訊息內容跳轉至指定頁面(極光

首先認識一下安卓newIntent方法的使用:newIntent方法的使用在於如果activity已經開啟了,並設定了啟動模式為:  android:launchMode="singleTask"的時候,當再次使用intent來啟動這個activtiy的時候就會進入這個方法裡

Android MQTT 訊息demo

··· 不會轉換gif格式,截圖給你們看看吧,如果有好的免費的轉換工具可以留言推薦給我,在此衷心感謝 裡邊寫了好多註釋,應該都能看懂,這個在ssm專案中也可以使用但需要定製,去除android化的東西 ··· 1.介面 2.連線Mqtt 3.傳送和接收訊息(上邊

Android App訊息 實現原理

1.訊息推送的實質實際上,是當伺服器有新訊息需推送給使用者時,先發送給應用App,應用App再發送給使用者2. 作用產品角度:功能需要,如:資訊類產品的新聞推送、工具類產品的公告推送等等運營角度:活動運營需要,如:電商類產品的促銷活動;召回使用者 / 提高活躍度等等作為開發者

React Native整合極光訊息

在蘋果開發者賬戶中配置好自己的APP的應用ID,然後使用上述一鍵生成證書功能生成自己的開發證書(不要忘了勾上推送通知)! 在IOS推送設定中上傳自己的證書(密碼一鍵生成後會給出) 3.xcode修改 三、專案構建: 1

極光訊息伺服器端開發實現(上)

以前一直使用的極光的手動輸入推送內容然後推送到客戶端,今天遇到了推送頻率比較高且比較有規律的內容,比如事實天氣。這樣就需要用我們自己的伺服器來自動生成推送內容了。 可以看到,上面兩句話很醒目,我們看看它封裝的REST API是個什麼東西,再點進去看看 上面兩句話讀了一

極光訊息及角標實現,附帶完整demo

摘要:本次實現了使用者登入註冊,將使用者儲存到Application 裡面實現使用者持久化,使用者有已讀訊息檢視,未讀訊息檢視,傳送訊息功能,未讀訊息讀取後,新增到已讀訊息裡面,傳送訊息具有推送功能 可以全部發送,和選擇人員傳送,傳送訊息過後,如果當前使用者線上會收到一條工

極光訊息伺服器端開發實現(下)

前面我們已經實現了通過我們自己的伺服器生成訊息向極光訊息推送伺服器傳送推送訊息的功能,下面我們來看看如何在手機客戶端實現訊息接收。 一、在極光上建立一個測試專案 如上圖所示,下載Android Example 執行效果如圖 下面我們通過原始碼先看看上面的四行顯示Tex

Android 使用極光自定義訊息打造個性的訊息效果

極光推送,是一個面向普通開發者開放的,免費的第三方訊息推送服務。本篇部落格將結合案例介紹極光推送自定義訊息的使用方法,利用自定義訊息實現專案中特定的訊息推送需求。 本案例將實現如圖效果: 參考官方Android SDK 教程完成鐳射推送的基本配置 區

Android 基於Netty的訊息方案之物件的傳遞(四)

在上一篇文章中《Android 基於Netty的訊息推送方案之字串的接收和傳送(三)》我們介紹了Netty的字串傳遞,我們知道了Netty的訊息傳遞都是基於流,通過ChannelBuffer傳遞的,那麼自然,Object也需要轉換成ChannelBuffer來傳遞。好在Netty本身已經給我們寫好了

Android 基於Netty的訊息方案之字串的接收和傳送(三)

在上一篇文章中《Android 基於Netty的訊息推送方案之概念和工作原理(二)》 ,我們介紹過一些關於Netty的概念和工作原理的內容,今天我們先來介紹一個叫做ChannelBuffer的東東。 ChannelBuffer  Netty中的訊息傳遞,都必須以位元

Android 基於Netty的訊息方案之概念和工作原理(二)

上一篇文章中我講述了關於訊息推送的方案以及一個基於Netty實現的一個簡單的Hello World,為了更好的理解Hello World中的程式碼,今天我來講解一下關於Netty中一些概念和工作原理的內容,如果你覺得本篇文章有些枯燥,請先去閱讀《Android 基於Netty的訊息推送方案之Hell

android 實現mqtt訊息,以及不停斷線重連的問題解決

前段時間專案用到mqtt的訊息推送,整理一下程式碼,程式碼的原型是網上找的,具體哪個地址已經忘記了。 程式碼的實現是新建了一個MyMqttService,全部功能都在裡面實現,包括連伺服器,斷線重連,訂閱訊息,處理訊息,釋出訊息等基本操作。 首先新增依賴: dependencies { &

基於Netty實現的Android 訊息(即時通訊)的解決方案

根據Netty框架實現訊息推送(即時聊天)功能. Netty框架,TCP長連線,心跳,阻塞訊息佇列,執行緒池處理訊息傳送, 基於Google ProtoBuf自定義的訊息協議, TCP粘包/拆包.... 客戶端通過TCP連線到伺服器,並建立TCP長連線;當伺服器端收到新訊息後通過TCP連線推送給

Android UDP - 簡單訊息功能

近期接觸了幾個小的Android開發專案,根據需求要利用到網路傳輸中的UDP協議方式傳輸,遇到不少坑,在此分享一下在Android應用中UDP的一些簡單技術功能實現,希望能幫到用得到的同僚。 需(wo)求(yao)分(gan)析(ma): 從PC上輸入一串亂七八糟,然後能在我手機(某為pow

Android安卓狀態列訊息通知(Notification)

我從不猜測,猜測是一個很壞的習慣——會影響正常的邏輯推理能力。              ——阿瑟·柯南·道爾 《福爾摩斯探案集》 近日,在做安卓專案開發的時候涉及到狀態列通知的需求,查了資料,總結一個簡

Service Worker學習與實踐(三)——訊息

在上一篇文章Service Worker學習與實踐(二)——PWA簡介中,已經講到PWA的起源,優勢與劣勢,並通過一個簡單的例子說明了如何在桌面端和移動端將一個PWA安裝到桌面上,這篇文章,將通過一個例子闡述如何使用Service Worker的訊息推送功能,並配合PWA技術,帶來原生應用般的訊息推送體驗。

Android開發-在Android應用裡整合友盟訊息SDK的實現(相容小米、華為、魅族機型離線

前 言 最近由於專案的功能需求的需要,需要在Android應用整合訊息推送的功能,而目前市面上的第三方訊息推送除了友盟推送外,還有極光推送、小米推送、個推以及信鴿(騰訊)推送等。當時本人對比各大第三方的訊息推送進行了測試,覺得友盟訊息推送整合簡單,推送訊息的

php 接極光 普通訊息和標題內容訊息實現方法

一、如下兩種訊息樣式推送方法,這裡介紹第一種標題+內容樣式的訊息推送。 1.首先,下載極光PHP的SDK,引入到專案,基礎參考 https://docs.jiguang.cn/jpush/server/sdk/php_sdk/   這裡不詳細介紹了 2.在