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

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);

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值