麦子学院Android开发教程Activity加载模式解析
Activity启动模式解析
关于Activity的LaunchMode大家一定知道有以下四种:∙standard(标准模式)∙singleTop(栈顶复用模式)∙singleTask(栈内复用模式)∙singleInsance(单实例模式)但大家是否理解了这四种启动模式的区别在什么地方还有它们分别的应用场景是什么?这个模式我们不用显示指定,因为它是Activity默认的启动模式,例如以下代码就是以standard模式启动的:Intent intent = new Intent(this, SecondActivty.class);startActvitiy(intent);我们知道Activity是通过任务栈来管理的,使用standard模式会有以下特点:∙每启动一个Activity都会重新创建一个实例,然后会被压入栈里面∙后创建的Activity会先出栈,一般表现为按back键,就会有一个Activity出栈一图胜千言:栈顶复用模式,顾名思义:如果在任务栈中的栈顶已经存在该Activity,再次启动Activity 则不会重新创建实例,会直接复用栈顶的Activity。
一图胜千言:还有一点,如果复用栈顶的Activity,则这个Activity的onNewIntent方法会被回调,onCreate方法和onStart方法不会被回调。
栈内复用模式这是个单实例模式,我们启动Activity一般会默认创建一个栈,属性于包名相同,这个是我们的默认栈,通过standard启动的Activity都会放入这个栈内。
如果使用singleTask,可以指定Activity需要的栈,可以通过指定taskAffinity属性来指定,但这个属性不能跟包名相同,示例如下:<activity android:name=".SecondActivity" android:launchMode="singleTask"android:taskAffinity="com.devilwwj.task"/>再看一张图你就更清楚了:单实例模式这个启动模式跟singleTask有点类似,但它们之间的区别是,singleInstance指定的栈只能存放一个Activity,这个Activity是全局唯一的。
麦子学院Android开发教程Activity管理机制
Android的管理主要是通过Activity栈和Task来进行的,这里将着重讲解Activity栈、Task以及Activity生命周期等概念。
1. Activity栈Android的管理主要是通过Activity栈来进行的。
当一个Activity启动时,系统根据其配置或调用的方式,将Activity压入一个特定的栈中,系统处于运行(Running or Resumed)状态。
当按Back键或触发finish()方法时,Activity会从栈中被压出,进而被销毁,当有新的Activity压入栈时,如果原Activity仍然可见,则原Activity的状态将转变为暂停(Paused)状态,如果原Activity完全被遮挡,那么其状态将转变为停止(Stopped)。
2. TaskTas与Activity栈有着密切的联系。
一个Task对应于一个Activity栈,Task是根据用户体验组成的运行期逻辑元素,其与应用的区别是,Task中的Activity可以由不同的应用组成。
在实际的终端使用中,在主界面长按Home键时弹出的一个网格界面即是当前运行的Task而非应用。
Task的定义位于frameworks\base\services\java\com\android\server\am\目录下的TaskRecord.java中,一个Task由tasked、affinity(亲和性)、clearOnBackground、intent、affinityIntent、origActivity、realActivity、numActivities、lastActiveTime、rootWasReset、stringName等属性构成。
(1)Task间移动配置android:allowTaskReparenting属性用来配置是否允许Activity从启动它的Task移动到和该Activity设置的Task亲和性相同的Task中,示例如下:<activity android:name="android.app.cts.ActivityManagerRecentOneActivity"android:label="ActivityManagerRecentOneActivity"android:allowTaskReparenting="true"android:taskAffinity="android.app.cts.recentOne"><intent-filter><action android:name="android.intent.action.MAIN" /></intent-filter></activity>(2)Task状态配置android:alwaysRetainTaskState属性用于配置是否保留Activity所在的Task状态,默认为“false”。
麦子学院Android开发教程布局属性解析
Android布局是开发中很重要的一部分,现在我们一起来学习下:第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中android:layout_centerVertical 垂直居中android:layout_centerInparent 相对于父元素完全居中android:layout_alignParentBottom 贴紧父元素的下边缘android:layout_alignParentLeft 贴紧父元素的左边缘android:layout_alignParentRight 贴紧父元素的右边缘android:layout_alignParentTop 贴紧父元素的上边缘android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物第二类:属性值必须为id的引用名“@+id/id_name”android:layout_below 在某元素的下方android:layout_above 在某元素的的上方android:layout_toLeftOf 在某元素的左边android:layout_toRightOf 在某元素的右边android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐第三类:属性值为具体的像素值,如30dip,40pxandroid:layout_marginBottom 离某元素底边缘的距离android:layout_marginLeft 离某元素左边缘的距离android:layout_marginRight 离某元素右边缘的距离android:layout_marginTop 离某元素上边缘的距离EditText的属性:android:hint 设置EditText为空时输入框内的提示信息。
Activity启动模式
Android启动模式分析
Android采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建一个Task,然后启动这个应用程序的入口Activity。我们可以把Task理解为Activity栈,Task以栈的形式来管理Activity:先启动的Activity被放在栈底,后启动Activity被放在栈顶。那么,Activity的加载模式,就负责管理实例化、加载Activity的方式、并可以控制Activity与Task之间的加载关系。为此,Activity共提供了四种加载模式:
采用这种加载模式的Activity在同一个Task内只有一个实例,当系统的采用singleTask模式启动Activity时,可以分为如下三种情况:
? 如果将要启动的目标Activity还没有没实例化,系统将会创建目标Activity的实例,并将他们加入Task栈顶。
? 如果将要启动的目标Activity已经位于Task栈顶,此时与singleTop模式的行为相同。
standard:标准模式,这是默认的加载模式
通过这种模式来启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将Activity加载到Task栈中-------这种模式不会创建新的Task,新Activity将会被添加到原有的Task中。当用户点击“返回”键时,系统将会“逐一”从Activity栈顶删除Activity实例。总体来说,这种加载模式就用了一个Activity栈。
? 如果将要启动的目标Activity不存在,系统会创建一个全新的Task、再创建目标Activity实例,并将它加入新的Task的栈顶。
麦子学院Android开发教程动态载入自定义类
普通的Android程序Dalvik虚拟机都是从一个默认的地方载入程序需要的类文件(dex文件),而Dalvik虚拟机还提供了从其他地方载入类的能力(比如从设备的内部存储空间以及互联网).这种自定义类加载机制可以使用于一些场景:∙dex文件只能包含最多64K的函数引用,对于大型的程序如果超过了该数字,就可以通过把程序打包为多个dex文件来实现,在程序运行的时候在加载这些需要的类∙一些开发框架可以通过运行时自定义类加载机制来设计出更加可扩展的框架∙通过该方式实现更加强壮的程序注册机制,防止被人破解Android有个示例项目演示了如何使用, 项目地址/p/android-custom-class-loading-sample/要使用该示例,不能使用Eclipse插件ADT来打包必需通过该项目提供的Ant脚本, 另外该Ant脚本需要Android SDK 12版本, 可以通过Android SDK Manager来下载或者到如下地址下载,然后解压到对应的目录中https:///android/repository/tools_r12-windows.ziphttps:///android/repository/platform-tools_r06-windows.zip在示例中有3个类文件:∙com.example.dex.MainActivity: UI界面,在这个类中动态载入需要的类∙com.example.dex.LibraryInterface: 动态载入类的接口定义∙com.example.dex.lib.LibraryProvider: 动态载入类的实现,该类在打包的时候会打包到另外一个dex文件中在打包的时候需要修改项目目录下的local.properties文件,把sdk.dir的值修改为对应的android SDK目录.例如:sdk.dir=E:\\google\\android-sdk-windows另外不要忘记在default.properties中指定需要的android平台: 例如 target=android-9然后就可以执行android install来build并且安装到模拟器或者手机上了.载入自定义类的过程1.获取需要载入的自定义类的dex文件,可以是设备本地的文件或者互联网上的文件2.把获取到的自定义类dex文件保存到程序的内部储存空间中:newFile(getDir(“dex”, Context.MODE_PRIVATE),SECONDARY_DEX_NAME);3.通过DexClassLoader类加载器来解析优化前面的dex文件4.通过DexClassLoader的loadClass函数来载入类5.通过获得到的类的newInstance函数来生成需要的对象6.开始使用获取到的动态类对象~\(≧▽≦)/~啦啦啦Android提供的示例项目中,通过Ant打包后把com.example.dex.lib.LibraryProvider类放入了程序的assets文件夹中,然后从这里读取需要动态载入的类. 为了演示从互联网载入类和使用Eclipse ADT插件来build该示例,我们对该项目做了简单修改,修改后的示例项目地址:/p/goodev-demo 中的android-custom-class-loading-goodev-demo在该示例中删除了com.example.dex.lib.LibraryProvider类,我们把该类打包为dex文件并且放入到了互联网上下载地址: /and/secondary_dex.jar在程序运行的时候先从该地址下载需要的类文件,然后解析.详细情况请参考项目中的代码注释修改后的项目可以通过Eclipse ADT来build.如需了解更多相关知识,请至麦子学院官网查询(/)。
activity四种加载模式
android中activity的四种加载模式一、何为加载模式在android的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不是生成大量的重复的activity。
加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。
二、加载模式有哪些以及如何配置1、在android里面,activity有四种加载模式:standard, singleTop, singleTask,singleInstance 。
详细介绍在后面。
2、配置方法直接修改AndroidManifest.xml文件,如要给一个名为Act1的activity指定其加载模式为singleTask,只需添加以下语句:<activity android:name="Act1" android:launchMode="singleTask"></activity>三、四种加载模式介绍1、standard :系统的默认模式,一次跳转即会生成一个新的实例。
假设有一个activity命名为Act1,执行语句:startActivity(new Intent(Act1.this, Act1.class));后Act1将跳转到另外一个Act1,也就是现在的栈里面有Act1 的两个实例。
按返回键后你会发现仍然是在Act1(第一个)里面。
2、singleT op:singleT op 跟standard 模式比较类似。
唯一的区别就是,当跳转的对象是位于栈顶的activity(应该可以理解为用户眼前所看到的activity)时,程序将不会生成一个新的activity实例,而是直接跳到现存于栈顶的那个activity实例。
拿上面的例子来说,当Act1 为singleTop 模式时,执行跳转后栈里面依旧只有一个实例,如果现在按返回键程序将直接退出。
麦子学院Android开发教程启动页面及后台初始化
Android启动界面的主要功能就是显示一幅启动图像, 后台进行系统初始化。
如果是第一次使用本程序,需要初始化本程序的sqlite数据库,建库,建Table,初始化账目数据。
如果不是第一次使用,就进入登记收支记录界面。
界面主要为分imageview 和textview。
如果想要2个view 垂直居中显示,可以使用RelativeLayout 搞定。
界面的具体xml如下:java代码:1.<?xml version=”1.0″ encoding=”utf-8″?>2.<RelativeLayout android:id=”@+id/RelativeLayout01″3.xmlns:android=”/apk/res/android”4.android:layout_gravity=”center_vertical|center_horizontal”5.android:layout_height=”wrap_content”6.android:layout_width=”wrap_content”>7.<ImageView android:id=”@+id/ImageView01″8.android:src=”@drawable/logo3″9.android:layout_width=”wrap_content”10.android:layout_height=”wrap_content”>11.</ImageView>12.<TextView android:id=”@+id/TextView01″13.android:text=”@string/welcome”14.android:layout_below=”@id/ImageView01″15.android:layout_width=”wrap_content”16.android:layout_height=”wrap_content”>17.</TextView>18.</RelativeLayout>关于如何另开一个线程更新界面的相关代码如下.java代码:1.//给主线程发送消息更新imageview2.mHandler = new Handler() {3.4.@Override5.public void handleMessage(Message msg) {6.super.handleMessage(msg);7.imageview.setAlpha(alpha);8.imageview.invalidate();9.}10.};11.12.new Thread(new Runnable() {13.public void run() {14.while (b < 2) {15.try {16.//延时2秒后,每50毫秒更新一次imageview17.if (b == 0) {18.Thread.sleep(2000);19. b = 1;20.} else {21.Thread.sleep(50);22.}23.updateApp();24.25.} catch (InterruptedException e) {26. e.printStackTrace();27.}28.}29.30.}31.}).start();32.33.public void updateApp() {34.alpha -= 5;//每次减少alpha 535.if (alpha <= 0) {36.ib = 2;37.Intent in = new Intent(this, com.cola.ui.Frm_Addbills.class);38.startActivity(in);//启动下个界面39.}40.mHandler.sendMessage(mHandler.obtainMessage());41.}如需了解更多相关知识,请至麦子学院官网查询(/)。
activity的四种加载模式
一个Activty的生命周期Activty的生命周期的也就是它所在进程的生命周期。
每一个活动(Activity )都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。
但是当一个活动的状态发生改变的时候,开发者可以通过调用onXX() 的方法获取到相关的通知信息。
在实现Activity 类的时候,通过覆盖(override )这些方法即可在你需要处理的时候来调用。
•onCreate :当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。
onCreate 方法有一个参数,该参数可以为空(null ),也可以是之前调用onSaveInstanceState ()方法保存的状态信息。
•onStart :该方法的触发表示所属活动将被展现给用户。
•onResume :当一个活动和用户发生交互的时候,触发该方法。
•onPause :当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。
这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。
•onStop :当一个活动不再需要展示给用户的时候,触发该方法。
如果内存紧张,系统会直接结束这个活动,而不会触发onStop 方法。
所以保存状态信息是应该在onPause时做,而不是onStop时做。
活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。
因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。
在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。
•onRestart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。
•onDestroy :当活动销毁的时候,触发该方法。
和onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。
•onSaveInstanceState :系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。
麦子学院Android开发教程应用程序权限详解
Android应用程序在使用很多功能的时候必须在Mainifest.xml中声明所需的权限,否则无法运行。
下面是一个Mainifest.xml文件的例子:Java代码1.<?xml version="1.0" encoding="utf-8"?>2.3.<manifest xmlns:android="/apk/res/android"4.5. package="hi.braincol.local.filebrowser"6.7. android:versionCode="1"8.9. android:versionName="1.0.0">10.11. <application android:icon="@drawable/icon"android:label="@string/app_name">12.13. <activity android:name=".FileBrowser"14.15. android:label="@string/app_name">16.17. <intent-filter>18.19. <action android:name="android.intent.action.MAIN" />20.21. <category android:name="UNCHER" />22.23. </intent-filter>24.25. </activity>26.27. </application>28.29. <uses-permissionandroid:name="android.permission.ACCESS_SURFACE_FLINGER"/>30.31. <uses-permission android:name="android.permission.VIBRATE"/>32.33.</manifest>复制代码上面xml文件中的:就是允许应用程序使用SurfaceFlinger的底层属性。
Android学习之Activity属性设置
Activity是Android组件中最基本也是最为常见用的四大组件之一,在android开发中,运用极为广泛,作为初学者需要熟练掌握,下例为Activity属性常用设置。
android:allowTaskReparenting是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务。
android:alwaysRetainTaskState是否保留状态不变,比如切换回home, 再从新打开, activity处于最后的状态android:clearTaskOnLanunch比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 从新启动 P,是否显示 Qandroid:configChanges当配置list发生修改时,是否调用 onConfigurationChanged() 方法比如"locale|navigation|orientation".android:enabledactivity 是否可以被实例化,android:excludeFromRecents是否可被显示在最近打开的activity列表里android:exported是否允许activity被其它程序调用android:finishOnTaskLaunch是否关闭已打开的activity当用户重新启动这个任务的时候android.iconandroid:labelandroid:launchModeactivity启动方式, "standard" "singleTop" "singleTask" "singleInstance"其中前两个为一组,后两个为一组android:multiprocess允许多进程android:nameactivity的类名,必须指定androidnHistory是否需要移除这个activity当用户切换到其他屏幕时。
android Activity四种加载模式深入分析
Activity的四种加载模式221阅读|5评论楼主杨濮源2011-03-08 01:32在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。
可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。
这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。
加载模式分类及在哪里配置Activity有四种加载模式:standardsingleTopsingleTasksingleInstance设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:<activity android:name="ActB"android:launchMode="singleTask"></activity>也可以在Eclipse ADT中图形界面中编辑:区分Activity的加载模式,通过示例一目了然。
这里编写了一个Activity A(ActA)和Activity B(ActB)循环跳转的例子。
对加载模式修改和代码做稍微改动,就可以说明四种模式的区别。
standard首先说standard模式,也就是默认模式,不需要配置launchMode。
先只写一个名为ActA的Activity:package com.easymorse.activities;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class ActA extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView textView = new TextView(this);textView.setText(this + "");Button button = new Button(this);button.setText("go actA");button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setClass(ActA.this, ActA.class);startActivity(intent);}});LinearLayout layout = new LinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);layout.addView(textView);layout.addView(button);this.setContentView(layout);}}例子中都没有用layout,免得看着罗嗦。
麦子学院Android开发教程核心模块详解
Android操作系统作为一个开源的操作平台,其软件层次结构包括了一个操作系统(OS),中间件(MiddleWare)和应用程序(Application)。
根据Android的软件框图,其软件层次结构自下而上分为以下几个层次:第一、操作系统层(OS)第二、各种库(Libraries)和Android 运行环境(RunTime)第三、应用程序框架(Application Framework)第四、应用程序(Application)以下分别介绍Andoid各个层次的软件的重点及其相关技术:操作系统层(OS)Android使用Linux2.6作为操作系统,Linux2.6是一种标准的技术,Linux也是一个开放的操作系统。
Android对操作系统的使用包括核心和驱动程序两部分,Android的Linux核心为标准的Linux2.6内核,Android更多的是需要一些与移动设备相关的驱动程序。
主要的驱动如下所示:显示驱动(Display Driver):常用基于Linux的帧缓冲(Frame. Buffer)驱动。
Flash内存驱动(Flash Memory Driver)照相机驱动(Camera Driver):常用基于Linux的v4l(Video for )驱动。
音频驱动(Audio Driver):常用基于ALSA(Advanced Linux Sound Architecture,高级Linux声音体系)驱动。
WiFi驱动(Camera Driver):基于IEEE 802.11标准的驱动程序键盘驱动(KeyBoard Driver)蓝牙驱动(Bluetooth Driver)Binder IPC驱动: Andoid一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能。
Power Management(能源管理)各种库(Libraries)和Android 运行环境(RunTime)本层次对应一般嵌入式系统,相当于中间件层次。
Android系统中Activity的四种加载模式
Android系统中Activity的四种加载模式作者:江帆来源:《科技资讯》2017年第08期摘要:在Android系统中,Activity(即活动)是应用程序的重要组成单元之一。
Activity 与Service,BroadcastReceiver和ContentProvider并称为Android系统的四大组件。
在实际的Android应用程序中,一个Android软件往往包含多个Activity,每个Activity呈现不同的操作界面,因此,掌握Android系统中各界面之间的活动模式是非常必要的。
该文详细阐述了Android系统中Activity的四种加载模式。
关键词:Activity 加载模式栈中图分类号:TP391.9 文献标识码:A 文章编号:1672-3791(2017)03(b)-0031-02在编写Android应用程序的过程中,配置Activity时需要指定lauchMode属性,这个属性就是用于配置该Activity的加载模式。
该属性支持4个属性值[1],标准模式、栈顶单例模式、任务内部单例模式和单实例加载模式。
在Android系统中,使用任务栈来管理多个Activity,当系统启动一个新的应用程序时,Android系统就会为之创建一个任务栈[2],先启动的Activity放在栈的底部,后启动的Activity 放在栈的顶部,然后加载这个应用的入口Activity,这个入口Activity就是我们首先看到的应用程序界面。
因此,Activity不同的加载模式,就负责控制Activity与任务栈之间的加载关系,并管理实例化、加载Activity的方式。
下面,详细介绍这4种加载模式。
1 Activity的四种加载模式1.1 standard模式standard模式是Android系统内置的标准模式,当Android系统使用这种模式启动目标Activity时,会为此Activity创建一个新的实例,并将此Activity添加到当前的任务栈中。
Android系统编程入门系列之加载界面Activity
Android系统编程⼊门系列之加载界⾯Activity上回说到及其⽣命周期,在Android系统调⽤Applicaiton.onCreate()之后,继续创建并加载清单⽂件中注册的⾸个界⾯即主Activity,也可称之为⼊⼝界⾯。
主Activity的确定规则在有介绍,本⽂主要介绍Android系统创建Activity之后的⽣命周期流程。
在清单⽂件中所注册的界⾯均为⾃定义Activity,其⽗类往上追溯,必须继承⾃。
⽣命周期Activity作为四⼤组件之⾸,主要负责与系统使⽤者的可视化交互响应。
只有深刻掌握Activity的⽣命周期及相关概念,才能在开发设计时游刃有余。
注意,这⾥的⽣命周期介绍,与定义有所区别,本⽂中的范围更加宽泛。
Android组件的⽣命周期,均是由Android系统主线程调⽤,如果在调⽤的⽣命周期⽅法内出现耗时操作,将会导致后续的⽣命周期⽅法⽆法被及时调⽤,反应到交互界⾯上就是应⽤程序卡顿甚⾄操作⽆响应。
为了防⽌这种情况的发⽣,Android系统定义当应⽤程序超时⽆响应时间超过⼀定时长(界⾯Activity默认5秒),会触发,同时界⾯弹出提⽰对话框,以供⽤户选择退出停⽌响应或继续等待。
所以在⽣命周期⽅法内不允许耗时操作。
(调⽤构造⽅法)启动实例化界⾯Activity的启动需要通过意图来操作,意图的创建分显⽰意图和隐⽰意图两种类型。
顾名思义,显⽰意图要指定Activity的具体包名和类名,⽽隐⽰意图只需要指定Activity在清单⽂件中注册时所嵌⼊的action和category标签信息。
创建的意图作为参数才能启动界⾯Activity。
显⽰意图常⽤于当前应⽤内的界⾯Activity之间启动,⽽隐⽰意图多⽤于不同应⽤间的界⾯启动。
回想下,在⽂章中说到,主Activity的注册时,必须在其标签内部嵌⼊<intent-filter></intent-filter>标签,并在该标签内固定且唯⼀<action>和<category>标签的内容。
【麦子学院】Android框架层详解
【麦子学院】Android框架层详解Android系统架构包括应用层、框架层、硬件抽象层等,但其中最核心、最重要的还是框架层,这个层级是Android系统设计思想集中体现的部分,提供了大量的 API 供开发者调用,而弄清楚这些 API 的具体功能和用法则是 Android 应用程序开发过程中最为重要的环节。
框架层不只是应用程序开发的基础,也是软件复用的重要手段,任何一个应用程序都可以发布它的功能模块——只要发布时遵守了框架层的约定,那么其他的应用程序也可以使用这个模块。
框架层由多个系统服务(System Service)组成,包括组件管理服务、窗口管理服务、地理信息服务、电源管理服务、通话管理服务等。
所有的系统服务都寄宿在系统核心进程(System Core Process)中,在运行时,每个服务都占据一个独立的进程,彼此之间通过进程间通信机制(IPC,Inter-Process Communication)发送消息以及传输数据。
对于开发者而言,最为直观的框架层体现就是 Android SDK,它通过一系列的 Java 功能模块来实现应用所需要的可复用的组件,提供了应用开发的规范,屏蔽了应用层与底层交互的复杂性。
框架层的设计决定了上层应用程序的开发模式、开发效率以及能够实现的功能范畴。
从系统运行的角度来看,Android 期望框架层是所有应用程序运行的核心,参与到应用层的每一次操作中,并进行全局统筹。
Android 应用的最大特征是基于组件的设计方式,每个应用程序都由若干个组件构成,组件与组件之间通过框架层的系统服务集中的调度和传递信息。
框架层主要是使用 Java 和 JNI 实现的,位于该层的主要组件如下:视图系统(View System)提供了可扩展的用于构建应用程序UI 的控件,包括ListView 、GridView 、 TextView 、 Button 、 WebView 等。
内容提供器(Content Provider)提供应用程序之间数据共享的接口。
麦子学院Android开发教程命令行方式编译应用
IT在线教育平台———麦子学院:在android开发中,初学者一般都是用Eclipse IDE去编译Android程序,其实不用Eclipse IDE编译也是可行的,而且速度会更快。
我们都知道Google官方提供的Android开发环境是Eclipse,仅仅给出了ADT插件。
但是在Android SDK Tool文件夹中我们可以找到一个名为activityCreator.bat的批处理文件,它调用的是tools\lib \activityCreator文件夹中的activityCreator.exe程序,其实为一个Python语言解释程序。
activityCreator的Activity创建脚本全部参数使用方法如下:1.Activity Creator Script2.age:4.activityCreator [--out outdir] [--ide intellij] .ActivityName5.6.Creates the structure of a minimal Android application.7.The following will be created:8.- AndroidManifest.xml: The application manifest file.9.- build.xml: An Ant script to build/package the application.10.- res : The resource directory.11.- src : The source directory.12.- src/your/package/name/ActivityName.java the Activity java class.packageName13.is a fully qualified java Package in the format <package1>.<package2>…(with14.at least two components).15.- bin : The output folder for the build script.16.17.Options:18.–out <folder>: specifies where to create the files/folders.19.–ide intellij: creates project files for IntelliJ复制代码比如:定位目录到Android SDK的Tools目录中,执行activityCreator -out ReleaseDir net.oschina.android.www其中 -out参数为设置输出文件夹为ReleaseDir,而最后的 net.oschina.android.www 为我们的Package包名称。
activity task
activity task什么是Android Application?简单来说,一个apk文件就是一个Application。
任何一个Android Application基本上是由一些Activities组成,当用户与应用程序交互时其所包含的部分Activities 具有紧密的逻辑关系,或者各自独立处理不同的响应。
这些Activities捆绑在一起成为了一个处理特定需求的Application, 并且以“.apk”作为后缀名存在于文件系统中。
Android平台默认下的应用程序例如:Email、Calendar、Browser、Maps、Text Message、Contacts、Camera 和Dialer等都是一个个独立的Apps。
安装Application的过程也可以简单理解为将其所包裹的Activities导入到当前的系统中,如果系统中已经存在了相同的Activities,那么将会自动将其关联,而不会重复安装相同的Activities,避免资源的浪费。
Application卸载的过程也会检查当前所关联的Activities是否有被其它Application标签所关联,如果仅仅是提供当前的Application使用,那么将会彻底被移除,相反则不做任何操作。
就像我们已经知道的,Application基本上是由四个模块组成:Activity、Service、Content Provider 和Broadcast Receiver,其中Activity是实现应用的主体。
什么是Activity Stack?操作应用程序时,有时需要调用多个Activities来完成需求,例如:发送邮件程序,首先是进入邮件主界面,然后启动一个新的Activity用于填写新邮件内容,同时可以调出联系人列表用于插入收件人信息等等。
在这个操作过程中Android平台有一个专门用于管理Activities堆栈的机制,其可以方便的线性记录Activities实例,当完成某个操作时,可以通过导航功能返回之前的Activity(通过按操作台的“Back”按钮)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Activity的加载分为四种不同加载模式,灵活的使用合适的加载模式,可以避免产生
大量的重复的Activity,从而优化性能,减少系统资源消耗。
四种加载模式具体为:
standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。
singleTop: 检查是否已经存在了一个实例位于Activity Stack的顶部,如果存在就不产生新的实例,反之则调用Activity的newInstance()方法产生一个新实例。
singleTask: 在一个新的Task中产生这个实例,以后每次调用都会使用此实例,而避免产生新的实例。
singleInstance: 这个基本上跟singleTask一样,只是有一点不同,那就是在这个模
式下的Activity实例所处的Task中,只能有这一个Activity实例,而不能有其他的实例。
这些启动模式可以Android清单文件AndroidManifest.xml中,通过<activity>中
的launchMode属性进行设置,如:
AndroidManifest.xml
<activity android:name="MainActivity" android:launchMode="singleTop">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
另外也可以在代码中通过一些标志进行设置。
如:
Java Code
1 Intent intent = new Intent(SrcActivity.this, TargetActivity.class);
2 intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
3 startActivity(intent);
四种加载模式的区别如下:
一、所属Task的区别:
一般情况下,,“standard”和”singleTop”两种加载模式源Activity(即new
Intent(arg0,arg1)中的第一个参数)和目标Activity(即new Intent(arg0,arg1)中的第二个参数)在同一个Task内,除非Intent包括了参数FLAG_ACTIVITY_NEW_TASK,如包含了
此参数,目标Activity会起动到新的Task里;
“singleTask”和“singleInstance” 总是把目标Activity作为一个Task的根元素,他们不会被启动到一个其他Task里。
二、是否允许多个实例的区别:
standard”和”singleTop”可以允许有多个实例,并且可以位于不同的Task中;
singleTop要求如果Activity Stack顶部已经有目标Activity实例,则直接讲Intent
发送给该实例,而不创建新实例。
如Activity Stack没有该实例,则创建新实例;
“singleTask”和”singleInstance”则只产生一个实例,并且是Task的根元素。
“standard”和”singleTop”可以被实例化多次,并且是可以存在于不同的task中;这
种实例化时一个task可以包括一个activity的多个实例;“singleTask”
和”singleInstance”则限制只生成一个实例,并且是task的根元素。
三、是否允许其他Activity存在于本Task内的区别:
“singleInstance”独占一个Task,其他Activity均不能存在于此Task中,如果它
启动一个新的Activity,不管新的Activity的launch mode如何,新的Activity都将运
行于其他Task里;
另外三种模式则可以和其他Activity共存。
四、是否每次都生成新实例的区别:
“standar”模式每次都生成一个新的Activity实例;
“singleTop”的Activity如果在Task的Activity Stack顶部则不生成新实例,直接使用此实例,否则生成一个新实例。
“singleeInstance”是其所在Task的Activity Stack里的唯一Activity实例,它每
次都会被重用。
“singleTask”如果在Task的Activity Stack的顶部,则接收intent,否则该intent会被丢弃,但仍然会该Task返回前台。
如需了解更多相关知识,请至麦子学院官网查询(/)。