Android 实例解说Application类

  何为Application,有何用途?Google官方文档是这样说的:维护全局应用程序的状态,使用的时候继承于它创建一个子类即可,同时在AndroidManifest.xml文件的<application> 标签的name属性制定它的名字,也就是子类名称。当应用程序的包被创建的时候这个类就会被实例化,而且它的生命周期和应用程序是一样的。不过Google在下面的提示中也说道大多数情况下不需要使用这个类,因为如果应用程序使用了单例模式的话,效果和Application提供的事一样的,而且也更加容易控制、规范。

  关于Application类有以下公开方法:

  
 其中最常用的就是onCreaet()、onTerminate()以及onLowMemory()方法,onCreaet()它会在这个类实例化的时候调用(这个地方需要十分注意,它只会在程序第一次启动的时候调用,不是每次都调用,因为Application类会在创建包的时候初始化),onTerminate()会在app关闭的时候调用,onLowMemory()是在内存过低的情况下调用的。那onTerminate()是干什么用的呢?网上介绍说是在程序终结的时候调用,从下面的实例中也是这样用的。不过在Google的开发文档以及很多书籍对这个类的用法很少提及,但实际开发情况是如何的呢。不妨反编译几个常用的app一看究竟,因为涉及到一些因素就不方便说是哪个app,以代号表明。
  
  1、app_1
   先把代码贴出来,因为这个app的Application的实现比较简单,就先拿出来说。
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import android.annotation.TargetApi;  
  2. import android.app.Application;  
  3. import android.content.Context;  
  4. import android.os.Build.VERSION;  
  5. import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;  
  6. import com.nostra13.universalimageloader.core.ImageLoader;  
  7. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;  
  8. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration.Builder;  
  9. import com.nostra13.universalimageloader.core.assist.QueueProcessingType;  
  10. import java.io.PrintStream;  
  11. import org.apache.http.HttpVersion;  
  12. import org.apache.http.client.HttpClient;  
  13. import org.apache.http.conn.ClientConnectionManager;  
  14. import org.apache.http.conn.scheme.PlainSocketFactory;  
  15. import org.apache.http.conn.scheme.Scheme;  
  16. import org.apache.http.conn.scheme.SchemeRegistry;  
  17. import org.apache.http.conn.ssl.SSLSocketFactory;  
  18. import org.apache.http.impl.client.DefaultHttpClient;  
  19. import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;  
  20. import org.apache.http.params.BasicHttpParams;  
  21. import org.apache.http.params.HttpConnectionParams;  
  22. import org.apache.http.params.HttpProtocolParams;  
  23.   
  24. public class MyApplication  
  25.   extends Application  
  26. {  
  27.   private HttpClient httpClient;  
  28.   public boolean isLogin = false;  
  29.    
  30.   private HttpClient createHttpClient()  
  31.   {  
  32.     BasicHttpParams localBasicHttpParams = new BasicHttpParams();  
  33.     HttpProtocolParams.setVersion(localBasicHttpParams, HttpVersion.HTTP_1_1);  
  34.     HttpProtocolParams.setContentCharset(localBasicHttpParams, "ISO-8859-1");  
  35.     HttpProtocolParams.setUseExpectContinue(localBasicHttpParams, true);  
  36.     HttpConnectionParams.setConnectionTimeout(localBasicHttpParams, 20000);  
  37.     HttpConnectionParams.setSoTimeout(localBasicHttpParams, 20000);  
  38.     HttpConnectionParams.setSocketBufferSize(localBasicHttpParams, 8192);  
  39.     SchemeRegistry localSchemeRegistry = new SchemeRegistry();  
  40.     localSchemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));  
  41.     localSchemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));  
  42.     return new DefaultHttpClient(new ThreadSafeClientConnManager(localBasicHttpParams, localSchemeRegistry), localBasicHttpParams);  
  43.   }  
  44.    
  45.   public static void initImageLoader(Context paramContext)  
  46.   {  
  47.     ImageLoaderConfiguration localImageLoaderConfiguration = new ImageLoaderConfiguration.Builder(paramContext).threadPriority(3).denyCacheImageMultipleSizesInMemory().discCacheFileNameGenerator(new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.LIFO).writeDebugLogs().build();  
  48.     ImageLoader.getInstance().init(localImageLoaderConfiguration);  
  49.   }  
  50.    
  51.   private void shutdownHttpClient()  
  52.   {  
  53.     if ((this.httpClient != null) && (this.httpClient.getConnectionManager() != null)) {  
  54.       this.httpClient.getConnectionManager().shutdown();  
  55.     }  
  56.   }  
  57.    
  58.   public HttpClient getHttpClient()  
  59.   {  
  60.     return this.httpClient;  
  61.   }  
  62.    
  63.   @TargetApi(9)  
  64.   public void onCreate()  
  65.   {  
  66.     super.onCreate();  
  67.     this.httpClient = createHttpClient();  
  68.     System.out.println(Build.VERSION.SDK_INT);  
  69.     initImageLoader(getApplicationContext());  
  70.   }  
  71.    
  72.   public void onLowMemory()  
  73.   {  
  74.     super.onLowMemory();  
  75.     shutdownHttpClient();  
  76.   }  
  77.    
  78.   public void onTerminate()  
  79.   {  
  80.     super.onTerminate();  
  81.     shutdownHttpClient();  
  82.   }  
  83.    
  84.   public static class Config  
  85.   {  
  86.     public static final boolean DEVELOPER_MODE;  
  87.   }  
  88. }  
   从import导入的包就可以看出来,在这个类里面使用了强大的universalimageloader异步加载图片以及使用的apache的HttpClient。然后整体看一下这个类,发现它不仅重载了 onCreate()方法,还重载了onLowMemory()以及onTerminate()方法。onLowMemory()顾名思义就是在Android系统内存低的情况下调用的,可以在这个方法里面做一下释放内存的功能。
  那就从onCreate()方法开始,里面代码如下:
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. this.httpClient = createHttpClient();  
  2. System.out.println(Build.VERSION.SDK_INT);  
  3. initImageLoader(getApplicationContext());  
  第一个方法,创建httpClient 的对象,至于方法的具体细节就不介绍了,不是本文讨论重点,下同。第二个方法就是初始化universalimageloader了。总体来说这个app的Application的实现还是比较简单的,也比较容易理解。接下来介绍一个稍微复杂一点的。
