为什么要扩展Application类?

问题描述 投票:152回答:13

为什么延长Application课程?

它对我有什么用?

为什么要这么做?

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

android android-application-class
13个回答
25
投票

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

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


1
投票

扩展应用程序的使用只会使您的应用程序确保您在整个应用程序运行期间所需的任何操作。现在它可能是任何类型的变量,并且如果你想从服务器获取一些数据,那么你可以将你的asynctask放在应用程序中,这样它每次都会连续获取,这样你就可以自动获得更新的数据..使用此链接了解更多......

http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android


0
投票

如果由Application扩展,则可以在不创建对象的情况下访问任何类的变量。它们可以被全局调用,并且它们的状态保持不变直到应用程序未被杀死。


0
投票

我认为您可以将Application类用于许多事情,但它们都与您在启动任何活动或服务之前执行某些操作的需要有关。例如,在我的应用程序中,我使用自定义字体。而不是打电话

Typeface.createFromAsset()

从每个Activity获取来自Assets文件夹的我的字体的引用(这很糟糕,因为它会导致内存泄漏,因为每次调用该方法时都会保留对资产的引用),我是从我的应用程序中的onCreate()方法执行此操作类:

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 BEFORE需要连接的活动和服务实际启动并采取必要的操作。


0
投票

要添加到其他答案中,表明您可能希望在应用程序范围中存储变量,对于任何长时间运行的线程或其他需要绑定到您未使用活动的应用程序的对象(应用程序不是活动)。例如无法请求绑定服务..然后首选绑定到应用程序实例。这种方法唯一明显的警告是,只要应用程序处于活动状态,对象就会存在,因此需要对内存进行更多的隐式控制,否则您将遇到与泄漏等内存相关的问题。

您可能会发现有用的其他内容是,按操作顺序,应用程序在任何活动之前首先启动。在此时间范围内,如果您愿意,您可以准备在第一次活动之前进行的任何必要的清洁工作。

2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created

112
投票

介绍:

enter image description here

  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设备内存不足时触发。

62
投票

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

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

30
投票

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

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

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

MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();

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

 public class MyApplication extends Application {
    private static MyApplication xxx;

    public MyApplication getInstance(){
        return singleton;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
    }
}

更多信息。请点击这个LINK


8
投票

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

你也有一点生命周期。

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


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);
    }

4
投票

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

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


3
投票

我看到这个问题没有答案。我扩展Application,因为我使用Bill Pugh Singleton实现(see reference),我的一些单身人士需要上下文。 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单例模板可节省大量时间。


3
投票

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

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

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

您永远不应该在Application对象中存储可变实例数据,因为如果您认为您的数据将保留在那里,那么您的应用程序将在某些时候因NullPointerException而不可避免地崩溃。应用程序对象不能保证永远留在内存中,它会被杀死。与流行的看法相反,该应用程序将不会从头开始重新启动。 Android将创建一个新的Application对象并启动用户之前的活动,以便首先假设应用程序从未被杀死。

© www.soinside.com 2019 - 2024. All rights reserved.