1. 程式人生 > >Android 使用極光推送自定義訊息打造個性的訊息推送效果

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

極光推送,是一個面向普通開發者開放的,免費的第三方訊息推送服務。本篇部落格將結合案例介紹極光推送自定義訊息的使用方法,利用自定義訊息實現專案中特定的訊息推送需求。

本案例將實現如圖效果:
這裡寫圖片描述

  1. 參考官方Android SDK 教程完成鐳射推送的基本配置
  2. 區別通知和自定義訊息 通知即指在手機的通知欄(狀態列)上會顯示的一條通知資訊。 自定義訊息是極光推送自己的概念。
    自定義訊息不是通知,所以不會被SDK展示到通知欄上。其內容完全由開發者自己定義。
    自定義訊息主要用於應用的內部業務邏輯。一條自定義訊息推送過來,有可能沒有任何介面顯示。 本篇部落格介紹的就是使用自定義通知實現上圖效果。
  3. 實現自己定義的Receiver,並參考官方文件在AndroidManifest.xml中配置。
package com.cn.cwvs.fruit;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.BroadcastReceiver;
import android.
content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import cn.jpush.android.api.JPushInterface; public class MyJPushReceiver extends BroadcastReceiver { private static String TAG = "pushreceiver"; @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())) { } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent .getAction())) { // 自定義訊息不會展示在通知欄,完全要開發者寫程式碼去處理 String content = bundle.getString(JPushInterface.EXTRA_MESSAGE); String extra = bundle.getString(JPushInterface.EXTRA_EXTRA); System.out.println("收到了自定義訊息@@訊息內容是:"+ content); System.out.println("收到了自定義訊息@@訊息extra是:"+ extra); //**************解析推送過來的json資料並存放到集合中 begin****************** Map<String, Object> map = new HashMap<String, Object>(); JSONObject jsonObject; try { jsonObject = new JSONObject(extra); String type = jsonObject.getString("type"); map.put("type", type); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } map.put("content", content); //獲取接收到推送時的系統時間 Calendar rightNow = Calendar.getInstance(); SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); String date = fmt.format(rightNow.getTime()); map.put("date", date); MyApp.data.add(map); //**************解析推送過來的json資料並存放到集合中 end****************** } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent .getAction())) { System.out.println("收到了通知"); // 在這裡可以做些統計,或者做些其他工作 } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent .getAction())) { System.out.println("使用者點選打開了通知"); // 在這裡可以自己寫程式碼去定義使用者點選後的行為 Intent i = new Intent(context, MainActivity.class); // 自定義開啟的介面 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } else { Log.d(TAG, "Unhandled intent - " + intent.getAction()); } } }

這裡寫圖片描述

實現不同推送樣式的內部業務邏輯程式碼主要在Receiver中完成。
下面進入極光後臺推送一條自定義訊息:
這裡寫圖片描述
從上圖可以看出,“可選設定”的“附加欄位”中填寫了鍵“type”,值“積分動態”,我們很容易的猜想到,這裡應該是拼接了一個json字串,當點擊發送的時候,使用者app將會接受到這個字串。通過解析字串,實現應用需要的推送效果。
點選確認推送,觀察控制檯輸出的結果:

這裡寫圖片描述
現在再看上面的Receiver程式碼,自定義訊息的傳送和接收機制就應該瞭解了。

回到本文開頭的案例圖上面,實現案例圖中的效果也就非常容易了,無非就是ListView繫結一個Adapter,將收到的訊息新增到集合中展示出來即可。
這裡給出adapter的程式碼:

package com.cn.cwvs.fruit.adapter;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.cn.cwvs.fruit.R;

/**
 * 
 * @author LeoLeoHan
 * 
 */
public class MsgAdapter extends BaseAdapter {
    // 要顯示的資料的集合
    private List<Map<String, Object>> data;
    // 接受上下文
    private Context context;
    // 宣告內部類物件
    private ViewHolder viewHolder;

    /**
     * 建構函式
     * 
     * @param context
     * @param data
     */
    public MsgAdapter(Context context, List<Map<String, Object>> data) {
        this.context = context;
        this.data = data;
    }

    // 返回的總個數
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return data.size();
    }

    // 返回每個條目對應的資料
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return data.get(position);
    }

    // 返回的id
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    // 返回這個條目對應的控制元件物件
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 判斷當前條目是否為null
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = View.inflate(context, R.layout.item_msg, null);
            viewHolder.tv_msg_title = (TextView) convertView
                    .findViewById(R.id.tv_msg_title);
            viewHolder.tv_msg_content = (TextView) convertView
                    .findViewById(R.id.tv_msg_content);
            viewHolder.tv_msg_date = (TextView) convertView
                    .findViewById(R.id.tv_msg_date);
            viewHolder.iv_msg = (ImageView) convertView
                    .findViewById(R.id.iv_msg);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        // 獲取List集合中的map物件
        Map<String, Object> map = data.get(position);
        String content = map.get("content").toString();
        String type = map.get("type").toString();
        String date = map.get("date").toString();

        if (type.equals("積分動態")) {
            viewHolder.tv_msg_title.setText("積分動態");
            viewHolder.iv_msg.setImageResource(R.drawable.msg_money);
        } else if (type.equals("促銷提醒")) {
            viewHolder.tv_msg_title.setText("促銷提醒");
            viewHolder.iv_msg.setImageResource(R.drawable.msg_vip);
        } else if (type.equals("發貨通知")) {
            viewHolder.tv_msg_title.setText("發貨通知");
            viewHolder.iv_msg.setImageResource(R.drawable.msg_car);
        } else if (type.equals("退款通知")) {
            viewHolder.tv_msg_title.setText("退款通知");
            viewHolder.iv_msg.setImageResource(R.drawable.msg_back);
        } else if (type.equals("團購預告")) {
            viewHolder.tv_msg_title.setText("團購預告");
            viewHolder.iv_msg.setImageResource(R.drawable.msg_preview);
        } else if (type.equals("生日禮品資訊")) {
            viewHolder.tv_msg_title.setText("生日禮品資訊");
            viewHolder.iv_msg.setImageResource(R.drawable.msg_present);
        }

        viewHolder.tv_msg_content.setText(content);
        viewHolder.tv_msg_date.setText(date);

        return convertView;
    }

    /**
     * 內部類 記錄單個條目中所有屬性
     * 
     * @author LeoLeoHan
     * 
     */
    class ViewHolder {
        public TextView tv_msg_title, tv_msg_content, tv_msg_date;
        public ImageView iv_msg;

    }

}

