Android 使用極光推送自定義訊息打造個性的訊息推送效果
極光推送,是一個面向普通開發者開放的,免費的第三方訊息推送服務。本篇部落格將結合案例介紹極光推送自定義訊息的使用方法,利用自定義訊息實現專案中特定的訊息推送需求。
本案例將實現如圖效果:
- 參考官方Android SDK 教程完成鐳射推送的基本配置
- 區別通知和自定義訊息 通知即指在手機的通知欄(狀態列)上會顯示的一條通知資訊。 自定義訊息是極光推送自己的概念。
自定義訊息不是通知,所以不會被SDK展示到通知欄上。其內容完全由開發者自己定義。
自定義訊息主要用於應用的內部業務邏輯。一條自定義訊息推送過來,有可能沒有任何介面顯示。 本篇部落格介紹的就是使用自定義通知實現上圖效果。 - 實現自己定義的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/企業微信主頁;點擊企業註冊;填寫相關信息,營業執照和註冊號可以不用填,直接下一步,按照提示操作即可;註冊完成後,登陸,就顯示如下界面:點擊我的企業標簽:看到如上界