2、app_2
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import android.app.Application;  
  2. import android.content.pm.ApplicationInfo;  
  3. import android.content.pm.PackageManager;  
  4. import android.os.Bundle;  
  5. import android.os.Environment;  
  6. import android.widget.Toast;  
  7. import com.baidu.mapapi.BMapManager;  
  8. import com.baidu.mapapi.MKGeneralListener;  
  9. import com.baidu.mapapi.MKLocationManager;  
  10. import java.io.File;  
  11.   
  12. public class App  
  13.   extends Application  
  14. {  
  15.   public static App app;  
  16.   public static boolean hideOtherExchanges = false;  
  17.   public static boolean hideUpdateNotice = false;  
  18.   public BMapManager mBMapMan = null;  
  19.   public String mStrKey = "4BFEB7A7F3E7CD4B0FBAE61BABD11F1E11D7EAC8";  
  20.    
  21.   public static void delete(File paramFile)  
  22.   {  
  23.     if (paramFile.isFile()) {  
  24.       paramFile.delete();  
  25.     }  
  26.     while (!paramFile.isDirectory()) {  
  27.       return;  
  28.     }  
  29.     File[] arrayOfFile = paramFile.listFiles();  
  30.     if ((arrayOfFile == null) || (arrayOfFile.length == 0))  
  31.     {  
  32.       paramFile.delete();  
  33.       return;  
  34.     }  
  35.     for (int i = 0;; i++)  
  36.     {  
  37.       if (i >= arrayOfFile.length)  
  38.       {  
  39.         paramFile.delete();  
  40.         return;  
  41.       }  
  42.       delete(arrayOfFile[i]);  
  43.     }  
  44.   }  
  45.    
  46.   public boolean init()  
  47.   {  
  48.     this.mBMapMan = new BMapManager(this);  
  49.     return this.mBMapMan.init(this.mStrKey, new MyGeneralListener());  
  50.   }  
  51.    
  52.   public void onCreate()  
  53.   {  
  54.     app = this;  
  55.     if (init()) {  
  56.       this.mBMapMan.getLocationManager().setNotifyInternal(10, 5);  
  57.     }  
  58.     super.onCreate();  
  59.     try  
  60.     {  
  61.       localBundle = getPackageManager().getApplicationInfo(getPackageName(), 128).metaData;  
  62.       str2 = localBundle.getString("UMENG_CHANNEL");  
  63.       arrayOfString1 = localBundle.getString("HIDE_OTHER_EXCHANGE_APK_CHANNEL").split(",");  
  64.       i = 0;  
  65.     }  
  66.     catch (Exception localException1)  
  67.     {  
  68.       for (;;)  
  69.       {  
  70.         Bundle localBundle;  
  71.         String str2;  
  72.         String[] arrayOfString1;  
  73.         int i;  
  74.         String[] arrayOfString2;  
  75.         int j;  
  76.         Logger.w(localException1);  
  77.         continue;  
  78.         i++;  
  79.         continue;  
  80.         label303:  
  81.         if (arrayOfString2[j].equals(str2)) {  
  82.           hideUpdateNotice = true;  
  83.         } else {  
  84.           j++;  
  85.         }  
  86.       }  
  87.     }  
  88.     if (i >= arrayOfString1.length) {}  
  89.     for (;;)  
  90.     {  
  91.       arrayOfString2 = localBundle.getString("HIDE_DOUGUO_UPDATE_NOTICE").split(",");  
  92.       j = 0;  
  93.       int k = arrayOfString2.length;  
  94.       if (j < k) {  
  95.         break label303;  
  96.       }  
  97.       WeiboHelper.setConfig(app);  
  98.       RenrenHelper.setConfig(app);  
  99.       DouguoWebAPI.setConfig(app);  
  100.       Logger.setConfig(app);  
  101.       Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(getApplicationContext()));  
  102.       try  
  103.       {  
  104.         String str1 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/douguo/" + getPackageName();  
  105.         File localFile1 = new File(str1);  
  106.         File localFile2 = localFile1.getParentFile();  
  107.         if (!localFile2.exists()) {  
  108.           localFile2.mkdir();  
  109.         }  
  110.         if (!localFile1.exists()) {  
  111.           localFile1.mkdir();  
  112.         }  
  113.         File localFile3 = new File(str1 + "/.nomedia");  
  114.         if (!localFile3.exists()) {  
  115.           localFile3.createNewFile();  
  116.         }  
  117.         return;  
  118.       }  
  119.       catch (Exception localException2)  
  120.       {  
  121.         Logger.w(localException2);  
  122.       }  
  123.       if (!arrayOfString1[i].equals(str2)) {  
  124.         break;  
  125.       }  
  126.       hideOtherExchanges = true;  
  127.     }  
  128.   }  
  129.    
  130.   public void onLowMemory()  
  131.   {  
  132.     super.onLowMemory();  
  133.     Logger.e("!!!!!!!!!!!!!!onLowMemory!!!!!!!!!!!!");  
  134.   }  
  135.    
  136.   public void onTerminate()  
  137.   {  
  138.     if (this.mBMapMan != null)  
  139.     {  
  140.       this.mBMapMan.destroy();  
  141.       this.mBMapMan = null;  
  142.     }  
  143.     super.onTerminate();  
  144.     new Thread()  
  145.     {  
  146.       public void run()  
  147.       {  
  148.         App.delete(new File(Environment.getExternalStorageDirectory() + "/douguo/yummyDiary/"));  
  149.       }  
  150.     }.start();  
  151.   }  
  152.    
  153.   static class MyGeneralListener  
  154.     implements MKGeneralListener  
  155.   {  
  156.     public void onGetNetworkState(int paramInt)  
  157.     {  
  158.       Toast.makeText(App.app.getApplicationContext(), "您的网络出错啦!", 1).show();  
  159.     }  
  160.      
  161.     public void onGetPermissionState(int paramInt) {}  
  162.   }  
  163. }  
  这个类有两个自定义的方法,一个是delete(File paramFile),用于删除指定文件,一个是 init(),用于初始化百度地图以及网络连接。进入onCreate()方法,首选是给变量app实例化。接着调用init()方法进行判断,如果在init()方法返回true,说明有网络连接正常并且已经初始化完毕百度地图,之后会不断发送tNotify通知。然后进入try catch方法里面,由于反编译的问题,有些语句反编译完毕后就是现在这个样子。至于如何解读,以后会介绍,现在不是重点。看一下,在try里面是初始化了友盟的一些东西,然后再catch里面声明了一些变量,并且根据某些条件创建或者删除指定的文件。最后就是onTerminate()方法,可以看到在这个方法里面它销毁了百度地图、删除了一些程序的文件等。
  
