Answers:
暂时,我想不出一个真正的场景,在该场景中,扩展Application要么比另一种方法更可取,要么需要完成某件事。如果您有一个昂贵且经常使用的对象,则可以在检测到该对象当前不存在时在IntentService中对其进行初始化。应用程序本身在UI线程上运行,而IntentService在其自己的线程上运行。
我更喜欢使用明确的Intent将数据从Activity传递到Activity,或使用SharedPreferences。还有一些方法可以使用接口将数据从片段传递到其父活动。
"prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences"
。我们应该永远消除全球状态,尽我们所能,并使用标准的Android工具,在全球国家管理的,而不是静态瓦尔/单身等
apk
在移动设备中考虑文件,则该文件包含多个有用的块,例如Activity
,,Service
s和其他。Application
无论Activity
用户使用什么,都需要访问整个变量及其状态。Application
,,Cursor
并关闭它的性能不好,Intent
s传递数据,但它的笨拙和活动本身在某些情况下可能不存在,具体取决于内存的可用性。Application
,Application
来启动诸如分析之类的某些操作。由于应用程序类是在运行Activity
或
之前Services
运行的,应用程序类是具有应用程序完整生命周期的对象。它是您作为应用程序的最高层。示例可能的用法:
您可以通过覆盖Application类中的onCreate来添加启动应用程序时所需的内容。
存储从活动跳转到活动的全局变量。像Asynctask。
等等
有时您想要存储数据,例如需要从多个“活动”中访问的全局变量(有时在应用程序中的任何地方)。在这种情况下,Application对象将为您提供帮助。
例如,如果要获取每个http请求的基本身份验证数据,则可以在应用程序对象中实现身份验证数据的方法。
之后,您可以在以下任何活动中获取用户名和密码:
MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();
最后,请记住将Application对象用作单例对象:
public class MyApplication extends Application {
private static MyApplication singleton;
public MyApplication getInstance(){
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
}
有关更多信息,请单击应用程序类
Application类是一个单例,您可以从任何活动或具有Context对象的任何其他位置访问。
您还将获得一些生命周期。
您可以使用应用程序的onCreate方法实例化昂贵但频繁使用的对象,例如分析助手。然后,您可以在任何地方访问和使用这些对象。
最好使用应用程序类。示例:假设您需要在启动完成后重新启动警报管理器。
public class BaseJuiceApplication extends Application implements BootListener {
public static BaseJuiceApplication instance = null;
public static Context getInstance() {
if (null == instance) {
instance = new BaseJuiceApplication();
}
return instance;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onBootCompleted(Context context, Intent intent) {
new PushService().scheduleService(getInstance());
//startToNotify(context);
}
我看到这个问题缺少答案。我扩展Application
是因为我使用Bill Pugh Singleton实现(请参阅参考资料),并且我的某些单例需要上下文。本Application
类如下所示:
public class MyApplication extends Application {
private static final String TAG = MyApplication.class.getSimpleName();
private static MyApplication sInstance;
@Contract(pure = true)
@Nullable
public static Context getAppContext() {
return sInstance;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() called");
sInstance = this;
}
}
单例看起来像这样:
public class DataManager {
private static final String TAG = DataManager.class.getSimpleName();
@Contract(pure = true)
public static DataManager getInstance() {
return InstanceHolder.INSTANCE;
}
private DataManager() {
doStuffRequiringContext(MyApplication.getAppContext());
}
private static final class InstanceHolder {
@SuppressLint("StaticFieldLeak")
private static final DataManager INSTANCE = new DataManager();
}
}
这样,我不需要每次使用单例时都具有上下文,并且可以用最少的代码来进行惰性同步初始化。
提示:更新Android Studio单例模板可以节省大量时间。
我认为您可以将Application类用于很多事情,但是它们都与您在启动任何Activity或Services之前需要做一些事情有关。例如,在我的应用程序中,我使用自定义字体。而不是打电话
Typeface.createFromAsset()
从每个活动中从Assets文件夹中获取我的字体的引用(这很糟糕,因为每次调用该方法时都保留对资产的引用,这会导致内存泄漏),我从onCreate()
Application类中的方法执行此操作:
private App appInstance;
Typeface quickSandRegular;
...
public void onCreate() {
super.onCreate();
appInstance = this;
quicksandRegular = Typeface.createFromAsset(getApplicationContext().getAssets(),
"fonts/Quicksand-Regular.otf");
...
}
现在,我还有一个定义如下的方法:
public static App getAppInstance() {
return appInstance;
}
还有这个:
public Typeface getQuickSandRegular() {
return quicksandRegular;
}
因此,在我的应用程序中的任何地方,我要做的就是:
App.getAppInstance().getQuickSandRegular()
对我来说,Application类的另一种用法是在需要启动连接的活动和服务之前,先检查设备是否已连接到Internet,然后再采取实际行动。
来源:https : //github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class
在许多应用程序中,无需直接使用应用程序类。但是,自定义应用程序类有一些可接受的用法:
- 创建第一个活动之前需要运行的专门任务
- 需要在所有组件之间共享的全局初始化(崩溃报告,持久性)
- 静态方法可轻松访问静态不可变数据,例如共享的网络客户端对象
永远不要将可变实例数据存储在Application对象内部,因为如果您假设数据将保留在其中,则应用程序不可避免地会在某个时刻崩溃,并出现NullPointerException。无法保证应用程序对象永远保留在内存中,它将被杀死。与普遍的看法相反,该应用不会从头开始重启。Android将创建一个新的Application对象,并在用户之前所在的位置开始活动,以使人们产生一种幻想,即该应用程序从未被杀死。
扩展应用程序的使用仅会使您的应用程序在整个应用程序运行期间确保进行任何所需的操作。现在它可以是任何类型的变量,并且假设您要从服务器获取一些数据,则可以将asynctask放入应用程序中,以便每次连续获取,从而可以自动获取更新的数据。.使用此链接了解更多...
http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android
要添加其他说明,您可能希望将变量存储在应用程序范围内,用于任何长时间运行的线程或其他需要绑定到不使用活动(应用程序不是活动)的应用程序的对象。例如无法请求绑定的服务。则首选绑定到应用程序实例。这种方法唯一明显的警告是,对象在应用程序运行期间一直存在,因此需要对内存进行更多的隐式控制,否则您将遇到与内存相关的问题,例如泄漏。
您可能会发现有用的其他事情是,按照操作顺序,应用程序首先在任何活动之前启动。在此时间范围内,您可以根据需要准备在第一次活动之前进行的所有必要的客房清洁。
2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created