❶ 請問安卓APP消息推送,不管在後台運行,用戶都能收到信息怎麼弄
目前常用的解決方式是接入第三方消息工具,比如極光推送,❷ app的消息推送怎麼實現
app的消息通知的方式主要有兩種:Pull和Push,在這里分別對這兩種方式進行比較:❸ APP消息推送(APP Push)解決方案-服務端工作邏輯和實現
App推送消息是我們常見的一種app消息提醒方式。
我們的實現需要第三方的支持,實現方式是後台通過介面將Push請求發送至第尺侍三方,第三方實現在App所在設備上的推送。
在與推送平台交互時,後台需要向第三方發送兩部分信息,推送目標終端標示+推送內容
APP推送需要定位目標終端,也就是說要給那台設備進行推送,
簡單的情況下,單設備推送,我們需要拿到一個終端ID的概念,用於定位目標設備,
註:不同渠道中使用的單設備ID方式也不盡相同,以下用TokenID來表示這個終端ID的概念。
而實際推則困知送渠道中往往還有自定義的功能,比如通過打標簽的方式將TokenID進行劃分,達到批量差異化的效果。
即指通過API介面參數的定義終端上收到的Push消息的內容和格式。
其中IOS的推送消息在展示上區別於安卓的一點是沒有title,title的部分只能是默認的APP名稱,而安卓的部分雖然默認值也是APP名稱,但是也支持自定義title。
通過上述的處理邏輯可得知,後端首先需要登記客戶端的TokenId,然後保持TokenID的有效性更新,然後在需要發送APP推送時拿到用戶的有效TokenID,
然後使用TokenID和已有的內容信息通過API與三方Push服務交互,完成推送。
即後端的實現分為兩部分:
1、TokenID的登記
2、App Push API的調用
註:以下示例中有兩個元素為本項目的特殊情況:
其中proct_id是因為當前項目中客戶端同時有多個版本,不同版本需要推送獨立處理,但在同一張表內統一記登記;
而login_id跟member_id同時存在是因為當前孫消系統中存在共享賬戶的情況,一般賬號賬戶一對一的情況login_id和member_id是綁定的,不需要同時重復登記。
<pre>
/ ============================================================== /
/* Table: sys_app_push_token */
/ ============================================================== /
create table sys_app_push_token
(
record_id int(11) not null auto_increment,
login_id int(11),
member_id int(11),
push_token varchar(200),
visit_device int(4) comment Ɖ:Android;4:IOS',
proct_id varchar(20) default Ɔ' comment '',
push_channel int(4) default 1 comment Ƈ:IOS信鴿,2:華為,3:小米,4:極光',
nstatus int(4) not null default 0 comment '狀態:0:申請中;1:生效;2:失效;3:刪除;4:歷史記錄',
create_userid int(11) not null default 0,
create_time varchar(20) character set utf8 not null default "",
edit_userid int(11) not null default 0,
edit_time varchar(20) character set utf8 not null default "",
this_remark text,
description text,
create_ordernum varchar(30) character set utf8 comment '記錄創建時的流水號',
last_ordernum varchar(30) character set utf8 comment '記錄最後一次編輯時的流水號',
primary key (record_id)
)
ENGINE=InnoDB
DEFAULT CHARACTERSET=utf8
COLLATE=utf8_general_ci
auto_increment=10000
row_format=COMPACT;
alter table sys_app_push_token comment 'app推送token表'
/ ============================================================== /
/* Index: Index_1 */
/ ============================================================== /
create index Index_1 on sys_app_push_token
(
record_id
);
</pre>
註:其中,推送渠道絕對在做Push時使用哪家API,參數的判定交由客戶端進行處理,後端直接登記判定結果。
<pre>
@Transactional(readOnly=false)
(TrainVansContext trainVansContext) {
try{
//check already data
trainVansContext.getTrainVansRequest().put("login_id", TrainVansUtils.getMV(trainVansContext.getTrainVansRequest(),"login_login_id"));
// get All memberRelation
trainVansContext.getTrainVansRequest().put("relation_type", TrainVansUtils.getMV(trainVansContext.getTrainVansRequest(),"visit_role"));
List> memberRelationList = SpringContextHandler.getBean(MemberService.class).getRelateMemberListByLoginId(trainVansContext);
for(Map memberRelateMap : memberRelationList){
//
trainVansContext.getTrainVansRequest().put("member_id", TrainVansUtils.getMV(memberRelateMap,"member_id"));
Map tokenMap = SpringContextHandler.getBean(AppPushService.class).getPushTokenMapByLoginMap(trainVansContext.getTrainVansRequest());
//disable already data
if(tokenMap !=null){
if(!TrainVansUtils.getMV(tokenMap,"push_token").equals(TrainVansUtils.getMV(trainVansContext.getTrainVansRequest(),"push_token"))){
//
trainVansContext.getTrainVansRequest().put("record_id", TrainVansUtils.getMV(tokenMap,"record_id"));
if(!SpringContextHandler.getBean(AppPushService.class).updateDiabledThePushToken(trainVansContext)){
thrownewRuntimeException("TranVans_Operate_Exception");
}
//insert new data
if(!SpringContextHandler.getBean(AppPushService.class).insertPushTokenRecord(trainVansContext)){
thrownewRuntimeException("TranVans_Operate_Exception");
}
}
}else{
//insert new data
if(!SpringContextHandler.getBean(AppPushService.class).insertPushTokenRecord(trainVansContext)){
thrownewRuntimeException("TranVans_Operate_Exception");
}
}
}
returntrue;
}catch(Exception e) {
TrainVansUtils.setRetInfo(trainVansContext,"10005001","Register TokenID Error");
e.printStackTrace();
thrownewRuntimeException("TranVans_Operate_Exception");
}
}
</pre>
註:方法外部有一個關於對應本賬號的對賬戶列表的遍歷,遍歷中的處理部分為TokenID的登記處理操作。
推送渠道:
APP推送不僅僅要求在APP打開狀態時或者後台運行時進行消息推送,更多的場景是在移動終端關閉APP的場景下進行消息推送,
渠道的優劣無非在於兩個維度,送達率和送達效率。
其中安卓推送的渠道較為雜亂,其中華為和小米提供的PUSH服務對於自平台的移動終端支持的較為完善,而沒有廠商提供PUSH服務的終端只能通過
第三方服務來進行對接。
對於現有的這些渠道進行如下總結:
1、IOS:信鴿推送,這個推送在我門公司中經歷了三個項目,推送效果穩定。API接入也方便,是IOS端的不二選擇。
2、Android-華為:華為自平台。
3、Android-小米:小米自平台。
4、Android-其他:目前使用的是「極光推送」。在理想狀態下送達率和送達效率表現很好,但並不如以上三家渠道穩定。
在進行調用時可根據之前定義的push_channel分發給各自的渠道,各渠道的具體對接請各自查看官網,API都很完善。
❹ 安卓APP圖標上的消息數提示是怎麼實現的
手機基本上都自帶這個功能,舉個例子,華為手機雙指收縮主屏幕操作,再點右下角的設置,裡面有圖標管理,可以設置自己喜歡的圖標
❺ 怎麼讓安卓手機像iPhone那樣顯示軟體未讀消息數 就是QQ圖標右上角有顯示數字的
安卓版的沒有這種版本的,只有圖標變顏色就有,直接顯示幾條數目就沒有。下拉才有的。
❻ 手機顯示角標是什麼意思
手機上的角標,角標就是軟體右上角紅色的數字顯示,提示軟體的消息通知數量。
比如微信有未讀消息,桌面微信圖標右上角的數字顯示就是角標。
如果回答不是你需要的,可以把問題再描述詳細一點。
❼ APP消息推送安卓介面實現
極光推送能實現Android API統一推送服務標准介面,統一推送服務(Unified Push Service,簡稱UPS)技術標准,旨在為國內的消息推送服務建立統一的標准,為終端用戶提供更好的手機使用體驗,為應用開發者更好的解決消息推送需求。