为什么扩展应用程序类?
为什么扩展Application
类?
这对我来说是什么?
为什么要这么做?
我读过它可以用于全局variables,这就是其他的应用程序?
无论如何,我想不出一个真正的场景,其中扩展应用程序要么是另一种方法,要么是为了完成某些事情而必须的。 如果您有一个昂贵且经常使用的对象,则可以在检测到该对象当前不存在时将其初始化为IntentService。 应用程序本身在UI线程上运行,而IntentService在自己的线程上运行。
我更喜欢使用显式的意图将数据从Activity传递到Activity,或者使用SharedPreferences。 还有一些方法可以使用接口将数据从Fragment传递到其父Activity。
介绍:
- 如果我们在手机中考虑一个
apk
文件,它由多个有用的块组成,比如Activity
,Service
和其他。 - 这些组件不会经常与对方通信,也不会忘记它们有自己的生命周期。 这表明它们可能一次是活跃的,而另一时刻则是活跃的。
要求:
- 有时我们可能需要一个场景,我们需要访问整个
Application
的variables及其状态,而不pipe用户正在使用的Activity
, - 一个例子是用户可能需要访问一个variables来保存他的个人信息(例如名字),这个variables必须通过
Application
被访问, - 我们可以使用SQLite,但创build一个
Cursor
并closures它一次又一次是不好的性能, - 我们可以使用
Intent
来传递数据,但是很笨拙,根据内存可用性的不同,活动本身可能并不存在。
应用程序类的使用:
- 通过
Application
访问variables, - 您可以使用
Application
启动某些东西,如分析等,因为应用程序类是在Activity
或Services
运行之前启动的, - 有一个名为onConfigurationChanged()的重写方法,当应用程序configuration被改变时(水平到垂直,反之亦然),触发这个方法。
- 还有一个事件叫onLowMemory(),当Android设备的内存不足时触发。
应用程序类是具有应用程序整个生命周期的对象。 这是您的最高层作为应用程序。 示例可能的用法:
- 您可以通过在应用程序类中重写onCreate来添加应用程序启动时所需的内容。
-
存储从“活动”跳转到“活动”的全局variables。 像Asynctask一样。
等等
有时候你想存储数据,比如需要从多个活动中访问的全局variables – 有时在应用程序中的任何地方。 在这种情况下,Application对象将帮助你。
例如,如果要获取每个http请求的基本身份validation数据,则可以在应用程序对象中实现身份validation数据的方法。
在这之后,你可以在任何这样的活动中获得用户名和密码:
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; } }
更多信息。 请点击这个链接
Application类是一个单例,你可以从任何活动或其他地方访问Context对象。
您还可以获得一点生命周期。
您可以使用应用程序的onCreate方法实例化昂贵但经常使用的对象,如分析帮助程序。 那么你可以访问和使用这些对象。
最好使用应用程序类。 例如:假设您需要在引导完成后重启您的闹钟pipe理器。
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); }
不是一个答案,而是一个观察 :请记住,扩展应用程序对象中的数据不应该绑定到一个活动的实例,因为可能有两个相同活动的实例同时运行(一个在前景和一个不可见) 。
例如,您通常通过启动器启动您的活动,然后“最小化”它。 然后启动另一个应用程序(即Tasker),启动另一个活动的实例,例如为了创build一个快捷方式,因为你的应用程序支持android.intent.action.CREATE_SHORTCUT。 如果创build了快捷方式,并且此快捷方式创build的活动调用修改了应用程序对象的数据,则在后台运行的活动一旦被带回到前台,就会开始使用这个已修改的应用程序对象。
扩展应用程序的使用只是让您的应用程序确保您在整个应用程序运行期间进行的任何types的操作。 现在它可能是任何types的variables,并假设如果你想从服务器获取一些数据,那么你可以把你的asynctask在应用程序中,这样它会每次连续获取,以便您将自动获得更新的数据。使用此链接更多的知识….
http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android
我看到这个问题没有答案。 我扩展了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(); } }
这样我就不需要每次使用单例时都有一个上下文,并用最less量的代码获得惰性同步初始化。
提示:更新Android Studio单身模板可以节省大量时间。
您可以访问任何类的variables,而无需创build对象(如果它由Application扩展)。 他们可以在全球范围内被调用,他们的状态一直维持到应用程序不被杀害。
首先创build一个扩展Android的android.app.Application的类。 Android在应用程序启动时创build这个类的一个实例,也就是当一个DVM进程开始运行你的apk。 作为应用程序如何工作的一个例子,让我们假设我们正在构build某种types的游戏。 我们的游戏应用程序将有几个屏幕 – 在这种情况下,每个屏幕都是一个活动。 游戏的玩家在每个屏幕上生成点数,并且他们的分数需要在我们的假想游戏的多个屏幕上被跟踪。 为了在构成游戏的许多活动中跟踪用户的游戏得分,我们需要一个场所来存储游戏持续时间内的游戏得分 – 即只要应用程序正在运行。
我认为你可以使用Application类来做很多事情,但是在开始任何活动或者服务之前,它们都与你需要做的一些事情有关。 例如,在我的应用程序中,我使用自定义字体。 而不是打电话
Typeface.createFromAsset()
从每个活动获取我的字体从资产文件夹的引用(这是不好的,因为它会导致内存泄漏,因为你每次调用该方法时保持对资产的引用),我从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类的另一个用途是检查设备是否连接到互联网之前,需要连接的活动和服务实际启动并采取必要的行动。