您的位置:首页 > 移动开发

Android 系列:单例模式实现一键退出APP

2012-12-18 15:48 405 查看
http://www.ilingxi.com/blog/duanhongchang/?p=72

我们都知道Activity的finish方法只能退出当前的Activity,但如果我们希望一键退出所有已经create的Activity又该如何做呢?很简单,我们通过单例模式设计了一个管理当前活动的Activity的类,名叫MyActivityManager,代码如下:

import java.util.LinkedList;

import java.util.List;

import android.app.Activity;

import android.app.Application;

/**

* Activity管理类

* 1、activity():保存Activity

* 2、exit():关闭所有保存的Activity

* @author 段宏昌

*

*/

public class MyActivityManager extends Application {

/**

* Activity列表

*/

private List<Activity> activityList = new LinkedList<Activity>();

/**

* 全局唯一实例

*/

private static MyActivityManager instance;

/**

* 该类采用单例模式,不能实例化

*/

private MyActivityManager()

{

}

/**

* 获取类实例对象

* @return MyActivityManager

*/

public static MyActivityManager getInstance() {

if (null == instance) {

instance = new MyActivityManager();

}

return instance;

}

/**

* 保存Activity到现有列表中

* @param activity

*/

public void addActivity(Activity activity) {

activityList.add(activity);

}

/**

* 关闭保存的Activity

*/

public void exit() {

if(activityList!=null)

{

Activity activity;

for (int i=0; i<activityList.size(); i++) {

activity = activityList.get(i);

if(activity!=null)

{

if(!activity.isFinishing())

{

activity.finish();

}

activity = null;

}

activityList.remove(i);

i–;

}

}

}

}

在每个Activity的onCreate方法中调用MyActivityManager的addActivity方法,然后在需要使用一键退出的地方调用MyActivityManager中的exit方法即可

登录Web以及登录保持,cookie管理相关

对于登录功能本身没有任何特别,使用httpclient向服务器post用户名密码即可。

但是为了保持登录的状态(在各个Activity之间切换时要让网站知道用户一直是处于登录的状态)就需要进行cookie的读写。

httpclient相当强大,读写cookie非常容易:

CookieStore cookies=((AbstractHttpClient)client).getCookieStore();//读cookie

((AbstractHttpClient) client).setCookieStore(cookies);//写cookie

另外的一个问题是,为了在各个activity之间使用一个共通的cookie,需要一个全局变量来解决问题。对于java来说,可以使用静态类,但是对于android来说,更符合android结

构的作法是使用拥有这些activity的application类:

首先声明一个application类用来存取cookie:

public class myApp extends Application {

private CookieStore cookies;

public CookieStore getCookie(){

return cookies;

}

public void setCookie(CookieStore cks){

cookies = cks;

}

}

另外,要在AndroidManifest.xml文件中将上面声明的这个类绑定到包含所有activity的application上,方法是为application标签加 android:name=".myApp"

这样就可以在Activity中使用这个“全局变量”了:

//设置cookie

myApp appCookie = ((myApp)getApplication());

appCookie.setCookie(cookies);

//读取cookie

myApp appCookie = ((myApp)getApplicationContext());

cookies = appCookie.getCookie();

经过以上的步骤,android程序完成一个Web登录后就可以保持登录的状态了。

ps.

从一个httpclient取得statuscode的方法:

HttpResponse response = client.execute(mypost);

int statuscode = response.getStatusLine().getStatusCode();

做的一个是要登录自己的图书馆账号,用于查看自己所借阅的书籍,

看了一下图书馆的代码,发现是POST用户名和密码,

而在代码实现主要有两个难点:一、保存账号密码 二、保存Cookie

那么 ,第一个可以使用之前提到过的Sharedpreference ,每次就直接从sharedpreference里获取账号名和密码就可以了,不需要每次都输入

第二个怎么获得服务器的cookie呢,知道这次的session id

通过Httpclient 中的getcookiestore

List<Cookie> cookies = httpclient.getCookieStore().getCookies();

if (cookies.isEmpty()) {

Log.i(TAG, "-------Cookie NONE---------");

} else {

for (int i = 0; i < cookies.size(); i ) {

//保存cookie

cookie = cookies.get(i);

Log.d(TAG, cookies.get(i).getName() "=" cookies.get(i).getValue() );

}

获得了session id后,怎么再添加到我们的POST或者GET请求里面呢,

HttpPost httpPost = new HttpPost(访问地址);

httpPost.setHeader("Cookie", "JSESSIONID=" + 我们在静态变量里存放的SessionId);

HttpResponse httpResponse = httpclient.execute(httpPost);

HttpGet request = new HttpGet(url+"?"+Params);

request.setHeader("Cookie",Sessionid);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: