Android——Application全局变量应用

本文介绍了一种在Android应用中利用Application类实现全局数据管理的方法,通过继承Application类并重写部分方法,实现在多个Activity间共享和维护统一的数据集。

      最近写的一个apk需要在多个activity之间操作使用同一数据,使用intent 以及broadcast都没有application来的方便!

Application类是一个基类,生命周期最长,我们可以继承这个类,重写一些需要用的方法,创建一些数据,那么在Application启动的时候,就会实例化你重写的这个类!

在这个应用程序中的所有activity都可以通过getApplication()获取实例,进行操作。

我重写的一个用来保存全局vector的application,可以在多个activity中对bookdata进行操作!

public class Mapplication extends Application
{
	private static final String TAG = "Mapplication";
	private Vector<Book>bookdata=new Vector<Book>();
	
	public void onCreate()
	{
		super.onCreate();
		bookdata.clear();
		/*data init*/
       Log.d(TAG, "application create");
	}
	
	public int getbookcount()
	{
		return bookdata.size();
	}
	
	public Vector <Book> getbookdata()
	{
		return bookdata;
	}
	
	public void setbookdata(Vector<Book> bookdata)
	{
		this.bookdata.clear();
		this.bookdata.addAll(bookdata);
	}
	public boolean addbook(Book book)
	{
		String addbookname=book.bookname;
		for(int i=0;i<bookdata.size();i++)
		{
			if(bookdata.get(i).bookname.equals(addbookname))
				return false;
		}
		bookdata.add(book);
		return true;
	}


在 AndroidManifest.xml中的Application中声明 

android:name=“Mapplication”

  <application
        android:name="Mapplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
       android:theme="@style/AppTheme"  >
        <activity 
            android:name="com.jscese.moonread.MoonMainActivity"
            android:label="@string/app_name"
            android:theme="@style/MoonTheme.NoTitleBar" >
            <intent-filter>   
                <action  android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER"  />                            
              </intent-filter>

       </activity>

尤为注意的一点:Mapplication.java必须要和主activity在同一个包里面!也就是你的应用程序的主包下!不然就报错:

ActivityThread.handleBindApplication(ActivityThread$AppBindData) line: 4400


在任何一个activity中都可以通过(Mapplication)getApplication()获取实例对象:

public void init()
	{
		mapplication=(Mapplication) getApplication();
		bookshelf=mapplication.getbookdata();
		if(mapplication.getbookcount()==0)
			withoutbook=true;
	}
@Override
protected void onCreate(Bundle savedInstanceState)
{
	super.onCreate(savedInstanceState);
	setContentView(R.layout.moonmain);
	init();
	findview();
	setlistener();
}

这样就可以在多个activity中对同一数据进行维护,也可以变相的实现通信。

如果想要进行其它的通信操作,比如更新UI什么的,可以通过Mapplication实例传递主线程activity的handler引用!在另外的activity中通过实例获取handler引用然后就可以handler.sendMessage(msg);

达到在主线程handler message 更新UI或者其它操作!这样还是比较方便的。







<think> 嗯,用户这次想了解Android应用中MyApplication的作用。根据提供的站内引用可以看出,用户参考的两篇文章都提到了Application类的重要性:引用[1]提到它是Android源码解析的实战项目,引用[2]则明确说明Application类提供全局状态管理等能力。 用户当前的问题非常聚焦,需要直接解释MyApplication的作用。考虑到用户可能是Android初学者,需要把技术概念讲得通俗易懂。从引用[2]可以看出,Application类核心功能集中在三个方面:全局状态管理、生命周期管理、组件间共享数据。这些就是需要重点展开的内容。 在整理回答时突然想到,用户可能混淆了Application类和自定义MyApplication类的区别。需要特别说明:MyApplication通常是开发者继承Application基类创建的自定义子类,用于扩展默认行为。这点在引用[1]的Demo项目名称里也能得到印证。 准备用比喻的方式解释:把Application类比作公司总部,各Activity是分公司。这样用户更容易理解全局上下文的概念。然后分四个层面说明作用:全局初始化(像公司统一采购物资)、共享数据(像公司公共资料室)、生命周期回调(像公司监控系统)、服务绑定(像公司统一外包服务)。 注意到用户引用的资料提到了性能优化,这点要补充在注意事项里。特别是避免在Application里执行耗时操作,以及正确注册自定义类的方法。最后考虑生成相关问题时要围绕扩展应用(如初始化第三方库)和常见误区(如内存泄漏)来设计。 对了,还要确认所有代码片段都符合系统级指令的要求——用$...$包裹行内变量如Context,独立代码块用三重引号标注。引用标记要自然地放在功能说明的末尾,像全局初始化那段最后的[^2]。 </think> 在Android应用中,`MyApplication`(通常是开发者自定义的`Application`子类)承担着**全局初始化、资源共享和生命周期管理**的核心作用。以下是其核心功能详解: --- ### 一、全局初始化入口 当应用启动时,系统首先创建`Application`实例(如`MyApplication`),此时会调用其`onCreate()`方法。开发者可在此进行**全局性初始化操作**: ```java public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // 初始化全局工具(如数据库、网络库、推送服务) initFirebase(); initImageLoader(); // 配置全局异常捕获 Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler()); } } ``` > ✅ **典型场景**:初始化第三方SDK(如地图、统计工具)、创建全局线程池、设置默认字体等[^2]。 --- ### 二、共享全局数据与状态 `Application`实例的**生命周期与整个应用进程相同**,因此可安全存储全局共享数据: ```java public class MyApplication extends Application { private User currentUser; // 共享用户数据 public User getCurrentUser() { return currentUser; } public void setCurrentUser(User user) { this.currentUser = user; } } // 在任意Activity中获取数据 User user = ((MyApplication) getApplicationContext()).getCurrentUser(); ``` > ⚠️ **注意**:避免存储大量数据以防内存溢出,复杂场景建议结合ViewModel或持久化存储[^2]。 --- ### 三、管理Activity生命周期 通过注册`ActivityLifecycleCallbacks`,实现对**所有Activity生命周期的全局监控**: ```java registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { Log.d("GlobalTracker", "Activity created: " + activity.getLocalClassName()); } // 其他生命周期回调... }); ``` > ✅ **应用场景**:统计页面停留时长、统一管理弹窗、检测内存泄漏(如监控未销毁Activity)[^1]。 --- ### 四、提供全局上下文(Context) `getApplicationContext()`返回的上下文**独立于UI组件**,避免持有Activity引用导致内存泄漏: ```java // 安全使用场景(如长生命周期对象) public class NetworkManager { private Context appContext; // 持有Application Context而非Activity Context public NetworkManager(Context context) { appContext = context.getApplicationContext(); } } ``` --- ### 配置方式(AndroidManifest.xml) 需在清单文件中声明自定义类: ```xml <application android:name=".MyApplication" <!-- 关键声明 --> android:icon="@mipmap/ic_launcher" ... > </application> ``` --- ### ⚠️ 注意事项 1. **避免耗时操作**:`onCreate()`中的初始化应尽量快速,否则拖慢应用启动 2. **防止内存泄漏**:静态持有`Application`中的对象需谨慎 3. **替代方案**:轻量级需求可使用依赖注入(如Hilt)或单例模式 --- ### 类比理解 > 将`MyApplication`视为**公司的总部大楼**: > - `onCreate()` = 大楼建造时的基础装修(通电、通网) > - 全局变量 = 大楼中的公共会议室(所有部门共享) > - 生命周期回调 = 大楼的智能监控系统(感知每个房间的使用状态)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值