zoukankan      html  css  js  c++  java
  • 继承Application以实现全局资源共享

    原文地址:http://www.cnblogs.com/Dentist/p/Mr_Dentist_.html

    每个程序运行时会创建一个Application类的对象且仅有一个。在app结束时这个Application才会消失。所以可以利用Application来进行一些数据的处理和储存。在多个activity或fragment之间交换数据比如一个app的设置,主题,用户信息等等。用它来实现全局变量比static更便于数据的集中管理。

    例如:

    public class MyApp extends Application {
        private Person person;
        private String corpsname;
        private List<Person> corpsmember;
        
        public void setPerson(Person person){
            this.person=person;
        }
        public Person getPerson(){
            return person;
        }
        public void setCorps(String corps){
            this.corpsname=corps;
        }
        public String getCorps(){
            return corpsname;
        }
        public List<Person> getcorpsmember(){
            return corpsmember;
        }
        public void setcorpsmember(List<Person> corpsmember){
            this.corpsmember=corpsmember;
        }
    }

    自建一个类继承Application类。然后在AndroidManifest.xml文件中修改android:name属性为 所在包名+类名

        <application
            android:name="com.example.MyApp.MyApp"
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >

    然后就可以在各个地方与MyApp交换数据了

            MyApp mapp=(MyApp)getApplication();
            String corps=mapp.getCorps();   

    平时的使用一般在一个Activity一开始就获取Application。供整个Activity使用。很方便。

        public MyApp mapp;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.person);
            mapp=(MyApp)getApplication();
            
        }

    在其他类里,比如adapter里要获取Application就要用下面的

    MyApp myapp=(MyApp)context.getApplicationContext();

    但注意最好不要将持有对Activity引用的对象传进来。这样这个activity结束后也不会被GC回收,造成内存泄漏。

    对于Application类的用途很广。下面的例子就展示了当activity较多时,对activity管理的方便。

    public class MreApplication extends Application {
        public static final String TAG="Mre";
    
        /**保存每个activity的状态的存储信息,用于activity新建或返回时自动还原为上次访问时的状态,KEY为各个activity类名**/
        private HashMap<String, HashMap<String, Object>> activityState;
    
        /**记录activity的栈,保存的是activity类名**/
        private Stack<String> activityStack;
    
        public HashMap<String, HashMap<String, Object>> getActivityState() {
            return activityState;
        }
    
        public void setActivityState(HashMap<String, HashMap<String, Object>> activityState) {
            this.activityState = activityState;
        }
    
        public Stack<String> getActivityStack() {
            return activityStack;
        }
    
        public void setActivityStack(Stack<String> activityStack) {
            this.activityStack = activityStack;
        }
    
        /**
         * 删除栈中最后一个activity
         */
        public void popActivity() {
            String activity = activityStack.lastElement();
            if (activity != null) {
                activityStack.remove(activity);
                activity = null;
            }
        }
    
        /**
         * 删除栈中指定activity
         */
        public void popActivity(String activity) {
            if (activity != null) {
                activityStack.remove(activity);
                activity = null;
            }
        }
    
        /**
         * 取当前activity
         */
        public String currentActivity() {
            if (activityStack == null) {
                return null;
            }
            String activity = activityStack.lastElement();
            return activity;
        }
    
        /**
         * 加入activity
         */
        public void pushActivity(String activity) {
            if (activityStack == null) {
                activityStack = new Stack<String>();
            }
            activityStack.add(activity);
        }
    }
  • 相关阅读:
    Android 音频播放——AudioTrack直接播PCM、MediaPlayer播媒体文件可以是audio
    Android 音频采集——MediaRecord(编码后录影文件) 、AudioRecord(PCM原始数据)
    .Net 下利用ICSharpCode.SharpZipLib.dll实现文件压缩、解压缩
    调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "C:Program Files (x86)HeliconISAP
    SQL1117N 因为处于 ROLL-FORWARD PENDING
    asp.net配置IIS过程错误解决
    IIS发布一些问题
    为具有端口 "50000" 的服务名称 "db2c_DB2" 而更新系统上的服务文件时出错
    IIS Server Application Unavailable
    db2堆中没有足够的存储器可用来处理语句的解决
  • 原文地址:https://www.cnblogs.com/Jude95/p/Mr_Dentist_.html
Copyright © 2011-2022 走看看