msg_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/iv_msg"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_marginBottom="20dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="20dp"
        android:src="@drawable/msg_money" />


    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="80dp"
        android:layout_weight="1"
        android:layout_marginRight="15dp"
        android:gravity="center_vertical" >

        <TextView
            android:id="@+id/tv_msg_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="積分動態"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/tv_msg_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tv_msg_title"
            android:layout_marginTop="3dp"
            android:text="你有2積分到賬啦!你有2積分到賬啦!" />

        <TextView
            android:id="@+id/tv_msg_date"
            android:gravity="right"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_marginTop="3dp"

            android:layout_toRightOf="@+id/tv_msg_title"
            android:text="2015-08-18" />

    </RelativeLayout>

</LinearLayout>

這裡寫圖片描述
這裡的圖片素材就不提供了。

補充幾點內容:
1、如何針對個人進行推送?
請參考別名與標籤使用教程。
我的個人思路是,當用戶登入的時候,將使用者名稱作為別名,呼叫如下程式碼進行設定即可:

  JPushInterface.setAlias(context, username,
                            new TagAliasCallback() {

                                @Override
                                public void gotResult(int responseCode,
                                        String alias, Set<String> tags) {
                                    if (responseCode==0) {
                                        System.out.println("jpush [email protected]@@@@別名設定成功");
                                    }
                                }
                            });

2、怎樣實現手機淘寶首頁中的效果,即下圖所示,當沒有新訊息的時候,訊息圖示正常,當有訊息的時候,訊息圖示上面顯示一個小點,或者顯示未讀訊息的數量?
這裡寫圖片描述
個人思路是對極光推送的Receiver進行操作,同時對訊息圖示的點選通過識別符號判定,以實現有新訊息時,點選該圖示後,進入訊息頁面,返回後訊息圖示上面的小點消失。

相關推薦

Android 定義 ViewPager 打造千變萬化的圖片切換效果

                記得第一次見到ViewPager這個控制元件,瞬間愛不釋手,做東西的主介面通通ViewPager,以及圖片切換也拋棄了ImageSwitch之類的,開始讓ViewPager來做。時間長了,ViewPager的切換效果覺得枯燥,形成了審美疲勞~~我們需要改變,今天教大家如何改變V

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

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

android 極光 定義聲音

可以定義樣式,那麼可以禁用極光的聲音,收到通知就播放一個聲音就好:禁用: // 極光 JPushInterface.setDebugMode(IS_DEBUG); JPushInterface.init(this); BasicPushNotificationB

Android極光定義通知問題

