編輯:關於Android編程
在用安卓設備時,經常會應用到彈出推送消息。下面在此把我之前寫的推送代碼分享給大家,供大家參考,有不同見解的朋友歡迎提出,共同學習進步!
最近搜索看這個的朋友比較多。這個也只是單獨的內置推送。時時推送與服務器關聯 我們可以用SDK雲推送來實現我們所需的需求。相關介紹內容。往下移!
首先XML
<!-- 安卓推送服務 --> <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-->
裡面的. :。這些符號很坑爹。不懂的可以查下字段屬性說明。
推送類:
/******************************** 類 *************************************/ 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; //點擊查看 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); //點擊跳轉的activity messageIntent = new Intent(this, GTDownloaderActivity.class); messagePendingIntent = PendingIntent.getActivity(this,0,messageIntent,0); //開啟線程 messageThread = new MessageThread(); messageThread.isRunning = true; messageThread.start(); //Toast.makeText(MessageService.this, "", Toast.LENGTH_LONG).show(); super.onCreate(); } /** * 從服務器端獲取消息 * */ class MessageThread extends Thread{ //運行狀態,下一步驟有大用 public boolean isRunning = true; public void run() { while(isRunning){ try { //休息10分鐘 Thread.sleep(1000); //獲取服務器消息 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),這樣進程退出的更干淨 messageThread.isRunning = false; //super.onDestroy(); } /** * 這裡以此方法為服務器Demo,僅作示例 * @return 返回服務器要推送的消息,否則如果為空的話,不推送 */ 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 ""; } } }
最後,調用方式:
//推送 Intent intent = new Intent(); // 設置Action屬性 intent.setAction("com.ttad.yxcb.action.MY_SERVICE"); // 啟動該Service startService(intent); // startService(new Intent(ExTextActivity.this, MessageService.class));
Android消息推送知識補充:
1.引言
所謂的消息推送就是從服務器端向移動終端發送連接,傳輸一定的信息。比如一些新聞客戶端,每隔一段時間收到一條或者多條通知,這就是從服務器端傳來的推送消息;還比如常用的一些IM軟件如微信、GTalk等,都具有服務器推送功能。
推送方法如下:
1)通過SMS進行服務器端和客戶端的交流通信。
在Android平台上,你可以通過攔截SMS消息並且解析消息內容來了解服務器的意圖,可以實現完全的實時操作。但是問題是這個方案的成本相對比較高,且依賴於運營商。
2)循環主動定時獲取
這種方法需要客戶端來做一個定時或者周期性的訪問服務器端接口,以獲得最新的消息。輪詢的頻率太慢可能導致某些消息的延遲,太快則會大量消耗網絡帶寬和電池。
3)持久連接
這個方案可以解決由輪詢帶來的性能問題,但是還是會消耗手機的電池。我們需要開一個服務來保持和服務器端的持久連接(蘋果就和谷歌的C2DM是這種機制)。但是對於Android系統,當系統可用資源較低,系統會強制關閉我們的服務或者是應用,這種情況下連接會強制中斷。(Apple的推送服務之所以工作的很好,是因為每一台手機僅僅保持一個與服務器之間的連接,事實上C2DM也是這麼工作的。即所有的推送服務都是經由一個代理服務器完成的,這種情況下只需要和一台服務器保持持久連接即可。C2DM=Cloud to Device Messaging)。
相比之下第三種還是最可行的。為軟件編寫系統服務或開機啟動功能;或者如果系統資源較低,服務被關閉後可以在onDestroy ()方法裡面再重啟該服務,進而實現持久連接的方式。
C2DM內置於Android的2.2系統上,無法兼容老的1.6到2.1系統;且依賴於Google官方提供的C2DM服務器,由於國內的網絡環境,這個服務經常不可用。
建立在TCP協議之上的XMPP協議,不僅可提供可這種持久連接的功能,能實現服務器和客戶機的雙工通信,還能不依賴與系統版本和google服務器的限制,提供了比較好的解決方案。
2. XMPP協議
XMPP全稱Extensible Messaging and Presence Protocol,前身是Jabber項目,是一種以XML為基礎的開放式即時通訊協議。XMPP因為被Google Talk和網易泡泡應用而被廣大網民所接觸。XMPP的關鍵特色是,分散式的即時通訊系統,以及使用XML串流。XMPP目前被IETF國際標准組織完成了標准化工作。
Android push notification(androidpn) 是一個基於XMPP協議的java開源實現,它包含了完整的客戶端和服務器端。該服務器端基本是在另外一個開源工程openfire基礎上修改實現的。
androidpn客戶端需要用到一個基於java的開源XMPP協議包asmack,這個包同樣也是基於openfire下的另外一個開源項目smack,不過我們不需要自己編譯,可以直接把androidpn客戶端裡面的asmack.jar拿來使用。客戶端利用asmack中提供的XMPPConnection類與服務器建立持久連接,並通過該連接進行用戶注冊和登錄認證,同樣也是通過這條連接,接收服務器發送的通知。
androidpn服務器端也是java語言實現的,基於openfire開源工程,不過它的Web部分采用的是spring框架,這一點與openfire是不同的。Androidpn服務器包含兩個部分,一個是偵聽在5222端口上的XMPP服務,負責與客戶端的XMPPConnection類進行通信,作用是用戶注冊和身份認證,並發送推送通知消息。另外一部分是Web服務器,采用一個輕量級的HTTP服務器,負責接收用戶的Web請求。服務器的這兩方式,意義非凡:當相應的TCP端口被防火牆封閉,可以使用輪詢的方式進行訪問,因此又有助於通過防火牆。
android關閉日志 我們在開發時,經常會輸出各種日志來debug代碼。但是等到應用發布的apk運行時不希望它輸出日志。 關閉輸出日志Log.v()
前言最近我跟自定義View槓上了,甚至說有點上瘾到走火入魔了。身為菜鳥的我自然要查閱大量的資料,學習大神們的代碼,這不,前兩天正好在郭神在微信公眾號裡推送一片自定義控件的
產品要做簽到功能,簽到功能要基於一個日歷來進行,所以就根據 要求自定義了一個日歷自定義控件相信做android都知道:(1)首先創建一個類,繼承一個容器類或者是一個控件&
Moco介紹在開發過程中,經常會使用到一些http網絡接口,而這部分功能通常是由第三方開發團隊或者是後端同事進行開發的,在我們開發時不能給我們提供服務,更有甚者,要集成的
前置文章: 《Android 4.4 KitKat Notificati