概述:
首先簡單闡述一下我對於訊息推送的理解,這裡拿QQ來舉例吧,當我們手機端的QQ離線了,並且退出了QQ應用,但是這時候如果別人給我們發了資訊,我們沒有上線。伺服器會將寄件者發送的資訊推送過來然後我們發布通知來顯示通知我們的使用者
原理簡單闡述:
通過以上概述,我們基本瞭解我們需要一個獨立進程的後台服務,在AndroidManifest
.xml中註冊Service時,有一個android:process屬性這個屬性有2種情況,即為.和:兩種,其中.代表為此服務開啟一個全域的獨立進程,如果以:開頭則為此服務開啟一個為此應用私人的獨立進程
編碼實現:
ServerPushService檔案:
import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.app.Service;import android.content.Intent;import android.os.IBinder;public class ServerPushService extends Service{//擷取訊息線程private MessageThread messageThread = null;//點擊查看private Intent messageIntent = null;private PendingIntent messagePendingIntent = null;//通知欄訊息private int messageNotificationID = 1000;private Notification messageNotification = null;private NotificationManager messageNotificationManager = null;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//初始化messageNotification = new Notification();messageNotification.icon = R.drawable.ic_launcher;//通知圖片messageNotification.tickerText = "新訊息";//通知標題messageNotification.defaults = Notification.DEFAULT_SOUND;messageNotificationManager = (NotificationManager) getSystemService(this.NOTIFICATION_SERVICE);//點擊查看messageIntent = new Intent(this,MessageActivity.class);messagePendingIntent = PendingIntent.getActivity(this, 0, messageIntent, 0);//開啟線程MessageThread thread = new MessageThread();thread.isRunning = true;thread.start();return super.onStartCommand(intent, flags, startId);}/*** * 從服務端擷取訊息 * @author zhanglei * */class MessageThread extends Thread{//運行狀態public boolean isRunning = true;@Overridepublic void run() {while(isRunning){try {//休息10秒Thread.sleep(10000);if(getServerMessage().equals("yes")){//設定訊息內容和標題messageNotification.setLatestEventInfo(ServerPushService.this, "您有新訊息!", "這是一條新的測試訊息", messagePendingIntent);//發布訊息messageNotificationManager.notify(messageNotificationID, messageNotification);//避免覆蓋訊息,採取ID自增messageNotificationID++;}} catch (Exception e) {e.printStackTrace();}}}}/*** * 類比了服務端的訊息。實際應用中應該去伺服器拿到message * @return */public String getServerMessage(){return "yes";}}
註冊該service在一個單獨的進程中
<!-- 為此應用私人的獨立進程 --> <service android:name="com.jay.serverpush.ServerPushService" android:process=":message" ></service>
說明:該檔案編寫了一個service用於後台運行,在manifest裡面將該service聲明成progress為:開頭的,這樣在一個單獨的進程裡面運行,以實現在程式關閉之後達到進程不關閉的目的以此來實現離線推送的目的,編碼中的注釋很明確,掃描伺服器、判斷邏輯發布通知等,注釋很明確在此不在闡述
開啟服務的方式:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.startService(new Intent(this,ServerPushService.class));}this.startService(new Intent(this,ServerPushService.class));
通過這句話在第一次進入oncreate方法就開啟了單獨進程的服務
源碼下載:
http://pan.baidu.com/share/link?shareid=457896&uk=1997312776