private void showInspectorRecordNotification() { RemoteViews customView = new RemoteViews(context.getPackageName(), R.layout.

OpenShift定義映象到本地倉庫並建立專案和應用

OpenShift推送自定義映象到本地倉庫並建立專案和應用 建立push 許可權 #oc create serviceaccount registry -n default #oc adm policy add-scc-to-user privileged system:servic

Android定義ViewGroup打造各種風格的SlidingMenu

看鴻洋大大的QQ5.0側滑選單的視訊課程,對於側滑的時的動畫效果的實現有了新的認識,似乎打通了任督二脈,目前可以實現任意效果的側滑選單了,感謝鴻洋大大!! 鴻洋大大用的是HorizontalScrollView來實現的側滑選單功能,HorizontalScro

iOS遠端定義語音合成播放聲音(類似支付寶收款提醒)

本文參考文章 iOS 模仿支付寶支付到賬推送,播報錢數,看上面寫的一些不是很詳細遇到了許多問題,這裡特意自己總結了一下。將我遇到的問題以及解決方案給羅列出來供大家參考。首先建立一個工程:開啟推送通知註冊接受Background Modes內部的第一個我看有的demo是有夠選的

Android 定義 HorizontalScrollView 打造再多圖片(控制元件)也不怕 OOM 的橫向滑動效果

自從Gallery被谷歌廢棄以後,Google推薦使用ViewPager和HorizontalScrollView來實現Gallery的效果。的確HorizontalScrollView可以實現Gallery的效果,但是HorizontalScrollView存在一個很大的問

Android定義view-打造酷炫的字型滑動高亮控制元件

前言: 相信很多時候開發會遇到類似於音樂歌詞同步,播放到哪句歌詞的哪個詞時會逐漸高亮,這樣的描述還是不夠準確,iPhone的滑動解鎖的那種效果,相信很多人都會熟悉吧。今天,我們的首要任務就是開發一個類似於這種效果的安卓控制元件,以便在以後的專案中直接使用,看起來高大上有木有

android定義view-打造圓形ImageView(一)

package com.beyole.view; import com.beyole.roundimageview.R; import android.content.Context; import android.content.res.TypedArray; import android.graphi

Android定義View之ListView實現時間軸效果:我只是個快遞的。

先上效果圖: 實現時間軸的原理 listview的基本使用,相信大家都很熟悉。先在layout下新建一個xml佈局檔案,對應一個子項的listView的顯示內容。在上面的圖我們可以看到,每一項都是 有3個 textview控制元件

Linphone-android 登入過程增加定義訊息頭流程分析

註冊增加訊息頭 在saveNewAccount()中; 新增自定義訊息頭 LinphoneProxyConfig prxCfg = lc.createProxyConfig(identityAddr.asString(), proxyAddr.asSt

Android 使用定義Dialog打造ActionSheet選單

前言 這幾天用到了github上的一個仿IOS的ActionSheet(ActionSheetForAndroid)控制元件,它是使用Fragment實現的,由於我的主介面也是由幾個Fragment來做,所以這樣會造成FragmentManager出現一些問題。所以就

android定義view-打造圓形ImageView(四)終結篇

package com.beyole.view; import java.lang.ref.WeakReference; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitm

iOS-定義提示音

無論是信鴿推送,還是極光推送,其實就是將蘋果原生的APS進行封裝。具體操作步驟在相應的官網上都有詳細介紹以及Demo。本文主要講述自定義聲音遇到的坑,以下是相關硬性條件: 1.音訊檔案格式: .aiff 、.wav 、.caf  ,下面的/System/Librar

android定義view-打造圓形ImageView(二)

package com.beyole.view; import java.lang.ref.WeakReference; import android.content.Context; import android.content.res.TypedArray; import android.graphi

android定義View打造自己的專屬控制元件——風車控制元件

Android 自定義View——打造自己的專屬控制元件 前段時間看到一個天氣應用,介面做的很好看。裡面一個風車轉動動畫和一個日出日落的動畫挺有意思的,於是自己也照著他的介面做了一個。 先看一下介面 自定義View一般有兩種情況 繼承自原有控制元件

android:如何通過定義工程模板讓新建的工程都默認支持lambda表達式

wan tro idt ref height 代碼 spa span oid 首先參考這篇文章:自定義Android Studio工程模板,了解如何自定義模板然後結合我們上一篇文章 android: 在android studio中使用retrolambda的步驟的要點,修

IIS ajax CORS 訪問發定義Header時分析

nbsp post true cal 後臺 config -a coo function 場景: a站:http://127.0.0.1/a b站:http://localhost/b (IIS7.5) a站用ajax訪問b的資源,代碼如下: $.ajaxSetu

python利用企業微信api來進行發定義報警的類實現

python 微信報警python利用企業微信api來進行發送自定義報警的類實現企業微信註冊打開http://work.weixin.qq.com/企業微信主頁;點擊企業註冊;填寫相關信息,營業執照和註冊號可以不用填,直接下一步,按照提示操作即可;註冊完成後,登陸,就顯示如下界面:點擊我的企業標簽:看到如上界