android中使用Application

在android开发过程中,我们可能存储一些全局的变量,最好在正在app的任何一个activity或者service中都可以访问到,这时我们可以使用application。

我们的一个应用就叫application,那么应该很好理解一个应用里面只会存在一个单例的application,也不难想到用这个在存储全局变量,那么到底是怎么存储呢?

首先,我们创建一个Application,继承android.app.Application:

<span style="font-size:18px;">package com.podongfeng.firstapplication.app;

import android.app.Application;

public class MyApplication extends Application {

	private Integer allViewInteger;

	public Integer getAllViewInteger() {
		return allViewInteger;
	}

	public void setAllViewInteger(Integer allViewInteger) {
		this.allViewInteger = allViewInteger;
	}

}
</span>

然后,在AndroidManifest.xml去声明这个Application,有点类似于声明Activity。

其实,在AndroidManifest.xml中肯定会存在一个系统声明的Application,类似于这样:

<span style="font-size:18px;"><application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".SplashActivity"
            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=".MainActivity"
            android:label="@string/app_name" >
        </activity>
    </application></span>

那么,怎么替换成为我们自己的application呢?

其实,只要在application标签中增加android:name属性指向我们自定义的application就可以了:

<span style="font-size:18px;"><application
        android:name="com.podongfeng.firstapplication.app.MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            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=".SecActivity"
            android:label="@string/app_name" >
        </activity>
    </application></span>

OK,这样的话,我们就可以在activity中使用getApplicationContext()来获取这个我们自定义的Application了。

等等,是不是局的这样还不是特别的方便,如果写了一些共用的java方法,为了代码的良好复用,没有放在activity里面呢?

通过一个参数把context传过去,然后再用context去获取Application?

这样做当然可以,不过,既然Application是单例的,我们很容联想到在单例的设计模式中使用getInstance方法来得到单例的对象。事实上,我们的MyApplication集成了Application,可以直接覆写onCreate方法,在Application被创建时把对象赋值给一个静态成员变量,这样,就可以任何地方通过MyApplication的静态方法去获取这个单例了:

<span style="font-size:18px;">package com.podongfeng.firstapplication.app;

import android.app.Application;

public class MyApplication extends Application {

	private static MyApplication myApplication = null;

	public static MyApplication getMyApplication() {
		return myApplication;
	}

	private Integer allViewInteger;

	public Integer getAllViewInteger() {
		return allViewInteger;
	}

	public void setAllViewInteger(Integer allViewInteger) {
		this.allViewInteger = allViewInteger;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		myApplication = this;
	}

}
</span>

OK,我们目前只在里面写了一个可用的全局变量allViewInteger,这仅仅用来说明问题就足够了,想存什么就存什么,获取起来也很方便,最后附上在2个activity中set和get的一个全局变量的样例:

<span style="font-size:18px;">package com.podongfeng.firstapplication;

import com.podongfeng.firstapplication.app.MyApplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

	private Button nextBtn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		MyApplication myApplication = MyApplication.getMyApplication();
		myApplication.setAllViewInteger(100);
		nextBtn = (Button) findViewById(R.id.btn_next);
		nextBtn.setOnClickListener(this);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setClass(getApplicationContext(), SecActivity.class);
		startActivity(intent);
	}
}
</span>
<span style="font-size:18px;">package com.podongfeng.firstapplication;

import com.podongfeng.firstapplication.app.MyApplication;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class SecActivity extends Activity {

	private TextView textView = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activiry_sec);
		textView = (TextView) findViewById(R.id.tv_sec);
		textView.setText(String.valueOf(MyApplication.getMyApplication().getAllViewInteger()));
	}

}
</span>
时间: 2024-08-11 09:41:24

android中使用Application的相关文章

Android开发中遇到的问题——Android中WARNING: Application does not specify an API level requirement!的解决方法

今天在手机上调试运行Andorid项目时,发现Console打印出"WARNING: Application does not specify an API level requirement!"这样的警告信息,如下图所示: 虽然不影响项目的正常运行,不过还是要找出原因,上网查了一下出现警告的原因,原来是创建项目时AndroidManifest.xml文件中没有指定Min SDK Version 解决办法:修改AndroidManifest.xml文件,在<manifest>

Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法

今天在手机上调试运行Andorid项目时,发现Console打印出"WARNING: Application does not specify an API level requirement!"这样的警告信息,如下图所示: 虽然不影响项目的正常运行,不过还是要找出原因,上网查了一下出现警告的原因,原来是创建项目时AndroidManifest.xml文件中没有指定Min SDK Version 解决办法:修改AndroidManifest.xml文件,在<manifest>

[Android Pro] Android中全局Application的onCreate多次调用问题

一般来说Application的onCreate方法只会执行一次, 如果应用中采用多进程方式,oncreate方法会执行多次,根据不同的进程名字进行不同的初始化, 就是在application中多添加几个if else String processName = OsUtils.getProcessName(this, android.os.Process.myPid()); if (processName != null) { boolean defaultProcess = processNa

Java设计模式之单例模式及在Android中的重要使用

之前在开发中老用到一些设计模式可是呢又不是很懂,于是狠下心来琢磨一番.下面是我琢磨后总结的,希望对您有用.如果发现了问题,请帮忙指正. 一.单例模式是什么? 单例模式最初的定义出现于<设计模式>:"保证一个类仅有一个实例,并提供一个访问它的全局访问点." Java中单例模式定义:"一个类有且仅有一个实例,并且自行实例化向整个系统提供该实例." 二.为什么用单例模式? 对于系统中的某些类来说,只有一个实例很重要.例如,一个系统中可以存在多个打印任务,但是只

Android中Application类用法

原文:http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.html Application类 Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息. Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(si

如何在android中利用Theme设置application 的所有listview的style?~

今天看VLC的源代码,发现一个很神奇的东西 所有listview的点击效果背景色都是橘黄色 花了点时间找了一下看看怎么实现的. 首先,定义一个<selector> like this: <selector> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="@color/

Android中 Application 使用说明

Application类 Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息. Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类. 通常我们是不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,那

Android中Application的应用

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

【转】Android中Application类用法

Application类 Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息. Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类. 通常我们是不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,那