3、app_3
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import android.app.ActivityManager;  
  2. import android.app.ActivityManager.RunningAppProcessInfo;  
  3. import android.app.Application;  
  4. import android.content.Context;  
  5. import android.os.Process;  
  6. import com.baidu.android.silentupdate.SilentManager;  
  7. import java.util.Iterator;  
  8. import java.util.List;  
  9.   
  10. public class FrontiaApplication  
  11.   extends Application  
  12. {  
  13.   private static final String a = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYAFbG0oYmKgh6o7BhZIHf1njBpZXqyWBnYz2ip3Wp+s97OeA/pTe8xebuGJHwq4xbsGQrJWepIbUVrdjm6JRmdvuJhar7/hC/UNnUkJgYdYl10OZKlvcFFgK3V7XGBPplXldDnhbgscna3JG8U3025WSxZCP5vy/8cfxsEoVx5QIDAQAB";  
  14.    
  15.   public static void initFrontiaApplication(Context paramContext)  
  16.   {  
  17.     SilentManager.setKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYAFbG0oYmKgh6o7BhZIHf1njBpZXqyWBnYz2ip3Wp+s97OeA/pTe8xebuGJHwq4xbsGQrJWepIbUVrdjm6JRmdvuJhar7/hC/UNnUkJgYdYl10OZKlvcFFgK3V7XGBPplXldDnhbgscna3JG8U3025WSxZCP5vy/8cfxsEoVx5QIDAQAB");  
  18.     SilentManager.enableRSA(false);  
  19.     SilentManager.loadLib(paramContext.getApplicationContext(), "frontia_plugin", "plugin-deploy.jar");  
  20.   }  
  21.    
  22.   public void onCreate()  
  23.   {  
  24.     super.onCreate();  
  25.     ActivityManager localActivityManager = (ActivityManager)getSystemService("activity");  
  26.     int i = Process.myPid();  
  27.     Iterator localIterator = localActivityManager.getRunningAppProcesses().iterator();  
  28.     while (localIterator.hasNext())  
  29.     {  
  30.       ActivityManager.RunningAppProcessInfo localRunningAppProcessInfo = (ActivityManager.RunningAppProcessInfo)localIterator.next();  
  31.       if ((localRunningAppProcessInfo.pid == i) && (!localRunningAppProcessInfo.processName.endsWith(getPackageName()))) {  
  32.         initFrontiaApplication(getApplicationContext());  
  33.       }  
  34.     }  
  35.   }  
  36. }  
  37.   
  38. import android.content.Context;  
  39. import com.baidu.frontia.FrontiaApplication;  
  40. import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;  
  41. import com.nostra13.universalimageloader.core.ImageLoader;  
  42. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;  
  43. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration.Builder;  
  44. import com.nostra13.universalimageloader.core.assist.QueueProcessingType;  
  45.   
  46. public class UILApplication  
  47.   extends FrontiaApplication  
  48. {  
  49.   public static void initImageLoader(Context paramContext)  
  50.   {  
  51.     ImageLoaderConfiguration localImageLoaderConfiguration = new ImageLoaderConfiguration.Builder(paramContext).threadPriority(3).denyCacheImageMultipleSizesInMemory().discCacheFileNameGenerator(new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.LIFO).build();  
  52.     ImageLoader.getInstance().init(localImageLoaderConfiguration);  
  53.   }  
  54.    
  55.   public void onCreate()  
  56.   {  
  57.     com.nostra13.universalimageloader.utils.StorageUtils.basePath = "Meishi";  
  58.     com.nostra13.universalimageloader.utils.StorageUtils.childPath = "Temp";  
  59.     com.nostra13.universalimageloader.utils.StorageUtils.childImgName = "imgs";  
  60.     super.onCreate();  
  61.     CrashHandler.getInstance().init(this);  
  62.     initImageLoader(getApplicationContext());  
  63.   }  
  64. }  
  这个app的Application的实现比较特殊一点,使用了两个类,在第一个类的onCreate()方法里面主要是先是获取所有的进程,然后迭代进行判断,如果满足条件则调用initFrontiaApplication()方法用来设置key。第二个类则用于初始化universalimageloader。其实觉得没有必要分开来操作,写在一个Application类里面即可。

