Android的Application对象讲解

本文深入探讨了Android应用中Application组件的作用、使用场景及优化策略,包括大数据传输、网络数据缓存、内存管理、共享数据的生命周期等关键点。详细介绍了如何在Application中使用HashMap进行数据共享,以及如何避免内存泄漏等问题。同时,通过实例展示了如何实现共享数据的获取和管理,并在AndroidManifest.xml中配置Application。最后,提供了完整的Java代码示例,包括Application类的定义、数据共享方法、Activity生命周期与Application交互的实现,以及如何在AndroidManifest.xml中声明Application。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android的Application同Activity和Service一样都是Android框架的组成部分。这个Application通常在app启动的时候就会自动创建。Application在app中是一个单例模式,而且Application也是整个app生命周期最长的对象。所有的Activity和Service都是共用着一个Application,所以Application通常用来共享数据,数据传递和数据缓存。

  网上查阅过一些资料,给Application的使用作了一些补充:

  1.当两个Activity要传输大数据的时候,应尽量避免使用Intent传输,而是在Application里面建立HashMap,然后发送方Activity把数据放到Application的HashMap里面,然后把数据的索引通过Intent传输到接收方Activity。接收方Activity就可以从Application里面获取到发送方的传递的数据。

  2.当从网络上下载的数据,可以将它暂时放到Application的HashMap里面,当app再次请求数据的时候如果发现Application里面已经有数据了,就不用再次从网上下载。

  3.app的内存是有限制的,所以如果缓存的数据太多,应该要将缓存数据写入到本地的rom或者是sdcard上。、

  4.Application是静态的,因此有一些对象和数据最后不要放到Application的引用。Application的生命周期很长,假如说,如果Application有某一个Activity的控件引用时,则当Activity想要finish的时候,内存会释放不了,造成内存泄漏。


  在做Java SE开发的时候,如果想要多个类共享某一个类,则将该类设置成静态公有对象即可。在Android开发中,个人认为要遵循Android的开发规范,应该将共享的数据放到自己写的Application去。其他类可以通过获取app的Application来获取共享数据。如果要写自己的Application类,需要继承Application类。

[java]  view plain copy
  1. public class MyApplication extends Application {  
  2.     
        /**
         * 存放所有的activity
         */

        private static List<Activity> runActivities = new ArrayList<Activity>();
       
  3.         //需要共享的数据  
  4.         private int shareData;  
  5.           
  6.          /**
              * 重写onCreate 方法  对初始化 MGRApplication
              */ 
  7.         public void onCreate() {  
  8.             shareData = 100;  
  9.             super.onCreate();  
  10.         }  
  11.    /**
         * 重写onLowMemory ,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)
         * 都被杀死时,系统会调用OnLowMemory
         */
     
      public void onLowMemory()
        {
            super.onLowMemory();
            System.gc(); //进行垃圾回收
            LOGGER.debug("低内存警告  onLowMemory...");
            LOGGER.debug("整个程序的内存总数 :" + Runtime.getRuntime().totalMemory() + "\n"
                    + "可用内存总数 : " + Runtime.getRuntime().freeMemory() + "\n"
                    + "最大内存量 : " + Runtime.getRuntime().maxMemory() + "\n"
                    + "-------------------------------------");
        }
  12.    public static void addActivity(Activity activity)
  13.     {
            runActivities.add(activity);
        }
        
        public static void removeActivity(Activity activity)
        {
            runActivities.remove(activity);
        }
        
    
    
  14.     public static void clearAllActivitys()
        {
            List<Activity> removeActivity = new ArrayList<Activity>();
            for (int i = 0; i < runActivities.size(); i++)
            {
                Activity a = runActivities.get(i);
                LOGGER.debug("释放的activity+" + a);
                if (a != null)
                {
                    a.finish();
                }
                removeActivity.add(a);
            }
            runActivities.removeAll(removeActivity);
        }
  15.   
  16.         //获取共享的数据  
  17.         public int getShareData() {  
  18.             return shareData;  
  19.         }  
  20.     }  

  当某个Activity需要访问共享数据的时候就可以通过getApplicationContext()方法获取到app的Application,并强制类型转换成MyApplicaiton对象,即可获取共享数据。

[java]  view plain copy
  1. public class MyActivity extends Activity {  
  2.         private MyApplication application;  
  3.   
  4.         @Override  
  5.         public void onCreate(Bundle savedInstanceState) {  
  6.                 super.onCreate(savedInstanceState);  
  7.                 application = (MyApplication) this.getApplicationContext();  
  8.             System.out.println("共享数据为" + application.getShareData());  
  9.                 setContentView(R.layout.main); //加载XML文件  
  10.                MyApplication.addActivity(this);
  11.                 System.gc();//内存回收
  12.         }  
  13.         
          /**
           * 销毁activity
           */

    protected void onDestroy() {
    super.onDestroy();
    MGRApplication.removeActivity(this);
            System.gc();//调用回收
    }
  14. }  



  完成之后,还需在AndroidManifest.xml文件作一些修改,告诉我们的app,我们的Application用MyApplication啦。

[java]  view plain copy
  1. <application  
  2.         android:name="com.shamoo.testapplication.MyApplication"  
  3.         android:label="@string/app_name"  
  4.         android:icon="@drawable/icon" >  
  5.         <activity  
  6.             android:name=".MyActivity" >  
  7.             <intent-filter>  
  8.                 <action android:name="android.intent.action.MAIN" />  
  9.   
  10.                 <category android:name="android.intent.category.LAUNCHER" />  
  11.             </intent-filter>  
  12.         </activity>  
  13. </application>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值