Android頂欄定時(shí)推送消息
在用安卓設(shè)備時(shí),經(jīng)常會(huì)應(yīng)用到彈出推送消息。下面在此把我之前寫(xiě)的推送代碼分享給大家,供大家參考,有不同見(jiàn)解的朋友歡迎提出,共同學(xué)習(xí)進(jìn)步!
最近搜索看這個(gè)的朋友比較多。這個(gè)也只是單獨(dú)的內(nèi)置推送。時(shí)時(shí)推送與服務(wù)器關(guān)聯(lián) 我們可以用SDK云推送來(lái)實(shí)現(xiàn)我們所需的需求。相關(guān)介紹內(nèi)容。往下移!
首先XML
<!-- 安卓推送服務(wù) --> <service android:name=".MessageService" android:enabled="true" android:exported="true" android:label="PushService" android:launchMode="singleInstance" android:persistent="true" android:process=":push" > <intent-filter> <action android:name="com.xxxx.action.MY_SERVICE" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </service> <receiver android:name="com.tt.xxxxx.download.GTAlarmReceiver" android:permission="com.android.launcher.permission.INSTALL_SHORTCUT" android:enabled="true" android:exported="true" > <intent-filter> <action android:name="com.android.launcher.action.INSTALL_SHORTCUT" /> </intent-filter> </receiver> <!--end add-->
里面的. :。這些符號(hào)很坑爹。不懂的可以查下字段屬性說(shuō)明。
推送類:
/******************************** 類 *************************************/ package com.ttad.yxcb; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.widget.Toast; import java.text.SimpleDateFormat; import com.tt.yingxiongchibis.download.GTDownloaderActivity; public class MessageService extends Service { //獲取消息線程 private MessageThread messageThread = null; //點(diǎn)擊查看 private Intent messageIntent = null; private PendingIntent messagePendingIntent = null; //通知欄消息 private int messageNotificationID = 1000; private Notification messageNotification = null; private NotificationManager messageNotificatioManager = null; public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { //初始化 messageNotification = new Notification(); messageNotification.icon = R.drawable.app_icon_ucs; messageNotification.tickerText = "알림"; messageNotification.defaults = Notification.DEFAULT_SOUND; messageNotificatioManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); //點(diǎn)擊跳轉(zhuǎn)的activity messageIntent = new Intent(this, GTDownloaderActivity.class); messagePendingIntent = PendingIntent.getActivity(this,0,messageIntent,0); //開(kāi)啟線程 messageThread = new MessageThread(); messageThread.isRunning = true; messageThread.start(); //Toast.makeText(MessageService.this, "", Toast.LENGTH_LONG).show(); super.onCreate(); } /** * 從服務(wù)器端獲取消息 * */ class MessageThread extends Thread{ //運(yùn)行狀態(tài),下一步驟有大用 public boolean isRunning = true; public void run() { while(isRunning){ try { //休息10分鐘 Thread.sleep(1000); //獲取服務(wù)器消息 String serverMessage = getServerMessage(); if(serverMessage!=null&&!"".equals(serverMessage)){ //更新通知欄 messageNotification.setLatestEventInfo(MessageService.this,"알림",serverMessage,messagePendingIntent); messageNotificatioManager.notify(messageNotificationID, messageNotification); //每次通知完,通知ID遞增一下,避免消息覆蓋掉 messageNotificationID++; } } catch (InterruptedException e) { e.printStackTrace(); } } } } @Override public void onDestroy() { // System.exit(0); //或者,二選一,推薦使用System.exit(0),這樣進(jìn)程退出的更干凈 messageThread.isRunning = false; //super.onDestroy(); } /** * 這里以此方法為服務(wù)器Demo,僅作示例 * @return 返回服務(wù)器要推送的消息,否則如果為空的話,不推送 */ public String getServerMessage(){ SimpleDateFormat sdf=new SimpleDateFormat("HHmmss"); String date=sdf.format(new java.util.Date()); String in = date; if(date.equals("195500")) { String str = "잠시후 전쟁터 시작됩니다. 준비해주세요."; return str; } else if(date.equals("212500")) { String str = "잠시후 보스전 시작됩니다. 준비해주세요."; return str; } else { return ""; } } }
最后,調(diào)用方式:
//推送 Intent intent = new Intent(); // 設(shè)置Action屬性 intent.setAction("com.ttad.yxcb.action.MY_SERVICE"); // 啟動(dòng)該Service startService(intent); // startService(new Intent(ExTextActivity.this, MessageService.class));
Android消息推送知識(shí)補(bǔ)充:
1.引言
所謂的消息推送就是從服務(wù)器端向移動(dòng)終端發(fā)送連接,傳輸一定的信息。比如一些新聞客戶端,每隔一段時(shí)間收到一條或者多條通知,這就是從服務(wù)器端傳來(lái)的推送消息;還比如常用的一些IM軟件如微信、GTalk等,都具有服務(wù)器推送功能。
推送方法如下:
1)通過(guò)SMS進(jìn)行服務(wù)器端和客戶端的交流通信。
在Android平臺(tái)上,你可以通過(guò)攔截SMS消息并且解析消息內(nèi)容來(lái)了解服務(wù)器的意圖,可以實(shí)現(xiàn)完全的實(shí)時(shí)操作。但是問(wèn)題是這個(gè)方案的成本相對(duì)比較高,且依賴于運(yùn)營(yíng)商。
2)循環(huán)主動(dòng)定時(shí)獲取
這種方法需要客戶端來(lái)做一個(gè)定時(shí)或者周期性的訪問(wèn)服務(wù)器端接口,以獲得最新的消息。輪詢的頻率太慢可能導(dǎo)致某些消息的延遲,太快則會(huì)大量消耗網(wǎng)絡(luò)帶寬和電池。
3)持久連接
這個(gè)方案可以解決由輪詢帶來(lái)的性能問(wèn)題,但是還是會(huì)消耗手機(jī)的電池。我們需要開(kāi)一個(gè)服務(wù)來(lái)保持和服務(wù)器端的持久連接(蘋(píng)果就和谷歌的C2DM是這種機(jī)制)。但是對(duì)于Android系統(tǒng),當(dāng)系統(tǒng)可用資源較低,系統(tǒng)會(huì)強(qiáng)制關(guān)閉我們的服務(wù)或者是應(yīng)用,這種情況下連接會(huì)強(qiáng)制中斷。(Apple的推送服務(wù)之所以工作的很好,是因?yàn)槊恳慌_(tái)手機(jī)僅僅保持一個(gè)與服務(wù)器之間的連接,事實(shí)上C2DM也是這么工作的。即所有的推送服務(wù)都是經(jīng)由一個(gè)代理服務(wù)器完成的,這種情況下只需要和一臺(tái)服務(wù)器保持持久連接即可。C2DM=Cloud to Device Messaging)。
相比之下第三種還是最可行的。為軟件編寫(xiě)系統(tǒng)服務(wù)或開(kāi)機(jī)啟動(dòng)功能;或者如果系統(tǒng)資源較低,服務(wù)被關(guān)閉后可以在onDestroy ()方法里面再重啟該服務(wù),進(jìn)而實(shí)現(xiàn)持久連接的方式。
C2DM內(nèi)置于Android的2.2系統(tǒng)上,無(wú)法兼容老的1.6到2.1系統(tǒng);且依賴于Google官方提供的C2DM服務(wù)器,由于國(guó)內(nèi)的網(wǎng)絡(luò)環(huán)境,這個(gè)服務(wù)經(jīng)常不可用。
建立在TCP協(xié)議之上的XMPP協(xié)議,不僅可提供可這種持久連接的功能,能實(shí)現(xiàn)服務(wù)器和客戶機(jī)的雙工通信,還能不依賴與系統(tǒng)版本和google服務(wù)器的限制,提供了比較好的解決方案。
2. XMPP協(xié)議
XMPP全稱Extensible Messaging and Presence Protocol,前身是Jabber項(xiàng)目,是一種以XML為基礎(chǔ)的開(kāi)放式即時(shí)通訊協(xié)議。XMPP因?yàn)楸籊oogle Talk和網(wǎng)易泡泡應(yīng)用而被廣大網(wǎng)民所接觸。XMPP的關(guān)鍵特色是,分散式的即時(shí)通訊系統(tǒng),以及使用XML串流。XMPP目前被IETF國(guó)際標(biāo)準(zhǔn)組織完成了標(biāo)準(zhǔn)化工作。
Android push notification(androidpn) 是一個(gè)基于XMPP協(xié)議的java開(kāi)源實(shí)現(xiàn),它包含了完整的客戶端和服務(wù)器端。該服務(wù)器端基本是在另外一個(gè)開(kāi)源工程openfire基礎(chǔ)上修改實(shí)現(xiàn)的。
androidpn客戶端需要用到一個(gè)基于java的開(kāi)源XMPP協(xié)議包asmack,這個(gè)包同樣也是基于openfire下的另外一個(gè)開(kāi)源項(xiàng)目smack,不過(guò)我們不需要自己編譯,可以直接把a(bǔ)ndroidpn客戶端里面的asmack.jar拿來(lái)使用??蛻舳死胊smack中提供的XMPPConnection類與服務(wù)器建立持久連接,并通過(guò)該連接進(jìn)行用戶注冊(cè)和登錄認(rèn)證,同樣也是通過(guò)這條連接,接收服務(wù)器發(fā)送的通知。
androidpn服務(wù)器端也是java語(yǔ)言實(shí)現(xiàn)的,基于openfire開(kāi)源工程,不過(guò)它的Web部分采用的是spring框架,這一點(diǎn)與openfire是不同的。Androidpn服務(wù)器包含兩個(gè)部分,一個(gè)是偵聽(tīng)在5222端口上的XMPP服務(wù),負(fù)責(zé)與客戶端的XMPPConnection類進(jìn)行通信,作用是用戶注冊(cè)和身份認(rèn)證,并發(fā)送推送通知消息。另外一部分是Web服務(wù)器,采用一個(gè)輕量級(jí)的HTTP服務(wù)器,負(fù)責(zé)接收用戶的Web請(qǐng)求。服務(wù)器的這兩方式,意義非凡:當(dāng)相應(yīng)的TCP端口被防火墻封閉,可以使用輪詢的方式進(jìn)行訪問(wèn),因此又有助于通過(guò)防火墻。
相關(guān)文章
Android實(shí)現(xiàn)添加商品到購(gòu)物車動(dòng)畫(huà)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)添加商品到購(gòu)物車的動(dòng)畫(huà)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Android模仿知乎的回答詳情頁(yè)的動(dòng)畫(huà)效果
這篇文章主要介紹了Android模仿“知乎”的回答詳情頁(yè)的動(dòng)畫(huà)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02安卓(Android)開(kāi)發(fā)之分享帶文字的圖片
用過(guò)微信分享SDK的都應(yīng)該知道,微信分享到朋友圈的時(shí)候是不能同時(shí)分享圖片和文字的,只要有縮略圖,那么文字就不會(huì)生效。那么問(wèn)題就來(lái)了,如果我們想把APP內(nèi)的某些內(nèi)容連帶圖片一起分享到微信,是不是沒(méi)辦法了呢?下面一起來(lái)看看怎么解決。2016-08-08Android 通過(guò)TCP協(xié)議上傳指定目錄文件的方法
這篇文章主要介紹了Android 通過(guò)TCP協(xié)議上傳指定目錄文件的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Android?Compose之Animatable動(dòng)畫(huà)停止使用詳解
這篇文章主要為大家介紹了Android?Compose之Animatable動(dòng)畫(huà)停止使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Android中將Bitmap對(duì)象以PNG格式保存在內(nèi)部存儲(chǔ)中的方法
在Android中進(jìn)行圖像處理的任務(wù)時(shí),有時(shí)我們希望將處理后的結(jié)果以圖像文件的格式保存在內(nèi)部存儲(chǔ)空間中,本文以此為目的,介紹將Bitmap對(duì)象的數(shù)據(jù)以PNG格式保存下來(lái)的方法2017-08-08Android PowerManagerService省電模式策略控制
這篇文章主要介紹了Android PowerManagerService省電模式策略控制,本文基于前兩篇文章的基礎(chǔ)介紹展開(kāi)詳情,感興趣的小伙伴可以參考一下2022-08-08Android編程下拉菜單spinner用法小結(jié)(附2則示例)
這篇文章主要介紹了Android編程下拉菜單spinner用法,結(jié)合實(shí)例較為詳細(xì)的總結(jié)分析了下拉菜單Spinner的具體實(shí)現(xiàn)步驟與相關(guān)技巧,并附帶兩個(gè)示例分析其具體用法,需要的朋友可以參考下2015-12-12