Android學習系列(7)--App輪詢伺服器訊息

來源:互聯網
上載者:User

標籤:

這篇文章是android開發人員的必備知識。

1.輪詢伺服器
     一般的應用,定時通知訊息可以採用輪詢的方法從伺服器拿取訊息,當然即時訊息通知的話,建議採用推送服務。
    其中需要注意輪詢的頻率設定,要在需求和效能中平衡。

2.獨立進程
     無論程式是否正在運行,我們都要能通知到客戶,我們需要一個獨立進程的後台服務。
     我們需要一個獨立進程的後台服務。
     在AndroidManifest.xml中註冊Service時,有一個android:process屬性,如果這個屬性以"."開頭,則為此服務開啟一個全域的獨立進程,如果以":"開頭則為此服務開啟一個為此應用私人的獨立進程。舉個具體的例子吧,我們建立了一個 Application,建立了主進程com.cnblogs.tianxia,那麼:

12345 <!--下面會建立一個全域的com.cnblogs.tianxia.message的獨立進程--><service android:name=".service.MessageService" android:label="訊息推送" android:process=".message" /><!--或者--><!--下面會建立一個應用私人的com.cnblogs.tianxia:message的獨立進程--><service android:name=".service.MessageService" android:label="訊息推送" android:process=":message" />

    我們沒必要建立一個全域的,本文選擇第二種方案,建立一個當前應用私人的獨立進程。

3.通知使用者和點擊查看

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 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 int onStartCommand(Intent intent, int flags, int startId) {        //初始化        messageNotification = new Notification();        messageNotification.icon = R.drawable.icon;        messageNotification.tickerText = "新訊息";        messageNotification.defaults = Notification.DEFAULT_SOUND;        messageNotificatioManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);         messageIntent = new Intent(this, MessageActivity.class);        messagePendingIntent = PendingIntent.getActivity(this,0,messageIntent,0);         //開啟線程        messageThread = new MessageThread();        messageThread.isRunning = true;        messageThread.start();         return super.onStartCommand(intent, flags, startId);    }         /**     * 從伺服器端擷取訊息     *     */    class MessageThread extends Thread{        //運行狀態,下一步驟有大用        public boolean isRunning = true;        public void run() {            while(isRunning){                try {                    //休息10分鐘                    Thread.sleep(600000);                    //擷取伺服器訊息                    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();                }            }        }    }     /**     * 這裡以此方法為伺服器Demo,僅作樣本     * @return 返回伺服器要推送的訊息,否則如果為空白的話,不推送     */    public String getServerMessage(){        return "YES!";    }}

  其中MessageActivity是點擊跳轉的activity,負責處理查看詳細資料。
  我們在其他Activity中調用一下:

12345 boolean isMessagePush = true;//不開啟就設定為false;...if(isMessagePush){     startService(new Intent(this, MessageService.class))};

  運行一下:

4.停止服務

12 stopService(new Intent(MyActivity.this,MessageService.class));setMessagePush(false);//設定設定檔或資料庫中flag為false

    運行一下,停止服務後,卻出乎意料的並沒有停下來,怎麼回事?是不是代碼寫錯了?
    代碼沒有錯,錯在我們停止了服務,卻沒有停止進程,退出線程。

5.退出線程
    實踐證明,Thread的stop()方法並不可靠。但是我們有其他的辦法。
    在代碼面前,程式員就是上帝。
    退出線程有兩種方法。
    第一種方法,強制退出。 

12 //殺死該線程所在的進程,自然就退出了System.exit(0);

   第二種方法,設定isRunning為false。

12 //前面說到了isRunning這個標誌,設定為false後,線程的執行就從while迴圈中跳出來了,然後自然結束掉了messageThread.isRunning = false;

   綜合一下,我們在MessageService中重載onDestroy()方法如下:

1234567 @Overridepublic void onDestroy() {            System.exit(0);            //或者,二選一,推薦使用System.exit(0),這樣進程退出的更乾淨            //messageThread.isRunning = false;            super.onDestroy();}

   好了,現在無論是手動停止,還是從工作管理員中強制停止Service,Message Service和訊息線程都能正常的停止和退出了。

Android學習系列(7)--App輪詢伺服器訊息

Android學習系列(7)--App輪詢伺服器訊息

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.