4、app_4
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import android.app.Application;  
  2. import android.graphics.Bitmap.Config;  
  3. import android.text.TextUtils;  
  4. import android.webkit.CookieManager;  
  5. import android.webkit.CookieSyncManager;  
  6. import cn.jpush.android.api.BasicPushNotificationBuilder;  
  7. import cn.jpush.android.api.JPushInterface;  
  8. import com.baidu.location.BDLocation;  
  9. import com.baidu.location.LocationClient;  
  10. import com.baidu.location.LocationClientOption;  
  11. import com.baidu.mapapi.BMapManager;  
  12. import com.baidu.mapapi.MKGeneralListener;  
  13. import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;  
  14. import com.nostra13.universalimageloader.core.DisplayImageOptions;  
  15. import com.nostra13.universalimageloader.core.DisplayImageOptions.Builder;  
  16. import com.nostra13.universalimageloader.core.ImageLoader;  
  17. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;  
  18. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration.Builder;  
  19. import com.nostra13.universalimageloader.core.assist.ImageScaleType;  
  20. import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;  
  21. import java.util.Calendar;  
  22. import java.util.Date;  
  23.   
  24. public class AzkApp  
  25.   extends Application  
  26. {  
  27.   public static final String BASEURL = Api.BASE_URL;  
  28.   public static DisplayImageOptions avatarOptions;  
  29.   public static DisplayImageOptions defaultOptions;  
  30.   private static AzkApp instance;  
  31.   private static boolean jpushInitied;  
  32.   public static DisplayImageOptions noStubOptions;  
  33.   private final String COOKIEURL = "http://aimeiwei.me";  
  34.   public BDLocation bdLocation;  
  35.   private CookieManager cookieManager;  
  36.   private CookieSyncManager cookieSyncManager;  
  37.   public BMapManager mBMapMan;  
  38.   public LocationClient mLocationClient;  
  39.   public int mapCount;  
  40.   private String nickname = "";  
  41.   private String password = "";  
  42.   private String username = "";  
  43.    
  44.   private String getBaiduKey()  
  45.   {  
  46.     return AzkHelper.getMetaData(getApplicationContext(), "BAIDU_KEY");  
  47.   }  
  48.    
  49.   public static AzkApp getInstance()  
  50.   {  
  51.     return instance;  
  52.   }  
  53.    
  54.   private void initCookieManager()  
  55.   {  
  56.     this.cookieSyncManager = CookieSyncManager.createInstance(this);  
  57.     this.cookieManager = CookieManager.getInstance();  
  58.     this.cookieManager.setAcceptCookie(true);  
  59.     if (isLogin())  
  60.     {  
  61.       String str = this.cookieManager.getCookie("http://aimeiwei.me");  
  62.       if ((str == null) || (!str.contains("username")) || (!str.contains("password")))  
  63.       {  
  64.         AzkHelper.showLog("初始化cookie");  
  65.         setCookie(this.username, this.password);  
  66.       }  
  67.     }  
  68.     showCookie();  
  69.   }  
  70.    
  71.   private void initHttp()  
  72.   {  
  73.     AzkHelper.showLog("httpClient初始化");  
  74.     Http.initHttp(AzkHelper.sAzkUserAgent);  
  75.     Http.setBaseUrl(Api.API_URL);  
  76.     if ((!TextUtils.isEmpty(this.username)) && (!TextUtils.isEmpty(this.password))) {  
  77.       Http.setUser(this.username, this.password);  
  78.     }  
  79.   }  
  80.    
  81.   private void initImageLoader()  
  82.   {  
  83.     AzkHelper.showLog("ImageLoader图片加载器初始化");  
  84.     long l1 = Runtime.getRuntime().maxMemory();  
  85.     long l2 = l1 / 1024L / 1024L;  
  86.     AzkHelper.showLog("maxHeap: " + l2);  
  87.     int i = (int)l1 / 4;  
  88.     DisplayImageOptions.Builder localBuilder1 = new DisplayImageOptions.Builder();  
  89.     DisplayImageOptions.Builder localBuilder2 = localBuilder1.showImageOnLoading(2130837835);  
  90.     Bitmap.Config localConfig;  
  91.     ImageScaleType localImageScaleType;  
  92.     label103:  
  93.     int j;  
  94.     label188:  
  95.     ImageLoaderConfiguration.Builder localBuilder6;  
  96.     if (l2 >= 256L)  
  97.     {  
  98.       localConfig = Bitmap.Config.ARGB_8888;  
  99.       DisplayImageOptions.Builder localBuilder3 = localBuilder2.bitmapConfig(localConfig);  
  100.       if (l2 < 256L) {  
  101.         break label283;  
  102.       }  
  103.       localImageScaleType = ImageScaleType.IN_SAMPLE_POWER_OF_2;  
  104.       localBuilder3.imageScaleType(localImageScaleType).cacheInMemory(true).cacheOnDisc(true);  
  105.       defaultOptions = localBuilder1.build();  
  106.       DisplayImageOptions.Builder localBuilder4 = new DisplayImageOptions.Builder();  
  107.       localBuilder4.cacheInMemory(true).cacheOnDisc(true);  
  108.       noStubOptions = localBuilder4.build();  
  109.       ImageLoaderConfiguration.Builder localBuilder5 = new ImageLoaderConfiguration.Builder(getApplicationContext()).memoryCacheExtraOptions(Constants.IMAGE_SIZE, Constants.IMAGE_SIZE);  
  110.       if (l2 < 256L) {  
  111.         break label291;  
  112.       }  
  113.       j = 1;  
  114.       localBuilder6 = localBuilder5.threadPriority(5 - j);  
  115.       if (l2 < 256L) {  
  116.         break label297;  
  117.       }  
  118.     }  
  119.     label283:  
  120.     label291:  
  121.     label297:  
  122.     for (int k = 3;; k = 2)  
  123.     {  
  124.       ImageLoaderConfiguration localImageLoaderConfiguration = localBuilder6.threadPoolSize(k).memoryCacheSize(i).memoryCache(new WeakMemoryCache()).denyCacheImageMultipleSizesInMemory().defaultDisplayImageOptions(defaultOptions).build();  
  125.       ImageLoader.getInstance().init(localImageLoaderConfiguration);  
  126.       avatarOptions = localBuilder1.displayer(new RoundedBitmapDisplayer(8)).build();  
  127.       return;  
  128.       localConfig = Bitmap.Config.RGB_565;  
  129.       break;  
  130.       localImageScaleType = ImageScaleType.IN_SAMPLE_INT;  
  131.       break label103;  
  132.       j = 2;  
  133.       break label188;  
  134.     }  
  135.   }  
  136.    
  137.   private void removeCookie()  
  138.   {  
  139.     this.cookieManager.removeSessionCookie();  
  140.     this.cookieManager.removeAllCookie();  
  141.     this.cookieSyncManager.sync();  
  142.   }  
  143.    
  144.   private void setCookie(String paramString1, String paramString2)  
  145.   {  
  146.     Calendar localCalendar = Calendar.getInstance();  
  147.     localCalendar.set(2025, 11, 29);  
  148.     String str = localCalendar.getTime().toString();  
  149.     this.cookieManager.setCookie("http://aimeiwei.me", "username=" + paramString1 + "path=/; expires=" + str);  
  150.     this.cookieManager.setCookie("http://aimeiwei.me", "password=" + paramString2 + "path=/; expires=" + str);  
  151.     this.cookieSyncManager.sync();  
  152.     showCookie();  
  153.   }  
  154.    
  155.   private void setJpushAlias()  
  156.   {  
  157.     AzkHelper.showLog("jpush", "username: " + this.username);  
  158.     JPushInterface.setAliasAndTags(this, this.username, null);  
  159.   }  
  160.    
  161.   private void showCookie()  
  162.   {  
  163.     String str = this.cookieManager.getCookie("http://aimeiwei.me");  
  164.     AzkHelper.showLog("cookie:" + str);  
  165.   }  
  166.    
  167.   public String getNickname()  
  168.   {  
  169.     return this.nickname;  
  170.   }  
  171.    
  172.   public String getPassword()  
  173.   {  
  174.     return this.password;  
  175.   }  
  176.    
  177.   public String getUsername()  
  178.   {  
  179.     return this.username;  
  180.   }  
  181.    
  182.   public void initBMapManager()  
  183.   {  
  184.     if (this.mBMapMan == null)  
  185.     {  
  186.       this.mBMapMan = new BMapManager(this);  
  187.       String str = getBaiduKey();  
  188.       AzkHelper.showLog("初始化BMapManager, BAIDU_KEY: " + str);  
  189.       this.mBMapMan.init(str, new MKGeneralListener()  
  190.       {  
  191.         public void onGetNetworkState(int paramAnonymousInt)  
  192.         {  
  193.           if (paramAnonymousInt == 2) {  
  194.             AzkHelper.showErrorLog("您的网络出错啦!");  
  195.           }  
  196.         }  
  197.          
  198.         public void onGetPermissionState(int paramAnonymousInt)  
  199.         {  
  200.           if (paramAnonymousInt == 300) {  
  201.             AzkHelper.showLog("请输入正确的百度授权Key");  
  202.           }  
  203.         }  
  204.       });  
  205.     }  
  206.   }  
  207.    
  208.   public void initJpush()  
  209.   {  
  210.     if (jpushInitied) {  
  211.       return;  
  212.     }  
  213.     AzkHelper.showLog("极光推送初始化");  
  214.     AzkHelper.showLog("jpush", "极光推送初始化");  
  215.     JPushInterface.init(this);  
  216.     BasicPushNotificationBuilder localBasicPushNotificationBuilder = new BasicPushNotificationBuilder(this);  
  217.     localBasicPushNotificationBuilder.statusBarDrawable = 2130837777;  
  218.     JPushInterface.setPushNotificationBuilder(Integer.valueOf(1), localBasicPushNotificationBuilder);  
  219.     if (!TextUtils.isEmpty(this.username)) {  
  220.       setJpushAlias();  
  221.     }  
  222.     jpushInitied = true;  
  223.   }  
  224.    
  225.   public void initMap()  
  226.   {  
  227.     AzkHelper.showLog("百度地图初始化");  
  228.     this.mLocationClient = new LocationClient(this);  
  229.     LocationClientOption localLocationClientOption = new LocationClientOption();  
  230.     localLocationClientOption.setProdName(getString(2131296262));  
  231.     localLocationClientOption.setOpenGps(true);  
  232.     localLocationClientOption.setPriority(2);  
  233.     localLocationClientOption.setAddrType("all");  
  234.     localLocationClientOption.setCoorType("gcj02");  
  235.     this.mLocationClient.setLocOption(localLocationClientOption);  
  236.     this.mLocationClient.setAK(getBaiduKey());  
  237.     initBMapManager();  
  238.   }  
  239.    
  240.   public boolean isLogin()  
  241.   {  
  242.     boolean bool = true;  
  243.     if ((TextUtils.isEmpty(this.username)) || (TextUtils.isEmpty(this.password))) {  
  244.       bool = false;  
  245.     }  
  246.     return bool;  
  247.   }  
  248.    
  249.   public boolean isYourself(User paramUser)  
  250.   {  
  251.     if ((TextUtils.isEmpty(this.username)) || (paramUser == null)) {  
  252.       return false;  
  253.     }  
  254.     return this.username.equals(paramUser.getId());  
  255.   }  
  256.    
  257.   public boolean isYourself(UserNew paramUserNew)  
  258.   {  
  259.     if ((TextUtils.isEmpty(this.username)) || (paramUserNew == null)) {  
  260.       return false;  
  261.     }  
  262.     return this.username.equals(paramUserNew.getId());  
  263.   }  
  264.    
  265.   public void onCreate()  
  266.   {  
  267.     AzkHelper.showLog("Application Aimeiwei onCreate");  
  268.     super.onCreate();  
  269.     instance = this;  
  270.     AzkHelper.prepareUserAgent(this);  
  271.     this.username = AzkHelper.getStringPref(this, "username");  
  272.     this.password = AzkHelper.getStringPref(this, "password");  
  273.     this.nickname = AzkHelper.getStringPref(this, "nickname");  
  274.     AzkHelper.showLog("BuildConfig.DEBUG: false");  
  275.     AzkHelper.closeLog();  
  276.     initHttp();  
  277.     initImageLoader();  
  278.     initJpush();  
  279.     initMap();  
  280.     initCookieManager();  
  281.   }  
  282.    
  283.   public void onLowMemory()  
  284.   {  
  285.     AzkHelper.showLog("onLowMemory");  
  286.     super.onLowMemory();  
  287.   }  
  288.    
  289.   public void onTerminate()  
  290.   {  
  291.     instance = null;  
  292.     if (this.mBMapMan != null)  
  293.     {  
  294.       this.mBMapMan.destroy();  
  295.       this.mBMapMan = null;  
  296.     }  
  297.     super.onTerminate();  
  298.   }  
  299.    
  300.   public void removeUser()  
  301.   {  
  302.     Http.clearUser();  
  303.     AzkHelper.removePref(this, "username");  
  304.     AzkHelper.removePref(this, "password");  
  305.     AzkHelper.removePref(this, "nickname");  
  306.     this.username = "";  
  307.     this.password = "";  
  308.     this.nickname = "";  
  309.     AccessTokenKeeper.clear(getApplicationContext());  
  310.     removeCookie();  
  311.   }  
  312.    
  313.   public void removeUser2()  
  314.   {  
  315.     Http.clearUser();  
  316.     AzkHelper.removePref(this, "username");  
  317.     AzkHelper.removePref(this, "password");  
  318.     AzkHelper.removePref(this, "nickname");  
  319.     this.password = "";  
  320.     this.nickname = "";  
  321.     AccessTokenKeeper.clear(getApplicationContext());  
  322.     AccessTokenKeeperForQQ.clear(getApplicationContext());  
  323.     removeCookie();  
  324.   }  
  325.    
  326.   public void setNickname(String paramString)  
  327.   {  
  328.     AzkHelper.setStringPref(this, "nickname", paramString);  
  329.     this.nickname = paramString;  
  330.   }  
  331.    
  332.   public void setPassword(String paramString)  
  333.   {  
  334.     AzkHelper.setStringPref(this, "password", paramString);  
  335.     this.password = paramString;  
  336.   }  
  337.    
  338.   public void setUser(String paramString1, String paramString2)  
  339.   {  
  340.     setUserName(paramString1);  
  341.     setPassword(paramString2);  
  342.     Http.setUser(paramString1, paramString2);  
  343.   }  
  344.    
  345.   public void setUser(String paramString1, String paramString2, String paramString3)  
  346.   {  
  347.     setNickname(paramString3);  
  348.     setUser(paramString1, paramString2);  
  349.     setCookie(paramString1, paramString2);  
  350.   }  
  351.    
  352.   public void setUserName(String paramString)  
  353.   {  
  354.     AzkHelper.setStringPref(this, "username", paramString);  
  355.     this.username = paramString;  
  356.     setJpushAlias();  
  357.   }  
  358. }  
   这个app的实现相对来说还是比较复杂的,但是无非就是初始化一些信息。从import导包可以看到,使用了极光推送、百度地图以及universalimageloader,所以按照之前的分析经验之后一定会在onCreate()方法里面去初始化这些功能的。看一下onCreate()方法:
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void onCreate()  
  2. {  
  3.   AzkHelper.showLog("Application Aimeiwei onCreate");  
  4.   super.onCreate();  
  5.   instance = this;  
  6.   AzkHelper.prepareUserAgent(this);  
  7.   this.username = AzkHelper.getStringPref(this, "username");  
  8.   this.password = AzkHelper.getStringPref(this, "password");  
  9.   this.nickname = AzkHelper.getStringPref(this, "nickname");  
  10.   AzkHelper.showLog("BuildConfig.DEBUG: false");  
  11.   AzkHelper.closeLog();  
  12.   initHttp();  
  13.   initImageLoader();  
  14.   initJpush();  
  15.   initMap();  
  16.   initCookieManager();  
  17. }  
   很清晰明了,从方法名称也可以看出来,就是初始化各种功能。至于具体方法的实现,不多做介绍,感兴趣可以自己去研究。
  最后总结一下,上面例举了四个市场上的app程序的Application类的实现。从中可以发现,在Application类的实现类中,无非就是做一些初始化程序数据、检查运行环境、销毁数据等。
