Android中Application类用法

来源:互联网 发布:卫生防疫厨房监控软件 编辑:程序博客网 时间:2024/05/19 16:19

Application类


Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息。


Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。


通常我们是不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,那也很简单!创建一个类继承Application并在AndroidManifest.xml文件中的application标签中进行注册(只需要给application标签增加name属性,并添加自己的 Application的名字即可)。


启动Application时,系统会创建一个PID,即进程ID,所有的Activity都会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。


Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以可以通过Application来进行一些,如:数据传递、数据共享和数据缓存等操作。


应用场景:


在Android中,可以通过继承Application类来实现应用程序级的全局变量,这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉。



实现步骤:


1、继承Application


public class CustomApplication extends Application
{
    private static final String VALUE = "Harvey";
    
    private String value;
    
    @Override
    public void onCreate()
    {
        super.onCreate();
        setValue(VALUE); // 初始化全局变量
    }
    
    public void setValue(String value)
    {
        this.value = value;
    }
    
    public String getValue()
    {
        return value;
    }
}
注:继承Application类,主要重写里面的onCreate()方法(android.app.Application包的onCreate()才是真正的Android程序的入口点),就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。


2、在ApplicationManifest.xml文件中配置自定义的Application

<application
        android:name="CustomApplication">
</application>
实例代码:

CustomApplication.java


/**
 * 继承Application
 * 
 * @author admin
 * 
 */
public class CustomApplication extends Application
{
    private static final String VALUE = "Harvey";
    
    private String value;
    
    @Override
    public void onCreate()
    {
        super.onCreate();
        setValue(VALUE); // 初始化全局变量
    }
    
    public void setValue(String value)
    {
        this.value = value;
    }
    
    public String getValue()
    {
        return value;
    }
}

FirstActivity.java


public class FirstActivity extends Activity
{
    private CustomApplication app;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        app = (CustomApplication) getApplication(); // 获得CustomApplication对象
        
        Log.i("FirstActivity", "初始值=====" + app.getValue()); // 获取进程中的全局变量值,看是否是初始化值
        
        app.setValue("Harvey Ren"); // 重新设置值
        
        Log.i("FirstActivity", "修改后=====" + app.getValue()); // 再次获取进程中的全局变量值,看是否被修改
        
        Intent intent = new Intent();
        intent.setClass(this, SecondActivity.class);
        startActivity(intent);
    }
}

注:只需要调用Context的 getApplicationContext或者Activity的getApplication方法来获得一个Application对象,然后再得到相应的成员变量即可。它是代表我们的应用程序的类,使用它可以获得当前应用的主题和资源文件中的内容等,这个类更灵活的一个特性就是可以被我们继承,来添加我们自己的全局属性。


SecondActivity.java


public class SecondActivity extends Activity
{
    private CustomApplication app;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        app = (CustomApplication) getApplication(); // 获取应用程序


       Log.i("SecondActivity", "当前值=====" + app.getValue()); // 获取全局值
    }
}



AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.test"
    android:versionCode="1"
    android:versionName="1.0">
    <uses-sdk
        android:minSdkVersion="8" />


    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:name="CustomApplication">
        <!-- 将我们以前一直用的默认Application设置成自定义的CustomApplication -->
        <activity
            android:name=".FirstActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />
                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <activity
            android:name=".SecondActivity"
            android:label="@string/app_name">
        </activity>
    </application>

</manifest>


当然也可以不用在xml中声明,而是自己单独建立一个Myappliction用来全局存储数据和更新数据

