记一次集成百度facesdk中遇到的知识盲点。

一些app通过继承application作为 应用程序入口调用,避免手机内存过小,杀死后台进程(在手机设置里面,对应于某一个应用,虽然没有启动,但是上面有一个终止按钮,说明这个应用时启动的,只是里面没有Activity,所以说使用android退出把一个应用退出,实际上他所对应的Application是没有退出的(因为他的生命周期最长),只是对应的Activity退出了而已)

认识application:

android开发文档中关于application的描述 :
Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml's < application> tag, which will cause that class to be instantiated for you when the process for your application/package is created.

Application 配置全局Context

第一步、写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里面实例化Application,并且值是全局的,可以使用Context的 getApplicationContext或者Activity的getApplication方法来获得一个application对象来拿到它。

  1. oncreate方法
    application对应的也有一个onCreate,这个才是真正的入口,不过一般我们使用的是Activity的onCreate方法作为入口使用了。
    开发文档描述
    * Called when the application is starting, before any other application
    * objects have been created. Implementations should be as quick as
    * possible (for example using lazy initialization of state) since the time
    * spent in this function directly impacts the performance of starting the
    * first activity, service, or receiver in a process.
    * If you override this method, be sure to call super.onCreate()

  2. onConfigurationChanged方法
    当屏幕方向发生改变了,就会调用这个方法,并且对应的Activity中也会调用对应的方法
    因此不必再次处理

第二步、配置全局的Context
<application android:name="com.example.demo.MyApplication" ></application>

第三步、使用的时候用的时候根据类的名称访问Context,manifest文件有一项是android:name属性,一般你新建一个android项目的话,这个name属性是没有的,如果想要使用自定义的MyApplication的话,就要添加上一个name属性,如上面显示的那样,然后自定义一个类:MyApplication来继承application即可

Android程序的入口点

Android使用Google Dalvik VM,相对于传统Java VM而言有着很大的不同,在Sun的Java体系中入口点和标准c语言一样是main(),而每个Android程序都包含着一个Application实例,一个Application实例中有多个Activity、Service、ContentProvider或Broadcast Receiver。因为大部分的应用都包含Activity所以,说很多网友认为是Activity的onCreate,但是你没有发现你的工程中有多个Activity吗? 你可能没有见过没有Activity的Android应用吧。其实在android.app.Application这个包的onCreate才是真正的Android入口点,只不过大多数开发者无需重写该类,他的继承关系如下图:

java.lang.Object
? android.content.Context
? android.content.ContextWrapper
? android.app.Application

android.app.Application类包含了4个公开的方法

void onConfigurationChanged(Configuration newConfig)
void onCreate() //这里才是真正的入口点。
void onLowMemory()
void onTerminate()

所以希望大家,记住真正的Android入口点是application的main,你可以看下androidmanifest.xml的包含关系就清楚了,并不是每个应用都必须有Activity的。

问题一:
在这次集成中,原项目和facesdk 都使用application继承类作为程序入口初始化,知道这个后:

Android中两个application该如何继承和声明?

1.继承:假如你有两个application类:ApplicationOne.java和ApplicationTwo.java

ApplicationOne才是你真正的程序入口,ApplicationTwo是第三方sdk或库里定义的,那么你可以把ApplicationOne继承于ApplicationTwo。

2.声明:在AndroidManifest.xml里声明的时候,只需要声明ApplicationOne就行了。因为AndroidManifest.xml中第一个注册的Application才真正会被PackageManager解析,才是有效的。

详见:Application  |  Android Developers