安卓开发4-访问OA实现消息自动提醒

实现目标:在安卓手机上实现一个完整的OA助手,能设置OA的访问地址,有消息到来时手机能自动提醒。

         上一次已经完成的webview相关的技术准备,接着要完善的功能:保持webview的访问状态;采用CookieManager读取webview显示OA页面的cookie;采用HttpURLConnection定时访问OA的消息提醒;线程与activity的通信;采用Notification实现消息提醒。

实现效果:  

         (一)采用WebView访问OA的效果:    

 

         (二)按下home键后,有新消息时的提醒效果:

 

保持webview的访问状态

         在MainActivity的onCreateView中通过webView.load()访问OA,每次按home健后,再次访问应用还是会重新load,这样就不能保持最后的访问状态。

         通过修改配置文件Manifest.xml可保持状态,在主activity里增加:android:launchMode="singleTask"。看到有文章说增加到application里,我测试过没有效果。

        <activity

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

                 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" />

(三)、在三星手机中测试,有振动效果,声音始终没有,还需要进一步测试。

 

 

posted @ 2014-06-14 17:18  数飞尔  阅读(516)  评论(0编辑  收藏  举报