public class MyApplication extends Application {   private static MyApplication mApplication;   private Account account;   public List<Theme> themeList;   public List<Friend> friendList;   private List<FriendEvent> friendEventList;   private ThemeDB themeDB;   private ElementDB elementDB;   private FriendDB friendDB;   private FriendEventDB friendEventDB;   private AccountDB accountDB;   private List<Element> tmpElementList; //选择元素组成的临时元素数组,用来游戏或制作分享   private List<ServerDataInfo> serverDataList_latest;   private List<ServerDataInfo> serverDataList_downloadCount;   private SoundPool soundPool;   private Map<String, Integer> soundId;   public static final int EVENT_TYPE_SCORE = 1;   public static final int EVENT_TYPE_ELEMENT = 2;   public List<Element> getTmpElementList() {      return tmpElementList;   }   public void setTmpElementList(List<Element> elementList) {      if (this.tmpElementList == null)         this.tmpElementList = new ArrayList<Element>();      this.tmpElementList.clear();      this.tmpElementList.addAll(elementList);   }   //获取application对象   public static MyApplication getInstance() {      if (mApplication == null) {         mApplication = new MyApplication();         return mApplication;      }      return mApplication;   }   @Override   public void onCreate() {      super.onCreate();   }   public void init(Context context) {      soundPool = new SoundPool(1000, AudioManager.STREAM_MUSIC, 0);      soundId = new HashMap<String, Integer>();      PhoneInfo.getPhoneInfo(context);      //    CrashHandler.getInstance().init(context);      HeyYouDBHelper.PATH = Environment.getExternalStorageDirectory().getAbsolutePath();      HeyYouDBHelper.FILE_PATH = HeyYouDBHelper.PATH + "/Heyyou";      themeList = new ArrayList<Theme>();      friendList = new ArrayList<Friend>();      friendEventList = new ArrayList<FriendEvent>();      //runnable初始化执行主要是将数据库的东西set进来      MyApplicationInit applicationInit = new MyApplicationInit(context);      new Thread(applicationInit).start();   }   public void setThemeDB(ThemeDB themeDB) {      this.themeDB = themeDB;   }   public void setElementDB(ElementDB elementDB) {      this.elementDB = elementDB;   }   public void setFriendDB(FriendDB friendDB) {      this.friendDB = friendDB;   }   public void setFriendEventDB(FriendEventDB friendEventDB) {      this.friendEventDB = friendEventDB;   }   public void setAccountDB(AccountDB accountDB) {      this.accountDB = accountDB;   }   public Account getAccount() {      return account;   }   public void setAccount(Account account) {      this.account = account;   }   public ThemeDB getThemeDB() {      return themeDB;   }   public ElementDB getElementDB() {      return elementDB;   }   public FriendDB getFriendDB() {      return friendDB;   }   public FriendEventDB getFriendEventDB() {      return friendEventDB;   }   public AccountDB getAccountDB() {      return accountDB;   }   public List<ServerDataInfo> getServerDataList_downloadCount() {      return serverDataList_downloadCount;   }   public void setServerDataList_downloadCount(List<ServerDataInfo> serverDataList_downloadCount) {      if (this.serverDataList_downloadCount == null)         this.serverDataList_downloadCount = new ArrayList<ServerDataInfo>();      else         this.serverDataList_downloadCount.clear();      this.serverDataList_downloadCount.addAll(serverDataList_downloadCount);   }   public List<ServerDataInfo> getServerDataList_latest() {      return serverDataList_latest;   }   public void setServerDataList_latest(List<ServerDataInfo> serverDataList_latest) {      if (this.serverDataList_latest == null)         this.serverDataList_latest = new ArrayList<ServerDataInfo>();      else         this.serverDataList_latest.clear();      this.serverDataList_latest.addAll(serverDataList_latest);   }   public void setFriendsEventsList(List<FriendEvent> list) {      if (this.friendEventList == null)         friendEventList = new ArrayList<FriendEvent>();      else         friendEventList.clear();      friendEventList.addAll(list);   }   public List<FriendEvent> getFriendsEventsList() {      return this.friendEventList;   }}
这个就没有在xnl里面声明,每次用的时候
MyApplication.getInstance().init(Title.this);就好了,
生成以后自己再用里面的变量就可以直接用
MyApplication.getInstance().themeList;来取出来了,
这个application还是自己默认的appliction,myappliction感觉是一个类存储信息的,
不知道我理解的对不对,望大牛发现问题,留言可以

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 浅色衣服被染色怎么办 工作调动不想去怎么办 被调到不好岗位怎么办 考试失败很难过怎么办 貔貅摔了一点点怎么办 电脑资源管理器停止工作怎么办 红警3锁集显怎么办 猛犸象牙吊坠裂了怎么办? 特别压抑的时候怎么办 孕妇吃腊肉了怎么办 怀孕吃了午餐肉怎么办 剩米饭太硬怎么办? 月经推迟量少怎么办 怎么办早餐吃了1000 乐扣盒子打不开怎么办 不锈钢饭盒盖子打不开怎么办 电压力锅打不开盖子怎么办 保温饭盒打不开了怎么办 玻璃饭盒加热后打不开怎么办 玻璃饭盒盖子盖不紧怎么办 狗狗耳朵臭怎么办 白色洗手池发黄怎么办 热水壶木塞有味怎么办 过滤水壶效果不好怎么办 喝咖啡睡不着觉怎么办 食品流通许可证过期怎么办 水产养殖水体发白怎么办 生存战争找不到食物怎么办 执法记录仪肩扣怎么办 极米h1s死机了怎么办 受到伪基站骚扰怎么办 车载蓝牙没声音怎么办 工程现场更改方案怎么办 qq没有语音输入怎么办 执法记录仪丢了怎么办 vivox20无ip分配怎么办 x20无ip分配怎么办 手机ipv4不可用怎么办 ip地址不可用怎么办 lp地址配置错误怎么办 手机ip配置失败怎么办