扩展的Application
类可以声明全局变量。还有其他原因吗?
扩展的Application
类可以声明全局变量。还有其他原因吗?
apk
文件,它由多个有用的块组成,如Activity
、Service
等。Application
中变量及其状态,而不管用户使用的是哪个Activity
,Application
中被访问,Cursor
并再次关闭它对性能不利,Intent
传递数据,但它很笨拙,并且活动本身可能在某些情况下不存在,这取决于内存可用性。Application
类的用途:Application
中的变量,Application
启动某些内容,如分析等,因为应用程序类在Activity
或Service
运行之前启动,Application类是您的应用程序的完整生命周期对象。它是作为应用程序的最高层级。可能使用示例:
您可以通过覆盖Application类中的onCreate,在应用程序启动时添加所需内容。
存储从Activity到Activity跳转的全局变量。例如AsyncTask。
等等
有时您想要存储数据,例如全局变量,需要从多个Activities访问 - 有时需要在应用程序中随处访问。在这种情况下,Application对象将帮助您。
例如,如果您想要为每个http请求获取基本身份验证数据,则可以在应用程序对象中实现身份验证数据的方法。
之后,您可以在任何一个Activity中像这样获取用户名和密码:
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 会比其他方法更可取或者必要来完成某些事情。如果你有一个昂贵且经常使用的对象,可以在 IntentService 中初始化它,当你发现该对象当前不存在时。Application 本身在 UI 线程上运行,而 IntentService 在其自己的线程上运行。
我喜欢使用显示 Intent 将数据从 Activity 传递到 Activity,或使用 SharedPreferences。也有通过接口将数据从 Fragment 传递到其父 Activity 的方法。
"prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences"
. 我们应尽可能消除全局状态,并使用标准的Android全局状态管理工具,而不是静态变量/单例等。 - user1744056Application类是一个单例类,可以从任何活动或其他拥有Context对象的地方访问它。
你还获得了一些生命周期。
你可以使用Application的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();
}
}
这不是一个答案,而是一条观察:请记住,扩展应用程序对象中的数据不应该与活动实例绑定在一起,因为有可能同时运行两个相同的活动实例(一个在前台,一个未被显示)。
例如,您通过启动器正常启动活动,然后“最小化”它。然后,您启动另一个应用程序(例如Tasker),它启动了您的活动的另一个实例,例如为了创建快捷方式,因为您的应用程序支持android.intent.action.CREATE_SHORTCUT。如果然后创建了快捷方式,并且此创建快捷方式调用了活动并修改了应用程序对象中的数据,则在将其带回前台时,后台运行的活动将开始使用此修改后的应用程序对象。
来源:https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class
在许多应用程序中,没有必要直接使用应用程序类。但是,以下是一些可以接受的自定义应用程序类的用途:
- 需要在创建第一个活动之前运行的专业任务
- 需要在所有组件之间共享的全局初始化(崩溃报告、持久化等)
- 用于轻松访问静态不可变数据(例如共享网络客户端对象)的静态方法
您永远不应该在应用程序对象中存储可变实例数据,因为如果您假定数据会留在那里,您的应用程序最终将由于空指针异常而崩溃。应用程序对象不能保证永远留在内存中,它可能被销毁。与普遍的观念相反,应用程序不会从头开始重新启动。Android 将创建一个新的应用程序对象并启动用户之前所在的活动,以给出在第一次时似乎应用程序从未被杀死的错觉。
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并采取必要措施。