首页 > 代码库 > [ListViewJSON][com.demo.app][AppContext]源码分析及其在工程中的作用

[ListViewJSON][com.demo.app][AppContext]源码分析及其在工程中的作用

首先插入AppContext源码

package com.demo.app;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InvalidClassException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.Hashtable;import java.util.Properties;import java.util.UUID;import android.app.Application;import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager.NameNotFoundException;import android.media.AudioManager;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.os.Handler;import android.os.Message;import com.demo.app.api.ApiClient;import com.demo.app.bean.NewsList;import com.demo.app.common.StringUtils;import com.demo.app.common.UIHelper;/** * 全局应用程序类:用于保存和调用全局应用配置及访问网络数据 *  * @version 1.0 * @created 2012-3-21 */public class AppContext extends Application {    public static final int NETTYPE_WIFI = 0x01;    public static final int NETTYPE_CMWAP = 0x02;    public static final int NETTYPE_CMNET = 0x03;    public static final int PAGE_SIZE = 10;// 默认分页大小    private static final int CACHE_TIME = 60 * 60000;// 缓存失效时间    private Hashtable<String, Object> memCacheRegion = new Hashtable<String, Object>();    private Handler unLoginHandler = new Handler() {        public void handleMessage(Message msg) {            if (msg.what == 1) {                UIHelper.ToastMessage(AppContext.this,                        getString(R.string.msg_login_error));            }        }    };    @Override    public void onCreate() {        super.onCreate();        // 注册App异常崩溃处理器        Thread.setDefaultUncaughtExceptionHandler(AppException                .getAppExceptionHandler());    }    /**     * 检测当前系统声音是否为正常模式     *      * @return     */    public boolean isAudioNormal() {        AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);        return mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL;    }    /**     * 应用程序是否发出提示音     *      * @return     */    public boolean isAppSound() {        return isAudioNormal() && isVoice();    }    /**     * 检测网络是否可用     *      * @return     */    public boolean isNetworkConnected() {        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo ni = cm.getActiveNetworkInfo();        return ni != null && ni.isConnectedOrConnecting();    }    /**     * 获取当前网络类型     *      * @return 0:没有网络 1:WIFI网络 2:WAP网络 3:NET网络     */    public int getNetworkType() {        int netType = 0;        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();        if (networkInfo == null) {            return netType;        }        int nType = networkInfo.getType();        if (nType == ConnectivityManager.TYPE_MOBILE) {            String extraInfo = networkInfo.getExtraInfo();            if (!StringUtils.isEmpty(extraInfo)) {                if (extraInfo.toLowerCase().equals("cmnet")) {                    netType = NETTYPE_CMNET;                } else {                    netType = NETTYPE_CMWAP;                }            }        } else if (nType == ConnectivityManager.TYPE_WIFI) {            netType = NETTYPE_WIFI;        }        return netType;    }    /**     * 判断当前版本是否兼容目标版本的方法     *      * @param VersionCode     * @return     */    public static boolean isMethodsCompat(int VersionCode) {        int currentVersion = android.os.Build.VERSION.SDK_INT;        return currentVersion >= VersionCode;    }    /**     * 获取App安装包信息     *      * @return     */    public PackageInfo getPackageInfo() {        PackageInfo info = null;        try {            info = getPackageManager().getPackageInfo(getPackageName(), 0);        } catch (NameNotFoundException e) {            e.printStackTrace(System.err);        }        if (info == null)            info = new PackageInfo();        return info;    }    /**     * 获取App唯一标识     *      * @return     */    public String getAppId() {        String uniqueID = getProperty(AppConfig.CONF_APP_UNIQUEID);        if (StringUtils.isEmpty(uniqueID)) {            uniqueID = UUID.randomUUID().toString();            setProperty(AppConfig.CONF_APP_UNIQUEID, uniqueID);        }        return uniqueID;    }    /**     * 是否加载显示文章图片     *      * @return     */    public boolean isLoadImage() {        String perf_loadimage = getProperty(AppConfig.CONF_LOAD_IMAGE);        // 默认是加载的        if (StringUtils.isEmpty(perf_loadimage))            return true;        else            return StringUtils.toBool(perf_loadimage);    }    /**     * 设置是否加载文章图片     *      * @param b     */    public void setConfigLoadimage(boolean b) {        setProperty(AppConfig.CONF_LOAD_IMAGE, String.valueOf(b));    }    /**     * 是否发出提示音     *      * @return     */    public boolean isVoice() {        String perf_voice = getProperty(AppConfig.CONF_VOICE);        // 默认是开启提示声音        if (StringUtils.isEmpty(perf_voice))            return true;        else            return StringUtils.toBool(perf_voice);    }    /**     * 设置是否发出提示音     *      * @param b     */    public void setConfigVoice(boolean b) {        setProperty(AppConfig.CONF_VOICE, String.valueOf(b));    }    /**     * 是否左右滑动     *      * @return     */    public boolean isScroll() {        String perf_scroll = getProperty(AppConfig.CONF_SCROLL);        // 默认是关闭左右滑动        if (StringUtils.isEmpty(perf_scroll))            return false;        else            return StringUtils.toBool(perf_scroll);    }    /**     * 设置是否左右滑动     *      * @param b     */    public void setConfigScroll(boolean b) {        setProperty(AppConfig.CONF_SCROLL, String.valueOf(b));    }    /**     * 是否Https登录     *      * @return     */    public boolean isHttpsLogin() {        String perf_httpslogin = getProperty(AppConfig.CONF_HTTPS_LOGIN);        // 默认是http        if (StringUtils.isEmpty(perf_httpslogin))            return false;        else            return StringUtils.toBool(perf_httpslogin);    }    /**     * 设置是是否Https登录     *      * @param b     */    public void setConfigHttpsLogin(boolean b) {        setProperty(AppConfig.CONF_HTTPS_LOGIN, String.valueOf(b));    }    /**     * 清除保存的缓存     */    public void cleanCookie() {        removeProperty(AppConfig.CONF_COOKIE);    }    /**     * 判断缓存数据是否可读     *      * @param cachefile     * @return     */    private boolean isReadDataCache(String cachefile) {        return readObject(cachefile) != null;    }    /**     * 判断缓存是否存在     *      * @param cachefile     * @return     */    private boolean isExistDataCache(String cachefile) {        boolean exist = false;        File data = getFileStreamPath(cachefile);        if (data.exists())            exist = true;        return exist;    }    /**     * 判断缓存是否失效     *      * @param cachefile     * @return     */    public boolean isCacheDataFailure(String cachefile) {        boolean failure = false;        File data = getFileStreamPath(cachefile);        if (data.exists()                && (System.currentTimeMillis() - data.lastModified()) > CACHE_TIME)            failure = true;        else if (!data.exists())            failure = true;        return failure;    }    /**     * 清除app缓存     */    public void clearAppCache() {        // //清除webview缓存        // File file = CacheManager.getCacheFileBaseDir();        // if (file != null && file.exists() && file.isDirectory()) {        // for (File item : file.listFiles()) {        // item.delete();        // }        // file.delete();        // }        // deleteDatabase("webview.db");        // deleteDatabase("webview.db-shm");        // deleteDatabase("webview.db-wal");        // deleteDatabase("webviewCache.db");        // deleteDatabase("webviewCache.db-shm");        // deleteDatabase("webviewCache.db-wal");        // //清除数据缓存        // clearCacheFolder(getFilesDir(),System.currentTimeMillis());        // clearCacheFolder(getCacheDir(),System.currentTimeMillis());        // //2.2版本才有将应用缓存转移到sd卡的功能        // if(isMethodsCompat(android.os.Build.VERSION_CODES.FROYO)){        // clearCacheFolder(MethodsCompat.getExternalCacheDir(this),System.currentTimeMillis());        // }        // //清除编辑器保存的临时内容        // Properties props = getProperties();        // for(Object key : props.keySet()) {        // String _key = key.toString();        // if(_key.startsWith("temp"))        // removeProperty(_key);        // }    }    /**     * 清除缓存目录     *      * @param dir     *            目录     * @param numDays     *            当前系统时间     * @return     */    private int clearCacheFolder(File dir, long curTime) {        int deletedFiles = 0;        if (dir != null && dir.isDirectory()) {            try {                for (File child : dir.listFiles()) {                    if (child.isDirectory()) {                        deletedFiles += clearCacheFolder(child, curTime);                    }                    if (child.lastModified() < curTime) {                        if (child.delete()) {                            deletedFiles++;                        }                    }                }            } catch (Exception e) {                e.printStackTrace();            }        }        return deletedFiles;    }    /**     * 将对象保存到内存缓存中     *      * @param key     * @param value     */    public void setMemCache(String key, Object value) {        memCacheRegion.put(key, value);    }    /**     * 从内存缓存中获取对象     *      * @param key     * @return     */    public Object getMemCache(String key) {        return memCacheRegion.get(key);    }    /**     * 保存磁盘缓存     *      * @param key     * @param value     * @throws IOException     */    public void setDiskCache(String key, String value) throws IOException {        FileOutputStream fos = null;        try {            fos = openFileOutput("cache_" + key + ".data", Context.MODE_PRIVATE);            fos.write(value.getBytes());            fos.flush();        } finally {            try {                fos.close();            } catch (Exception e) {            }        }    }    /**     * 获取磁盘缓存数据     *      * @param key     * @return     * @throws IOException     */    public String getDiskCache(String key) throws IOException {        FileInputStream fis = null;        try {            fis = openFileInput("cache_" + key + ".data");            byte[] datas = new byte[fis.available()];            fis.read(datas);            return new String(datas);        } finally {            try {                fis.close();            } catch (Exception e) {            }        }    }    /**     * 保存对象     *      * @param ser     * @param file     * @throws IOException     */    public boolean saveObject(Serializable ser, String file) {        FileOutputStream fos = null;        ObjectOutputStream oos = null;        try {            fos = openFileOutput(file, MODE_PRIVATE);            oos = new ObjectOutputStream(fos);            oos.writeObject(ser);            oos.flush();            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        } finally {            try {                oos.close();            } catch (Exception e) {            }            try {                fos.close();            } catch (Exception e) {            }        }    }    /**     * 读取对象     *      * @param file     * @return     * @throws IOException     */    public Serializable readObject(String file) {        if (!isExistDataCache(file))            return null;        FileInputStream fis = null;        ObjectInputStream ois = null;        try {            fis = openFileInput(file);            ois = new ObjectInputStream(fis);            return (Serializable) ois.readObject();        } catch (FileNotFoundException e) {        } catch (Exception e) {            e.printStackTrace();            // 反序列化失败 - 删除缓存文件            if (e instanceof InvalidClassException) {                File data = getFileStreamPath(file);                data.delete();            }        } finally {            try {                ois.close();            } catch (Exception e) {            }            try {                fis.close();            } catch (Exception e) {            }        }        return null;    }    /**     * 获取新闻数据列表     *      * @return     * @throws AppException      */    public NewsList getNewsList() throws AppException {        NewsList list = null;        String key = "newslist_";        if (isNetworkConnected() && !isReadDataCache(key)) {            try {                list = ApiClient.getNewsList(this);            } catch (AppException e) {                list = (NewsList) readObject(key);                if (list == null)                    throw e;            }        } else {            list = (NewsList) readObject(key);            if (list == null)                list = new NewsList();        }        return list;    }    public boolean containsProperty(String key) {        Properties props = getProperties();        return props.containsKey(key);    }    public void setProperties(Properties ps) {        AppConfig.getAppConfig(this).set(ps);    }    public Properties getProperties() {        return AppConfig.getAppConfig(this).get();    }    public void setProperty(String key, String value) {        AppConfig.getAppConfig(this).set(key, value);    }    public String getProperty(String key) {        return AppConfig.getAppConfig(this).get(key);    }    public void removeProperty(String... key) {        AppConfig.getAppConfig(this).remove(key);    }}

 

引用

 http://www.pocketcn.com/forum-viewthread-tid-1565-fromuid-1477.html

“接触android已经有一段时间了,一直以为android程序的入口是配置文件中指定的Activity,最近看一个开源项目,发现里面实现了android 的Application类,才知道,android程序的真正入口是Application类的onCreate方法。”

http://www.cnblogs.com/elleniou/archive/2012/05/16/2502661.html

“Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。

  android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作。”

 

在这个程序的源码中AppContext就继承了Application类。

[ListViewJSON][com.demo.app][AppContext]源码分析及其在工程中的作用