TN8*_*888 165 android android-application-class
为什么要扩展Application课程?
它对我有什么用?
为什么要这么做?
我读过它可以用来声明全局变量,是全部还是其他任何应用程序?
Dev*_*ath 121
apk在移动设备中考虑一个文件,它由多个有用的块组成,例如,Activitys,Services等.Application无论Activity用户使用什么,Application,Cursor一次又一次地创建和关闭它并不会对性能有好处,Intents来传递数据但是它很笨拙,并且在某种情况下活动本身可能不存在,具体取决于内存可用性.Application,Application来启动某些事情,例如分析等,因为应用程序类是在Activitys或
Servicess运行之前启动的,wts*_*g02 63
应用程序类是具有应用程序完整生命周期的对象.它是您作为应用程序的最高层.示例可能的用法:
存储从Activity跳转到Activity的全局变量.像Asynctask一样.
等等
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)
更多信息.请点击此链接
Joe*_*lin 29
另外,我无法想象一个真正的场景,其中扩展应用程序要么优于另一种方法,要么是完成某些任务所必需的.如果您有一个昂贵的,经常使用的对象,则可以在检测到该对象当前不存在时在IntentService中初始化它.应用程序本身在UI线程上运行,而IntentService在其自己的线程上运行.
我更喜欢使用显式Intent将数据从Activity传递给Activity,或者使用SharedPreferences.还有一些方法可以使用接口将数据从Fragment传递到其父Activity.
Application类是一个单例,您可以从任何活动或您拥有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);
}
Run Code Online (Sandbox Code Playgroud)
不是答案而是观察:请记住,扩展应用程序对象中的数据不应与活动的实例相关联,因为您可能同时运行同一活动的两个实例(一个在前景和一个不可见)。
例如,您通过启动器正常启动您的活动,然后“最小化”它。然后您启动另一个应用程序(即 Tasker),它启动您的活动的另一个实例,例如为了创建快捷方式,因为您的应用程序支持 android.intent.action.CREATE_SHORTCUT。如果随后创建了快捷方式并且该活动的快捷方式创建调用修改了应用程序对象的数据,则在后台运行的活动将在将其带回前台后开始使用该修改后的应用程序对象。
我发现这个问题缺少答案。我之所以扩展,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 单例模板可以节省大量时间。
来源: https ://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class
\n\n\n\n在许多应用程序中,无需直接使用应用程序类。但是,自定义应用程序类有一些可接受的用途:
\n\n\n
\n\n- 在创建第一个活动之前需要运行的专门任务
\n- 需要在所有组件之间共享的全局初始化(崩溃报告、持久性)
\n- 用于轻松访问静态不可变数据(例如共享网络客户端对象)的静态方法
\n您永远不应该将可变实例数据存储在 Application 对象内,因为如果您假设您的数据将保留在那里,那么您的应用程序将不可避免地在某个时刻崩溃并出现 NullPointerException。应用程序对象不能保证永远保留在内存中,它会被杀死。与普遍的看法相反,该应用程序不会从头开始重新启动。Android 将创建一个新的 Application 对象并在用户之前所在的位置启动 Activity,以给人一种应用程序从未被终止的错觉。
\n
| 归档时间: |
|
| 查看次数: |
106881 次 |
| 最近记录: |