实现目标:在安卓手机上实现一个完整的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" />
(三)、在三星手机中测试,有振动效果,声音始终没有,还需要进一步测试。