實現目標:在安卓手機上實現一個完整的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" />
(三)、在三星手機中測試,有振動效果,聲音始終沒有,還須要進一步測試。