Android中Application类用法
- 格式:docx
- 大小:23.21 KB
- 文档页数:10
29个android开发常⽤的类、⽅法及接⼝在中,我们常常都需要借助各种各样的⽅法、类和接⼝来实现相关功能、提升开发效率,但对于初学者⽽⾔,什么时候该⽤什么类、⽅法和接⼝呢?下⾯⼩编整理了29个,⽇常开发中⽐较常⽤的类、⽅法、接⼝及其应⽤场景,分享给⼤家,赶紧学起来吧。
1、Throwable类中的getStackTrace()⽅法,根据这个⽅法可以得到函数的逐层调⽤地址,其返回值为StackTraceElement[];2、StackTraceElement类,其中四个⽅法getClassName(),getFileName(),getLineNumber(),getMethodName()在调试程序打印Log时⾮常有⽤;3、UncaughtExceptionHandler接⼝,再好的代码异常难免,利⽤此接⼝可以对未捕获的异常善后;4、Resources类中的getIdentifier(name, defType, defPackage)⽅法,根据资源名称获取其ID,做UI时经常⽤到;5、View中的isShown()⽅法,以前都是⽤view.getVisibility() == View.VISIBLE来判断的;6、Arrays类中的⼀系列关于数组操作的⼯具⽅法:binarySearch(),asList(),equals(),sort(),toString(),copyOfRange()等;Collections类中的⼀系列关于集合操作的⼯具⽅法:sort(),reverse()等;7、android.text.format.Formatter类中formatFileSize(Context, long)⽅法,⽤来格式化⽂件Size(B → KB → MB → GB);8、android.media.ThumbnailUtils类,⽤来获取媒体(图⽚、视频)缩略图;9、String类中的format(String, Object...)⽅法,⽤来格式化strings.xml中的字符串;10、View类中的三个⽅法:callOnClick(),performClick(),performLongClick(),⽤于触发View的点击事件;11、TextUtils类中的isEmpty(CharSequence)⽅法,判断字符串是否为null或"";12、TextView类中的append(CharSequence)⽅法,添加⽂本。
android中的Application类在2011年做的一个iptv项目中就接触了这个Application类,虽用起来简单,但还是有些需要注意的地方。
空闲之余,总结如下:android系统为每个程序运行时创建一个Application类的对象,且application 对象的生命周期就等于这个程序的生命周期。
因为它是全局的,单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。
通常我们不需要指定一个Application,系统会自动帮我们创建。
如果需要创建自己的Application,只需创建一个类继承 Application并在manifest的application标签中进行注册(在Application标签增加个name属性,并赋值自定义的 Application类的名字)。
Activity间的数据传递,通常的作法是使用Intent.putExtra() ,让Intent 携带,或者有一个Bundle把信息加入Bundle让Intent推荐Bundle对象,实现传递。
但这样作有一个问题,Intent和Bundle所能携带的数据类型都是一些基本的数据类型,如果想实现复杂的数据传递就比较麻烦了,通常需要实现Serializable或者Parcellable接口。
这其实是Android的一种IPC数据传递的方法。
如果两个Activity在同一个进程当中,为什么还要这么麻烦呢?只要把需要传递的对象的引用传递过去就可以了。
那用什么办法把对象的引用传递过去呢?这时使用自定义的Application类就是一个非常不错的选择。
在Application 类中定义一个Object类的引用,把对象赋值给这个引用,这样在整个进程中就能得到该对象的引用了,使用的时候向下转型就行了。
需要注意的地方:Application如果保存了一些不该保存的对象将导致内存泄漏,最好在使用完之后把相应的引用赋值为空。
AndroidApplication类的详细介绍Android Application类详解:Android中Application类的详细解释:我们在平时的开发中,有时候可能会需要⼀些全局数据,来让应⽤中的所有Activity和View都能访问到,⼤家在遇到这种情况时,可能⾸先会想到⾃⼰定义⼀个类,然后创建很多静态成员。
但是这种⽅法不符合Android的框架架构,不过andorid已经为我们提供了这种情况的解决⽅案:在Android中,有⼀个名为Application的类,我们可以在Activity中使⽤getApplication(),⽅法来获得,它是代表我们的应⽤程序的类,使⽤它可以获得当前应⽤的主题,资源⽂件中的内容等,这个类更灵活的⼀个特性就是可以被我们继承,来添加我们⾃⼰的全局属性。
让整个App的Activity和View都能访问到。
1.概念:android系统会为每个程序运⾏时创建⼀个Application类的对象且仅创建⼀个,所以Application可以说是单例 (singleton)模式的⼀个类.且application对象的⽣命周期是整个程序中最长的,它的⽣命周期就等于这个程序的⽣命周期。
因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同⼀个对象。
所以通过Application来进⾏⼀些,数据传递,数据共享,数据缓存等操作。
2.作⽤:(1).Application是⼀个基类,这个基类的作⽤是获取整个App的状态,我们需要⾃⼰定义⼀个类来继承这个基类。
(2).定义⼀些全局的和⼀些上下⽂都要⽤到的变量和⽅法。
3.优点:(1).继承的⽅式:⽣命周期随着应⽤程序的销毁⽽销毁。
(2).静态类或静态⽅法:程序退出后该类或者变量不能⽴刻被GC回收。
当你再次进⼊后会发现该静态类保存的信息状态是之前的。
有可能会导致程序不是你想要的初始化状态。
(3).App的进程被创建时,这个类就会被实例化,onCreate()⽅法就会被执⾏,给所有全局变量赋初期值。
AndroidApplicationInfo应⽤程序信息的详解Android ApplicationInfo 应⽤程序信息1、简述1 ApplicationInfo是android.content.pm包下的⼀个实体类,⽤于封装应⽤的信息,flags是其中的⼀个成员变量public int flags = 0;⽤于保存应⽤的标志信息。
2 ApplicationInfo 通过它可以得到⼀个应⽤基本信息。
这些信息是从AndroidManifest.xml的< application >标签获取的3 ApplicationInfo对象⾥保存的信息都是<application>标签⾥的属性值4 ApplicationInfo与ResolveInfo⽐较:前者能够得到Icon、Label、meta-data、description。
后者只能得到Icon、Label2、获取ApplicationInfo2.1 、获取⼿机上安装所有程序对应的 ApplicationInfo/*** 获取⼿机上安装的所有的程序对应的 ApplicationInfo* 它是通过解析AndroidManifest.xml的< application>标签中得到的,所以它能得到所有的app** 获取⼿机上的所有的安装的应⽤程序信息* 参数为标识⼀般为 PackageManager.GET_UNINSTALLED_PACKAGES*/List<ApplicationInfo> list = packageManager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);2.2 、获取指定包名对应的 ApplicationInfo/*** 获取指定应⽤程序 ApplicationInfo* 参数⼀对应应⽤程序的包名* 参数⼆应⽤程序对应的标识通常为 0*/ApplicationInfo applicationInfo = packageManager.getApplicationInfo("com.androidlongs.contactsapplication", 0);3、通过ApplicationInfo来获取应⽤程序的基本信息3.1 、获取应⽤程序对应的包名、应⽤名称//获取应⽤图标Drawable drawable = applicationInfo.loadIcon(packageManager);//获取应⽤程序的包名String appPackageName = applicationInfo.packageName;//获取应⽤名//参数 packageManager 是应⽤管理者对象String appName =applicationInfo.loadLabel(packageManager).toString();3.2 、获取应⽤程序对应数据的⽬录以及占⽤的空间⼤⼩//获取应⽤存放数据⽬录String dir = applicationInfo.sourceDir;Log.d("app ","应⽤存放数据⽬录 " +dir);//获取应⽤数据⼤⼩ong length = new File(dir).length();//转换为 Mfloat size = length*1f/1024/1024;Log.d("app ","应⽤数据⼤⼩ " +length+"\t"+size);3.3 、判断是否安装在外置储存空间存//判断是否安装在外存int flags = applicationInfo.flags;if((flags&ApplicationInfo.FLAG_EXTERNAL_STORAGE)==ApplicationInfo.FLAG_EXTERNAL_STORAGE){Log.d("app "," 安装在外置存储空间 ");}else {Log.d("app "," 安装在内置存储空间 ");}3.4 、判断应⽤程序是否是系统应⽤//判断是否是系统应⽤if((flags&ApplicationInfo.FLAG_SYSTEM)==ApplicationInfo.FLAG_SYSTEM){Log.d("app "," 是系统应⽤ ");}else{Log.d("app "," 不是系统应⽤ ");}3.5 、manageSpaceActivityName/*** 从”android:manageSpaceActivity“属性得到* ⽤于指定⼀个Activity来管理数据,* 它最终会出现在设置->应⽤程序管理中,* 默认为按钮为”清除数据”,指定此属性后,该按钮可点击跳转到该Activity, 让⽤户选择性清除哪些数据。
android应⽤架构随笔⼆(定义BaseApplication并配置Application)定义BaseApplication并配置Applicationimport android.app.Application;import android.os.Handler;/**** ============================================================**/public class BaseApplication extends Application {//获取到主线程的上下⽂private static BaseApplication mContext;//获取到主线程的handlerprivate static Handler mMainThreadHanler;//获取到主线程private static Thread mMainThread;//获取到主线程的idprivate static int mMainThreadId;@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();this.mContext = this;this.mMainThreadHanler = new Handler();this.mMainThread = Thread.currentThread();//获取到调⽤线程的idthis.mMainThreadId = android.os.Process.myTid();}public static BaseApplication getApplication(){return mContext;}public static Handler getMainThreadHandler(){return mMainThreadHanler;}public static Thread getMainThread(){return mMainThread;}public static int getMainThreadId(){return mMainThreadId;}}BaseApplication<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.heima.googleplay"android:versionCode="1"android:versionName="1.0"><uses-sdkandroid:minSdkVersion="10"android:targetSdkVersion="17"/><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><applicationandroid:name="包名.application.BaseApplication"android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme"><activityandroid:name="com.heima.googleplay.MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="UNCHER"/></intent-filter></activity></application></manifest>manifest<applicationandroid:name="包名.application.BaseApplication"android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.heima.googleplay.MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /> </intent-filter></activity></application>。
android实现原理说明之一_application Intent Task Activity在android中,task的定义是,多个activity协同工作来完成某一项应用的过程。
注意,这里的activity并不要求属于同一个application。
如下图所示,我们的task所需要的activity可能来自多个application。
activity可以看做是独立存在于系统中,并且作为现实具体应用的主体,task将一些activity关联起来以便实现一个更复杂的功能,一个或者多个task又可以组成一个application。
这就是三者之间的关系。
简单点说,就是一个application包含一个或多个task,而一个task又包含一个或者多个activity。
下面说一下activity和task的基本原理:绝大多数的application都是通过home screen的快捷方式启动的,(另一种启动方式是通过系统的application launcher启动)。
启动某个application之后,该application的根activity将会显示在当前窗口,首页activity将会隐藏到后台。
当我们在home页中点击email图标的时候,应用中的list message activity将会显示在当前窗口,而home activity则隐藏到了后台。
按back键我们便可以重新返回到home页面。
这里要注意,应用back键和home键退出是有本质上区别的:两者虽然都可以离开当前activity,但是back 会销毁当前activity的状态,home则会保存当前activity的状态。
关于back:将会终止当前的activity,返回到之前的activity(如果当前的activity已经是根activity,那么就直接返回到home screen),在这个过程中,系统会销毁当前activity的状态信息,当我们再次回到这个activity 时,展示给我们的将会是一个全新的activity。
A n d r o i d和A p p l i c a t i o n m k详解Android.mk详解LOCAL_PATH必须位于Android.mk文件的最开始。
它是用来定位源文件的位置,$(call my-dir)的作用就是返回当前目录的路径。
Android.mk 定义属性方法Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译。
因为所有的编译文件都在同一个 GNU MAKE 执行环境中进行执行,而Android.mk中所有的变量都是全局的。
因此,您应尽量少声明变量,不要认为某些变量在解析过程中不会被定义。
一个Android.mk文件可以编译多个模块,每个模块属下列类型之一:1)APK程序一般的Android程序,编译打包生成apk文件2)JAVA库java类库,编译打包生成jar文件3)C\C++应用程序可执行的C\C++应用程序4)C\C++静态库编译生成C\C++静态库,并打包成.a文件5)C\C++共享库编译生成共享库(动态链接库),并打包成.so文,有且只有共享库才能被安装/复制到您的应用软件(APK)包中。
可以在每一个Android.mk file 中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。
编译系统为你处理许多细节问题。
例如,你不需要在你的Android.mk 中列出头文件和依赖文件。
编译系统将会为你自动处理这些问题。
这也意味着,在升级 NDK 后,你应该得到新的toolchain/platform支持,而且不需要改变你的 Android.mk 文件。
注意,NDK的Anroid.mk语法同公开发布的Android平台开源代码的Anroid.mk语法很接近,然而编译系统实现他们的方式却是不同的,这是故意这样设计的,可以让程序开发人员重用外部库的源代码更容易。
在描述语法细节之前,咱们来看一个简单的"hello world"的例子,比如,下面的文件:sources/helloworld/helloworld.csources/helloworld/Android.mk'helloworld.c'是一个 JNI 共享库,实现返回"hello world"字符串的原生方法。
在Android Studio中分析内存泄漏内存泄漏是开发过程中常见的问题之一,在Android应用程序中尤为突出。
当我们在开发应用时忽略了内存管理,或者对内存泄漏的检测不够敏感,就容易造成内存泄漏。
而Android Studio作为一款强大的集成开发环境,提供了丰富的工具和功能来帮助我们分析和解决内存泄漏问题。
本文将介绍如何在Android Studio中分析内存泄漏,并提供一些常见的解决方案。
一、内存泄漏的概念及影响内存泄漏是指在程序中分配了一块内存后,由于某种原因导致无法再次访问和释放这块内存,从而造成内存的浪费。
在Android应用中,内存泄漏的存在会导致一系列问题,包括但不限于:1. 应用程序占用内存过高,导致系统资源消耗过多,从而影响整体性能;2. 应用程序运行速度变慢,响应时间延长,用户体验差;3. 频繁的垃圾回收(Garbage Collection)导致界面卡顿或卡死。
二、分析工具介绍Android Studio提供了一些实用的工具和插件,帮助我们检测和分析内存泄漏。
以下是其中一些常用的工具和插件:1. Android Profiler:官方内置的性能分析工具,可以监控应用的CPU、内存、电量等性能数据,并提供实时的数据图表展示,帮助我们发现内存泄漏的位置。
2. LeakCanary:一款非常流行的开源库,专门用于检测内存泄漏。
只需要引入该库,并通过简单的配置即可在应用中实时检测内存泄漏,并生成详细的分析报告。
3. MAT(Memory Analyzer Tool):一款功能强大的Java内存分析器,可以用于分析Java应用程序的内存占用情况、泄漏对象的引用链等。
三、使用Android Profiler进行内存泄漏分析1. 打开Android Studio,点击顶部工具栏的"Profiler"按钮进入Android Profiler界面。
2. 在Android Profiler界面,选择"Memory"选项卡,可以看到应用程序的内存使用情况图表。
androidmanifest 配置条件语句在AndroidManifest.xml文件中,可以使用条件语句来根据不同的条件配置不同的项。
常用的条件语句有以下几种:1. 使用`manifest`元素的`package`属性来配置包名的条件语句。
例如:xml<manifest xmlns:android="package="com.example.app.{buildType}">...</manifest>上述示例中,`{buildType}`是一个占位符,可以根据实际的构建类型来替换。
例如,如果构建类型是`debug`,那么最终的包名就是`com.example.app.debug`。
2. 使用`uses-permission`元素的`android:name`属性来配置权限的条件语句。
例如:xml<uses-permission android:name="android.permission.{permission}" />上述示例中,`{permission}`是一个占位符,可以根据实际的权限名称来替换。
例如,如果权限是`READ_EXTERNAL_STORAGE`,那么最终的配置就是`<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE" />`。
3. 使用`application`元素的`android:debuggable`属性来配置调试模式的条件语句。
例如:xml<applicationandroid:name=".MyApplication"android:label="@string/app_name"android:debuggable="{isDebug}">...</application>上述示例中,`{isDebug}`是一个占位符,可以根据实际的调试模式来替换。
1:Application是什么?Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个application对象,用来存储系统的一些信息。
通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己的Application,也很简单创建一个类继承Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的Application的名字定入即可)。
android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例(singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。
因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。
所以通过Application来进行一些,数据传递,数据共享等,数据缓存等操作。
2:通过Application传递数据假如有一个Activity A, 跳转到Activity B ,并需要推荐一些数据,通常的作法是Intent.putExtra() 让Intent携带,或者有一个Bundle把信息加入Bundle让Intent推荐Bundle对象,实现传递。
但这样作有一个问题在于,Intent和Bundle所能携带的数据类型都是一些基本的数据类型,如果想实现复杂的数据传递就比较麻烦了,通常需要实现Serializable或者Parcellable接口。
这其实是Android的一种IPC数据传递的方法。
如果我们的两个Activity在同一个进程当中为什么还要这么麻烦呢,只要把需要传递的对象的引用传递过去就可以了。
基本思路是这样的。
在Application中创建一个HashMap ,以字符串为索引,Object为value这样我们的HashMap就可以存储任何类型的对象了。
在Activity A中把需要传递的对象放入这个HashMap,然后通过Intent或者其它途经再把这索引的字符串传递给Activity B ,Activity B 就可以根据这个字符串在HashMap中取出这个对象了。
只要再向下转个型,就实现了对象的传递。
3:Application数据缓存我一般会习惯在application中建立两个HashMap一个用于数据的传递,一个用于缓存一些数据。
比如有一个Activity需要从网站获取一些数据,获取完之后我们就可以把这个数据cache到Application 当中,当页面设置到其它Activity再回来的时候,就可以直接使用缓存好的数据了。
但如果需要cache一些大量的数据,最好是cache一些(软引用)SoftReference ,并把这些数据cache到本地rom上或者sd卡上。
如果在application 中的缓存不存在,从本地缓存查找,如果本地缓存的数据也不存在再从网络上获取。
4:PitFalls(汉语:易犯的错误)使用Application如果保存了一些不该保存的对象很容易导致内存泄漏。
如果在Application的oncreate中执行比较耗时的操作,将直接影响的程序的启动时间。
不些清理工作不能依靠onTerminate完成,因为android会尽量让你的程序一直运行,所以很有可能onTerminate不会被调用。
5:MemoryLeak在Java中内存泄漏是只,某个(某些)对象已经不在被使用应该被gc所回收,但有一个对象持有这个对象的引用而阻止这个对象被回收。
比如我们通常会这样创建一个View TextView tv = new TextView(this);这里的this通常都是Activity。
所以这个TextView就持有着这个Activity的引用。
下面看张图(Google IO 2011 ppt中抄得)通常情况下,当用户转动手机的时候,android会重新调用OnCreate()方法生成一个新的Activity,原来的Activity应该被GC所回收。
但如果有个对象比如一个View的作用域超过了这个Activity(比如有一个static对象或者我们把这个View的引用放到了Application 当中),这时候原来的Activity将不能被GC所回收,Activity本身又持有很多对象的引用,所以整个Activity的内存被泄漏了。
备注:经常导致内存泄漏核心原因:keeping a long-lived reference to a Context.持有一个context的对象,从而gc不能回收。
情况如下:1.一个View的作用域超出了所在的Activity的作用域,比如一个static的View或者把一个View cache到了application当中etc理解:内存:注意静态的数据和缓存中的数据;注意释放;2.某些与View关联的Drawable的作用域超出了Activity的作用域。
3.Runnable对象:比如在一个Activity中启用了一个新线程去执行一个任务,在这期间这个Activity被系统回收了,但Runnalbe的任务还没有执行完毕并持有Activity的引用而泄漏,但这种泄漏一般来泄漏一段时间,只有Runnalbe的线程执行完闭,这个Activity 又可以被正常回收了。
4.内存类的对象作用域超出Activity的范围:比如定义了一个内存类来存储数据,又把这个内存类的对象传给了其它Activity 或者Service等。
因为内部类的对象会持有当前类的引用,所以也就持有了Context的引用。
解决方法是如果不需要当前的引用把内部类写成static或者,把内部类抽取出来变成一个单独的类,或者把避免内部对象作用域超出Activity 的作用域。
out Of Memery Error 在android中每一个程序所分到的内存大小是有限的,如果超过了这个数就会报Out Of Memory Error。
android给程序分配的内存大小与手机硬件有关,以下是一些手机的数据:G1:16M Droid:24 Nexus One:32M Xoom:48Ms所以尽量把程序中的一些大的数据cache到本地文件。
以免内存使用量超标。
记得数据传递完成之后,把存放在application的HashMap中的数据remove掉,以免发生内存的泄漏6:生命周期:onCreate 在创建应用程序时创建onTerminate 当终止应用程序对象时调用,不保证一定被调用,当程序是被内核终止以便为其他应用程序释放资源,那么将不会提醒,并且不调用应用程序的对象的onTerminate方法而直接终止进程onLowMemory 当后台程序已经终止资源还匮乏时会调用这个方法。
好的应用程序一般会在这个方法里面释放一些不必要的资源来应付当后台程序已经终止,前台应用程序内存还不够时的情况。
onConfigurationChanged 配置改变时触发这个方法备注:application 被杀死的情况分析:为了决定在内存较低的时候杀掉哪个进程, Android会根据运行在这些进程内的组件及他们的状态把进程划分成一个”重要程度层次”. 其重要的程度按以下规则排序:1:前端进程可以是一个持有运行在屏幕最前端并与用户交互的Activity的进程(onResume 方法被调用时),也可以是持有一个正在运行的IntentReceiver(也就是说他正在执行自己的onReceiveIntent方法)的进程. 在系统中, 只会有少数这样的进程, 并且除非内存已经低到不够这些进程运行, 否则系统不会主动杀掉这些进程. 这时, 设备通常已经达到了需要内存整理的状态, 所以杀掉这些进程是为了不让用户界面停止响应.2:可视进程是持有一个被用户可见, 但没有显示在最前端(onPause方法被调用时) 的Activity的进程. 举例来说, 这种进程通常出现在一个前端Activity以一个对话框出现并保持前一个Activity可见时. 这种进程被系统认为是极其重要的, 并且通常不会被杀掉, 除非为了保持所有前端进程正常运行不得不杀掉这些可见进程.3:服务进程是持有一个Service的进程, 该Service是由startService()方法启动的, 尽管这些进程用户不能直接看到, 但是通常他们做的工作用户是十分关注的(例如, 在后台播放mp3或是在后台下载上传文件), 所以, 除非为了保持所有的前端进程和可视进程正常运行外, 系统是不会杀掉服务进程的.4:后台进程是持有一个不再被用户可见的Activity(onStop()方法被调用时)的进程. 这些进程不会直接影响用户体验. 加入这些进程已经完整的,正确的完成了自己的生命周期(访问Activity查看更多细节), 系统会在为前三种进程释放内存时随时杀掉这些后台进程. 通常会有很多的后台进程在运行, 所以这些进程被存放在一个LRU列表中, 以保证在低内存的时候, 最近一个被用户看到的进程会被最后杀掉.5:空进程是没有持有任何活动应用组件的进程. 保留这种进程的唯一理由是为了提供一种缓存机制, 缩短他的应用下次运行时的启动时间. 就其本身而言, 系统杀掉这些进程的目的是为了在这些空进程和底层的核心缓存之间平衡整个系统的资源.当需要给一个进程分类的时候, 系统会在该进程中处于活动状态的所有组件里掉选一个重要等级最高作为分类依据. 查看Activity, Service,和IntentReceiver的文档, 了解每个组件在进程整个生命周期中的贡献. 每一个classes的文档详细描述他们在各自应用的生命周期中所起得作用.7:application 的context1、它描述的是一个应用程序环境的信息,即上下文。
2、该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类)。
3、通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息等。
用法详解:MyApp.java1.package com.android.test;2.import android.app.Application;3.4.public class MyApp extends Application{5.6. private String mylabel ;7. public String getLabel(){8. return mylabel;9. }10. public void setLabel(String s){11. this.mylabel = s;12. }13.14. @Override15. public void onCreate() {16. // TODO Auto-generated method stub17. super.onCreate();18. setLabel("Welcome!"); //初始化全局变量19. }20.}复制代码MainActivity.java1.import android.app.Activity;2.import android.content.Intent;3.import android.os.Bundle;4.import android.util.Log;5.6.public class MainActivity extends Activity {7.8. private MyApp myApp;9.10. @Override11. public void onCreate(Bundle savedInstanceState) {12. super.onCreate(savedInstanceState);13. setContentView(yout.main);14. myApp = (MyApp) getApplication(); //获得自定义的应用程序MyApp15. Log.i("guoll", "InitLabel:"+myApp.getLabel()); //将我们放到进程中的全局变量拿出来,看是不是我们曾经设置的值16.17. myApp.setLabel("Changing!"); //修改一下18. Log.i("guoll", "ChangeLabel:"+myApp.getLabel()); //看下,这个值改变了没有19.20. Intent intent = new Intent(); //再看一下在另一个Activity中是取到初始化的值,还是取到修改后的值21. intent.setClass(this, otherActivity.class);22. startActivity(intent);23. }24.}复制代码OtherActivity.java:1.import android.app.Activity;2.import android.os.Bundle;3.import android.util.Log;4.5.public class OtherActivity extends Activity{6.7. private MyApp myApp;8.9. @Override10. protected void onCreate(Bundle savedInstanceState) {11.12. super.onCreate(savedInstanceState);13. setContentView(yout.main);14.15. myApp = (MyApp) getApplication(); //获得自定义的应用程序MyApp16. Log.i("guoll", "OhterActivity receive theLabel:"+myApp.getLabel()); //查看变量值是否修改了17.18. }19.}复制代码修改配置文件ApplicationManifest.xml,将要运行的应用程序MyApp加进去:1.2<?xml version="1.0" encoding="utf-8"?>2.<manifest xmlns:android="/apk/res/android"3. package="com.android.test"4. android:versionCode="1"5. android:versionName="1.0">6. <!-- 在这里,将默认的Application设置成自己做的MyApp-->7. <application android:name="MyApp"8. android:icon="@drawable/icon"9. android:label="@string/app_name"10. >11. <activity android:name=".mainActivity"12. android:label="@string/app_name">13. <intent-filter>14. <action android:name="android.intent.action.MAIN" />15.<categoryandroid:name="UNCHER" />16. </intent-filter>17. </activity>18. <activity android:name=".otherActivity">19. </activity>20. </application>21.22.</manifest>。