安卓開發4-訪問OA實現消息自動提醒

實現目標:在安卓手機上實現一個完整的OA助手,能設置OA的訪問地址,有消息到來時手機能自動提醒。android

         上一次已經完成的webview相關的技術準備,接着要完善的功能:保持webview的訪問狀態;採用CookieManager讀取webview顯示OA頁面的cookie;採用HttpURLConnection定時訪問OA的消息提醒;線程與activity的通訊;採用Notification實現消息提醒。web

實現效果:   cookie

         (一)採用WebView訪問OA的效果:    app

 

         (二)按下home鍵後,有新消息時的提醒效果:jsp

 

保持webview的訪問狀態測試

         在MainActivity的onCreateView中經過webView.load()訪問OA,每次按home健後,再次訪問應用仍是會從新load,這樣就不能保持最後的訪問狀態。this

         經過修改配置文件Manifest.xml可保持狀態,在主activity裏增長:android:launchMode="singleTask"。看到有文章說增長到application裏,我測試過沒有效果。url

        <activity線程

            android:name="com.example.oaapp2.MainActivity"xml

                 android:launchMode="singleTask"

            android:label="@string/app_name" >

 

採用CookieManager讀取webview顯示OA頁面的cookie

         在ativity中要檢測OA是否有新的消息,就要先獲得OA中已登錄的用戶信息。假如OA系統登錄後已保存用戶信息的cookie,取cookie的方法爲:

         String sCookie = CookieManager.getInstance().getCookie(sUrl)

         其中sUrl爲OA的訪問地址,取回的格式爲:「name1=值; name2=值2;」,經過字符串的解析能夠獲得想要的用戶信息。要注意的是,兩個值之間「; 」是有空格的。

         爲了順利使用,在onCreate裏增長如下代碼:

                   //沒有這兩行代碼,在虛擬機中測試正常;放到三星手機測試程序自動中止。

                   CookieSyncManager.createInstance(this.getBaseContext());

                   CookieSyncManager.getInstance().startSync();

         在onCreateView的loadUrl()以前增長:

                  CookieManager.getInstance().removeSessionCookie();

                   CookieManager.getInstance().removeAllCookie();

 

採用HttpURLConnection定時訪問OA的消息提醒

         (一)在activity中直接使用HttpURLConnection得不到任何結果,只能放到線程中,代碼以下:

         class CheckMessageThread  implements Runnable {

                  

                   /**

                    * 經過cookie取得用戶ID

                    * @param sUrl

                    * @return

                    */

                   public String getLoginId(String sUrl) {

                            String sLoginId = "0";

                            String sCookie = CookieManager.getInstance().getCookie(sUrl);

                            //解析sCookie得到sLoginid

                            return sLoginId;

                   }

                  

                   /**

                    * 取得信息數量

                    * @param sUrl

                    * @return

                    */

                   public int getMessageCount(String sUrl) {

                            int iCount = 0;

                            try {

                                     URL url = new URL(sUrl);

                                     HttpURLConnection httpconn = (HttpURLConnection) url.openConnection();

                                     if (httpconn != null && httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) {

                                               InputStreamReader isr = new InputStreamReader(

                                                                 httpconn.getInputStream(), "utf-8");

                                               int i;

                                               String content = "";

                                               while ((i = isr.read()) != -1) {

                                                        content = content + (char) i;

                                               }

                                               isr.close();

                                              

                                               //解析content得到短信數量

                                     }

                                     httpconn.disconnect();

                            } catch (Exception e) {

                            }

                            return iCount;

                   }                

 

                  

                   public void run() {

                           

                            //取得OA訪問地址

                            SharedPreferences sharedPref = MainActivity.this.getSharedPreferences(

                                               "oaapp", Context.MODE_PRIVATE);

                            String sUrl = sharedPref.getString("url",MainActivity.this.getString(R.string.url));

                                              

                            //取得登錄的用戶ID

                            String sLoginId = this.getLoginId(sUrl);

                            String sUrl2 = null;

 

                            int iCount = 0;

                            while (!Thread.currentThread().isInterrupted()) {

 

                                     if (!sLoginId.equals("0")) {

                                               sUrl2 = sUrl + "/online/message/refresh_action2.jsp?loginid="

                                                                 + sLoginId;

                                     }

                                     //取得信息數量

                                     iCount = this.getMessageCount(sUrl2);

 

                                     // 有新信息

                                     if (iCount > MainActivity.I_COUNT) {

                                               MainActivity.I_COUNT = iCount;

                                              //有新的消息

                                     }

                                     try {

                                               Thread.sleep(5000);

                                     } catch (InterruptedException e) {

                                               Thread.currentThread().interrupt();

                                     }

                            } //while

                  

                   } //public void run() {

                  

         }        //class CheckMessageThread2

         (二)這裏的refresh_action2.jsp是OA中的一個頁面,經過傳入用戶ID,得到當前用戶的信息數量。

         (三)完成了線程的定義,在onCreate中啓動線程:

         new Thread(new CheckMessageThread()).start();

 

線程與activity的通訊。

         當線程中檢測到有新的消息,採用handle通知MainActivity。

(一)增長Handler

         Handler myHandler = new Handler() {

                   public void handleMessage(Message msg) {

                            if (msg.what > 0) {

                                     //有新消息。

                            }

                            super.handleMessage(msg);

                   }

         };

(二) 在線程中檢測到信息,使用handle發送消息

         //有新的消息

         Message  message = new Message();

         message.what = iCount;

         message.obj = new String("有消息" + iCount);

         MainActivity.this.myHandler.sendMessage(message);

 

採用Notification實現消息提醒

(一)、在handleMessage中增長Notification代碼

         NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

         Intent intent = new Intent(MainActivity.this, MainActivity.class);

         PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0,intent, 0);

                                    

         Notification n = new Notification();

         n.icon = R.drawable.ic_launcher;

         n.tickerText = "OA消息通知";                                    

         n.defaults |= Notification.DEFAULT_SOUND;          //聲音

         n.defaults |= Notification.DEFAULT_VIBRATE;        //振動

         n.flags = Notification.FLAG_AUTO_CANCEL;           //點擊消息自動清除

         String title = msg.obj.toString();

         n.setLatestEventInfo(MainActivity.this, title, title, pi);

         nm.notify(msg.what, n);

(二)、使用振動時,須要增長配置:

         <uses-permission android:name="android.permission.VIBRATE" />

(三)、在三星手機中測試,有振動效果,聲音始終沒有,還須要進一步測試。

相關文章
相關標籤/搜索