Android中Application分析
Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。
<application android:name="com.xxx.cn.myapplication.MyApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作。
进入Application源码,在oncreate的注释可以清楚的看到:
1、它是最早被实例化的一个类,应用程序启动最早执行的就是这个onCreate。activity, service, receiver都在它的后面
2、在它里面不要执行耗时的操作,不然会影响Activity的启动
/** * Called when the application is starting, before any activity, service, * or receiver objects (excluding content providers) 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(). */ public void onCreate() { }
Android中全局Application的onCreate多次调用问题:
一般来说Application的onCreate方法只会执行一次,但是如果应用中采用多进程方式,oncreate方法会执行多次,每启动一个进程就会执行一遍onCreate函数,这样我们就可以根据不同的进程名字进行不同的初始化,具体的做法就是在onCreate方法中对进程进行判断,针对不同进程进行不同操作。
下面我们写个小demo来进行验证一下:启动三个服务,每个服务运行在一个单独的进程之中,然后我们在MyApplication的onCreate方法中对进程进行判断,因为每启动一个进程,都会执行一遍MyApplication中的onCreate方法。观察打印的Log.
自定义一个MyApplication类继承自Application:
//MyApplication.javapackage com.xxx.cn.myapplication;import android.app.ActivityManager;import android.app.Application;import android.content.Context;import android.util.Log;import java.util.List;public class MyApplication extends Application { private static final String TAG = "MyApplication"; @Override public void onCreate() { super.onCreate(); //对不同的进程进行判断 ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runProcessList = am.getRunningAppProcesses(); if (runProcessList != null) { for (int i = 0; i < runProcessList.size(); i++) { if (runProcessList.get(i).pid == android.os.Process.myPid()) { String processName = runProcessList.get(i).processName; if (processName.endsWith(":remote1")) { Log.i(TAG, "start remote1"); } else if (processName.endsWith(":remote2")) { Log.i(TAG, "start remote2"); } else if (processName.endsWith(":remote3")) { Log.i(TAG, "start remote3"); } else if (processName.equals("com.xxx.cn.myapplication")) { Log.i(TAG, "start UI"); } } } } }}
MainActivity.java文件
package com.xxx.cn.myapplication;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void startService1(View view) { startService(new Intent(this, MyService1.class)); } public void startService2(View view) { startService(new Intent(this, MyService2.class)); } public void startService3(View view) { startService(new Intent(this, MyService3.class)); }}
MainActivity的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动服务1" android:onClick="startService1"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动服务2" android:onClick="startService2"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动服务3" android:onClick="startService3"/></LinearLayout>
MyService1.java
package com.xxx.cn.myapplication;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;public class MyService1 extends Service { private static final String TAG = "MyService1"; public MyService1() { } @Override public void onCreate() { super.onCreate(); Log.i(TAG, "Service1 onCreate"); } @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); }}
MyService2.java
package com.xxx.cn.myapplication;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;public class MyService2 extends Service { private static final String TAG = "MyService2"; public MyService2() { } @Override public void onCreate() { super.onCreate(); Log.i(TAG, "Service2 onCreate"); } @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); }}
MyService3.java
package com.xxx.cn.myapplication;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;public class MyService3 extends Service { private static final String TAG = "MyService3"; public MyService3() { } @Override public void onCreate() { super.onCreate(); Log.i(TAG, "Service3 onCreate"); } @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); }}
AndroidManifest.xml文件
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xxx.cn.myapplication" > <application android:name="com.xxx.cn.myapplication.MyApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.xxx.cn.myapplication.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.xxx.cn.myapplication.MyService1" android:process=":remote1" android:enabled="true" android:exported="true" > </service> <service android:name="com.xxx.cn.myapplication.MyService2" android:process=":remote2" android:enabled="true" android:exported="true" > </service> <service android:name="com.xxx.cn.myapplication.MyService3" android:process=":remote3" android:enabled="true" android:exported="true" > </service> </application></manifest>
运行界面如下:
当我们分别点击启动服务1,启动服务2,启动服务3,打印Log如下:
可以看到,在每个Service的onCreate方法执行前,都先会把MyApplication里面的onCreate方法运行一遍。
更多相关文章
- Android(安卓)Application Addon(插件) 架构及管理
- android jni示范 修改无法启动注意点 jni无效
- activity 基础补习
- android eclipse中经常遇到的the connection to adb is down and
- Android代码性能优化技巧 (一)
- Android(安卓)launchMode
- android开发框架(五)AIDL进程间通信机制
- Android中的Service组件详解
- 实例讲解Android中ContentProvider组件的使用方法