为什么要扩展Application类?

TN8*_*888 165 android android-application-class

为什么要扩展Application课程?

它对我有什么用?

为什么要这么做?

我读过它可以用来声明全局变量,是全部还是其他任何应用程序?

Dev*_*ath 121

介绍:

在此输入图像描述

  1. 如果我们apk在移动设备中考虑一个文件,它由多个有用的块组成,例如,Activitys,Services等.
  2. 这些组件不会定期相互通信,也不会忘记它们有自己的生命周期.这表明他们可能一次处于活动状态而另一时间处于非活动状态.

要求:

  1. 有时我们可能需要一个场景,我们需要访问变量及其整个状态,Application无论Activity用户使用什么,
  2. 一个例子是用户可能需要访问一个变量,该变量包含必须通过其访问的人员信息(例如名称) Application,
  3. 我们可以使用SQLite但是Cursor一次又一次地创建和关闭它并不会对性能有好处,
  4. 我们可以使用Intents来传递数据但是它很笨拙,并且在某种情况下活动本身可能不存在,具体取决于内存可用性.

应用类的使用:

  1. 访问变量Application,
  2. 您可以使用它Application来启动某些事情,例如分析等,因为应用程序类是在Activitys或 Servicess运行之前启动的,
  3. 有一个名为onConfigurationChanged()的重写方法,当应用程序配置发生变化时会触发(水平到垂直,反之亦然),
  4. 还有一个名为onLowMemory()的事件在Android设备内存不足时触发.


wts*_*g02 63

应用程序类是具有应用程序完整生命周期的对象.它是您作为应用程序的最高层.示例可能的用法:

  • 您可以通过在Application类中覆盖onCreate来添加启动应用程序时所需的内容.
  • 存储从Activity跳转到Activity的全局变量.像Asynctask一样.

    等等

  • @Austin为什么会有异味? (5认同)
  • 使用Application作为应用程序全局变量的转储场是一个很大的代码异味。您应该使用自己的自定义,更具体的类作为单例或使用静态变量来完成此任务。 (2认同)
  • 是啊,为什么要闻?如前所述,Application 类位于层次结构的顶部,我敢打赌,在它下面有一个自定义的单例类。因此,如果迫在眉睫,并且您的手机内存不足,我会说自定义单例是第一个被杀死的,而不是 Application 类(它本质上是您的整个应用程序)。 (2认同)

Int*_*iya 31

有时您希望存储数据,例如需要从多个活动访问的全局变量 - 有时在应用程序中的任何位置.在这种情况下,Application对象将帮助您.

例如,如果要获取每个http请求的基本身份验证数据,可以在应用程序对象中实现身份验证数据的方法.

在此之后,您可以在以下任何活动中获取用户名和密码:

MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();
Run Code Online (Sandbox Code Playgroud)

最后,请记住将Application对象用作单例对象:

 public class MyApplication extends Application {
    private static MyApplication singleton;

    public MyApplication getInstance(){
        return singleton;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
    }
}
Run Code Online (Sandbox Code Playgroud)

更多信息.请点击此链接

  • 请解释一下,为什么我们需要显式地创建 Application 类的单例对象,据我所知,它本身就是一个单例。我们可以制作多个应用程序对象,如果可以,那么如何制作?后果是什么?请解释一下。 (2认同)

Joe*_*lin 29

另外,我无法想象一个真正的场景,其中扩展应用程序要么优于另一种方法,要么是完成某些任务所必需的.如果您有一个昂贵的,经常使用的对象,则可以在检测到该对象当前不存在时在IntentService中初始化它.应用程序本身在UI线程上运行,而IntentService在其自己的线程上运行.

我更喜欢使用显式Intent将数据从Activity传递给Activity,或者使用SharedPreferences.还有一些方法可以使用接口将数据从Fragment传递到其父Activity.

  • 扩展应用程序类有很多用途.一个非常有用的是捕获应用程序中所有未捕获的异常.所以这是非常方便的东西 (36认同)
  • 为什么?准备Android在某些时候在不同的进程中运行它们或任何应用程序可以重用的任何组件,而这是有意限制的?只是传递数据对象而不是序列化它们可以节省CPU和内存.在同一设备上进行内部处理的分段内容在任何方面都不理想.我真的没有看到像这样的意图服务使用点(只是使用new执行其他线程).真的很多混淆编码器的东西来自几乎所有谷歌添加的"助手",好像活动在不同的计算机上运行. (8认同)
  • +1"for"喜欢使用显式Intent将数据从Activity传递给Activity,或者使用SharedPreferences".我们应该尽可能地消除全球状态,并使用标准的Android工具进行全局状态管理,而不是静态变量/单例等. (7认同)
  • 你是怎样做的 ? (3认同)

Jon*_*ock 8

Application类是一个单例,您可以从任何活动或您拥有Context对象的任何其他位置访问它.

你也有一点生命周期.

您可以使用Application的onCreate方法来实例化昂贵但经常使用的对象,例如分析助手.然后,您可以随处访问和使用这些对象.

  • "你也有一点生命周期." 你可能想改写它. (6认同)
  • 我的意思是你得到一些生命周期调用,但没有活动或片段那么多.例如,Application类没有onDestroy(). (2认同)

Sri*_*Roy 7

最好使用应用程序类.示例:假设您需要在启动完成后重新启动警报管理器.

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);
    }
Run Code Online (Sandbox Code Playgroud)


Dan*_*l F 5

不是答案而是观察:请记住,扩展应用程序对象中的数据不应与活动的实例相关联,因为您可能同时运行同一活动的两个实例(一个在前景和一个不可见)

例如,您通过启动器正常启动您的活动,然后“最小化”它。然后您启动另一个应用程序(即 Tasker),它启动您的活动的另一个实例,例如为了创建快捷方式,因为您的应用程序支持 android.intent.action.CREATE_SHORTCUT。如果随后创建了快捷方式并且该活动的快捷方式创建调用修改了应用程序对象的数据,则在后台运行的活动将在将其带回前台后开始使用该修改后的应用程序对象。


Sir*_*lot 5

我发现这个问题缺少答案。我之所以扩展,Application是因为我使用 Bill Pugh单例实现(请参阅参考资料),并且我的一些单例需要上下文。该类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;
    }
}
Run Code Online (Sandbox Code Playgroud)

单例看起来像这样:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,我不需要每次使用单例时都有上下文,并使用最少量的代码进行延迟同步初始化。

提示:更新 Android Studio 单例模板可以节省大量时间。


Per*_*rks 5

来源: https ://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class

\n\n
\n

在许多应用程序中,无需直接使用应用程序类。但是,自定义应用程序类有一些可接受的用途:

\n\n
    \n
  • 在创建第一个活动之前需要运行的专门任务
  • \n
  • 需要在所有组件之间共享的全局初始化(崩溃报告、持久性)
  • \n
  • 用于轻松访问静态不可变数据(例如共享网络客户端对象)的静态方法
  • \n
\n\n

您永远不应该将可变实例数据存储在 Application 对象内,因为如果您假设您的数据将保留在那里,那么您的应用程序将不可避免地在某个时刻崩溃并出现 NullPointerException。应用程序对象不能保证永远保留在内存中,它会被杀死。与普遍的看法相反,该应用程序不会从头开始重新启动。Android 将创建一个新的 Application 对象并在用户之前所在的位置启动 Activity,以给人一种应用程序从未被终止的错觉。

\n
\n