1、初始化程序数据:
  常用的初始化的手段有创建程序所需要的目录,设置开发平台的key,初始化地图信息,初始化http或者其他和网络有关的东西,初始化推送等等。

2、检查运行环境
  比如检查是否存在sd卡、判断网络连接状况、检查内存等等。

3、销毁数据
  就是在onTerminate()方法里面销毁之前使用到的一些东西。说到onTerminate()这个方法,在官方文档中是这样说的,
This method is for use in emulated process environments. It will never be called on a production Android device, where processes are removed by simply killing them; no user code (including this callback) is executed when doing so.
  它是在模拟环境下调用的,在真机中永远不会被调用。那为什么那么多app的Application类都用到这个方法呢?下面写一个demo测试一下,看结果如何。
  首先在真机测试,代码:
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import android.app.Application;  
  2.   
  3. public class APP extends Application{  
  4.   
  5.         @Override  
  6.         public void onCreate() {  
  7.                // TODO Auto-generated method stub  
  8.                super.onCreate();  
  9.               System. out.println("onCreate()" );  
  10.        }  
  11.   
  12.         @Override  
  13.         public void onLowMemory() {  
  14.                // TODO Auto-generated method stub  
  15.                super.onLowMemory();  
  16.               System. out.println("onCreate()" );  
  17.        }  
  18.   
  19.         @Override  
  20.         public void onTerminate() {  
  21.                // TODO Auto-generated method stub  
  22.                super.onTerminate();  
  23.               System. out.println("onCreate()" );  
  24.        }  
  25.   
  26.          
  27. }  
 结果:

  
  打开程序的时候调用了ocCreate()方法,这个没有问题,下面退出程序看看。我直接按返回家退出,发现并没有调用onTerminate()方法。接下来使用模拟器看看结果如何:
   运行程序,发现调用了 ocCreate()方法,
  
  退出程序看看,发现也没有调用。所以感觉onTerminate()这个方法还是不要使用为好,官方既然说了不会再真机中调用,那么应该不会有错。所以在很多app里面使用到了这个方法,有点不明觉厉,明白的朋友可以交流一下。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值