zoukankan      html  css  js  c++  java
  • 安卓开发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" />

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

  • 相关阅读:
    项目包结构
    准备dbcp2-2.1.1和pool2-2.4.2 、commons-dbcp-1.4jar包
    导入javax.servlet。伺服登记无法解决:The import javax.servlet.MultipartConfigElement cannot be resolved
    准备mysql-connector-java
    准备mybatis-spring
    准备spring
    准备MyBatis
    vim编辑器使用
    jquery怎样做出分页效果
    快速入门系列--WCF--02消息、会话与服务寄宿
  • 原文地址:https://www.cnblogs.com/soarwell/p/3788440.html
Copyright © 2011-2022 走看看