我們從Androidpn用戶端程式入口DemoAppActivity開始。DemoAppActivity裡最核心的就是下面這兩句了。
ServiceManager serviceManager =new ServiceManager(this);serviceManager.startService();
開啟ServiceManager類源檔案,可以看到,建構函式完成了將伺服器位址、連接埠等配置資訊寫到Preferences的工作。而startService方法的代碼如下:
public void startService() { Thread serviceThread = new Thread(new Runnable() { @Override public void run() { Intent intent = NotificationService.getIntent(); context.startService(intent); } }); serviceThread.start();}
可以看到,它啟動了NotificationService這個服務。服務這個東西,多次start並不會產生多個執行個體,並且除非有進程stop它,否則它不會停止。所以第一次應用程式啟動後,這個服務就運行在那裡了,即使退出應用程式,用戶端還可以接收到伺服器端發來的訊息。
開啟NotificationService類,繼續看代碼。
deviceId =telephonyManager.getDeviceId();
它取得了裝置的ID,但好像並沒有真正使用過它。
然後,
xmppManager = new XmppManager(this); taskSubmitter.submit(new Runnable() { public void run() { NotificationService.this.start(); } });
現在,馬上就要串連伺服器了。跟蹤一下NotificationService.this.start方法,就可以看到,它依次執行了connect(串連)、register(註冊)、login(登入)三個動作。
Connect 就是建立與伺服器端的長串連了。
Register就是用戶端提交使用者名稱密碼註冊。我們找到XmppManager類中的RegisterTask類。它先通過查看手機的Preferences裡有沒有使用者名稱和密碼欄位來判斷使用者是否註冊,如果沒有註冊,它就產生隨機使用者名稱密碼發過去註冊。所以,如果程式運行過一次之後,你還想換個使用者名稱密碼登入是不行的,除非你在更換使用者之前清除掉Preferences裡的使用者名稱密碼兩個屬性值。另外再提一點,伺服器端不支援同一使用者名稱多次註冊的,所以如果你想做帳號多點同時線上的話,要麼改androidpn的伺服器端,要麼自己得動點腦筋。
最後,登入完成後,當伺服器端發來訊息時,NotificationReceiver 類就該上陣了。你希望收到訊息後做什麼處理,就來修改它的onReceive方法。預設的,它調用Notifier類的notify方法來給出一條通知。