Android平台架构及特性hanease

Android系统的底层是建立在Linux系统之上,改平台由操作系统、中间件、用户界面和应用软件四层组成,它采用一种被称为软件叠层(SoftwareStack)的方式进行构建。

好处:这种软件叠层结构使得层与层互相分离,明确各层的分工,这种分工保证了层与层之间的低耦合,当下层内或者层下发生改变时,上层应用程序无需任何改变。

下图显示Android系统的体系结构:

1.应用程序层(Application)

2.应用程序架构层(ApplicationFramework)

应用程序框架层是我们从事Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能的,该层简化了组件的重用,开发人员可以直接使用其提供的组件来进行快速的应用程序开发,也可以通过继承而实现个性化的拓展。Android应用程序框架提供了大量的API供开发者使用。

a)ActivityManager(活动管理器)

管理各个应用程序生命周期以及通常的导航回退功能

b)WindowManager(窗口管理器)

管理所有的窗口程序

c)ContentProvider(内容提供器)

d)ViewSystem(视图系统)

构建应用程序的基本组件

e)NotificationManager(通告管理器)

使得应用程序可以在状态栏中显示自定义的提示信息

f)PackageManager(包管理器)

Android系统内的程序管理

管理所有的移动设备功能

h)ResourceManager(资源管理器)

提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等

i)LocationManager(位置管理器)

提供位置服务

j)XMPPService(XMPP服务)

提供GoogleTalk服务

3.系统运行库层:

1)函数库(Libraries)

函数是应用程序框架的支撑,是连接应用程序框架层与Linux内核层的重要纽带。一般来说,Android应用开发者不能直接调用这套C/C++库集,但可以通过上面的应用程序框架来调用这些库。

下面列出一些核心库:

a)系统C库(Libc):

从BSD继承来的标准C系统函数库,专门为基于embeddedlinux的设备定制。

b)SurfaceManager:

执行多个应用程序时候,负责管理显示与存取操作间的互动,另外也负责2D绘图与3D绘图进行显示合成.

c)SGL

底层的2D图形渲染引擎

d)SSL

在Andorid上通信过程中实现握手

e)MediaFramework

多媒体库,基于PacketVideoOpenCore;支持多种常用的音频、视频格式录制和回放,编码格式包括MPEG4、MP3、H.264、AAC、ARM。

f)WebKit:

一套网页浏览器的软件引擎

g)OpenGL|ES:

根据OpenGLES1.0API标准实现的3D绘图函数库

h)SQLite:

小型的关系型数据库引擎

2)Android运行时(AndroidRuntime):

Android应用程序时采用Java语言编写,程序在Android运行时中执行,其运行时分为核心库和Dalvik虚拟机两部分。

@核心库

核心库提供了Java语言API中的大多数功能,同时也包含了Android的一些核心API,如android.os、android.net、android.media等等。

@Dalvik虚拟机

Dalvik虚拟机非常适合在移动终端上使用,相对于在PC或者服务器上运行的虚拟机而言,Dalvik虚拟机不需要很快的CPU计算速度和大量的内存空间,它主要有以下两个特点:

(1)运行专有的.dex文件。

专有的.dex文件减少了.class文件中的冗余信息,而且会把.class文件整合到一个文件中,从而提高了运行性能;而且DX工具还会对.dex文件进行一些性能上的优化。

(2)基于寄存器实现.

大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。一般来说基于寄存器的虚拟机具有更好的性能表现,但在硬件通用性上略差。

JVM和Dalvik的区别:由于Android应用程序的编写语言是java,因此有人会把它们搞混。但实际上Dalvik并未遵守JVM规范,两者也不兼容。

JVM运行的是java字节码(通常就是.class文件),但Dalvik运行的是其专有的dex(DalvikExecutable)文件。

JVM直接从.class文件或者JAR包中加载字节码后运行;而Dalvik则无法直接从.class文件或者JAR包中加载字节码,他需要将应用程序的所有的.class文件编译成.dex文件,Dalvik则运行该.dex文件。

2.Linux内核(Linuxkernel)

Android系统建立在Linux2.6之上,Linux内核提供了安全性、内存管理、进程管理、网络协议栈和驱动模型等核心系统业务,除此之外,Linux内核也是系统硬件和软件叠层之间的抽象层。

Activity和Servlet一样,都用了回调机制。我们通过类比servlet来学习Activity。当一个servlet开发出来之后,该servlet运行于Web服务器中。服务器何时创建servlet的实例,何时调用servlet的方法向用户生成响应,程序员无法控制,这种回调由服务器自行决定。Activity也一样,被开发出来,开发者只要在AndroidManifest.xml文件配置该Activity即可。至于该Activity何时被实例化,它的方法何时被调用,对开发者来说完全是透明的。

当开发者开发一个Servlet时,根据不同的需求场景,可能需要选择性的的实现如下方法:

Android的生命周期:当activity处于Android的应用中的运行时,它的活动状态由Android运行时以Activity栈的形式管理。当前活动的Activity位于栈顶。

Android的生命周期演示:android大致经过如下四个状态:

下面是官方API所提供的生命周期图:

下面使用代码亲自测下Android的生命周期,测完就明白了:

Back键:当我们按返回键的时候这个应用程序或者Activity将结束,依次回调了OnPause()-->onStop()-->Ondestroy()方法:在LogCat窗口可以看到:

HOME键:当我们正在打游戏的时候,突然来了条短信,我们想看短息,按HOME键,然后打开短信的应用,当我们按HOME键的时候Activity先后执行了OnPause()-->OnStop方法,在LogCat窗口可以看到:

而我们看完短息在启动应用的时候:会执行OnRestart()-->onStart-->OnResume方法。在LogCat窗口可以看到:

通过上面的操作,想必我们都对AndroidActivity生命周期有了深刻的了解,我们就可以在开发Activity的时候,选择性的重写生命周期的方法来解决业务上的一些需求。

例如:下面的这个例子,当我们在看视屏的时候,或者在注册的时候,刚好填完用户的注册信息,不小心按到了Home键,当我们在进入应用程序的时候,发现之前填的注册信息全没了,这时候我们就要哭了,说明这个应用程序做的比较垃圾。正常情况下,我们之前填写的注册信息还在,也就是说和我们按Home键之前的状态是一致的。

为了理解,我们用一个小例子说明问题:

在XML代码代码中增加EditText:

然后按HOME键,在次启动MainActivity,发现之前输入的内容没了。

这显然不是正常的应用程序,我们都会哭的。那么就需要我们队生命周期非常了解了,当我们按Home键的时候,Activity回调了onPause-->OnStop()方法,再次进入应用程序的时候回调了OnRestart-->OnStart-->onResume()方法,说明我们只要在onPause()和OnRestart方法里面做处理既可以保存之前的状态:下面看代码

总结:理解生命周期的关键是,我们可以在开发过程选择性的重写生命周期中的方法,解决一些实际问题,这才是关键,学以致用!

首先要明白一个概念:

Intent与PendingIntent的区别:

Intent:是意图,即告诉系统我要干什么,然后做Intent应该做的事,而intent是消息的内容

PendingIntent为Intent的包装,这里是启动Intent的描述,PendingIntent.getActivity返回的PendingIntent表示,此PendingIntent实例中的Intent是用于启动Activity的Intent。PendingIntent.getActivity的参数依次为:Context,发送者的请求码(可以填0),用于系统发送的Intent,标志位。

包装Intent,intent是我们直接使用startActivity,startService,senbBroadcast启动某项工作的内容,而某些时候我们并不能直接调用startActivity,startService,senbBroadcast,而是系统或者程序达到某一条件才发送intent,例如下面要学习的Notification,当用户点击Notification之后,由系统发出一条activity的intent。如果我们不用某种方法告诉系统的话,系统是不知道是使用startActivity(),startService还是senbBroadcast...来启动intent的,因此需要PendingIntent,对intent进行包装,调用getActivity()方法。

前面我们说过,NotificationManager是所有Notification的大管家,它的主要职责是加入/移除Notification。

通过获取系统服务来获取该对象:

NotificationManagermNotificationManager=(NotificationManager)getSystemServic(Context.NOTIFICATION_SERVICE);

常用方法:

publicvoidcancelAll()移除所有通知(只是针对当前Context下的Notification)

publicvoidcancel(intid)移除标记为id的通知(只是针对当前Context下的所有Notification)

publicvoidnotify(Stringtag,intid,Notificationnotification)将通知加入状态栏,标签为tag,标记为id

publicvoidnotify(intid,Notificationnotification)将通知加入状态栏,,标记为id

一般来说,一个Notification应该传送的消息包括:

1、一个状态条图标

2、在拉伸的状态栏窗口中显示额外的信息和启动一个Application的Intent

3、闪灯或LED

在状态栏(StatusBar)中,通知主要有两类(使用FLAG_标记,后面讲解到):

1、正在运行的事件

2、通知事件

常量:

//表示发送一个Notification的所携带的效果

DEFAULT_ALL使用默认字段

DEFAULT_LIGHTS默认闪光

DEFAULT_SOUND默认声音(uri,指向路径)

DEFAULT_VIRATE默认震动,后来得知需要添加震动权限VIBRATE:android.permission.VIBRATE

其中震动和闪光都需要在AndroidManifest.xml中添加权限

PS:以上的效果常量可以累加,即通过mNotifaction.defaults|=DEFAULT_SOUND(有些效果只能在真机上才有,比如震动)

//设置Flag位

FLAG_AUTO_CANCEL该通知能被状态栏的清除按钮给清除掉

FLAG_NO_CLEAR该通知不能被状态栏的清除按钮给清除掉

FLAG_ONGOING_EVENT通知放置在正在运行

常用字段

contentView通知在状态栏的显示View(自定义,具体请看下文),常与contentIntent配合使用,点击该通知后,

即触发contentIntent

contentIntent设置PendingIntent对象,点击该通知时发送该Intent

flags设置flag位,例如FLAG_NO_CLEAR等

defaults添加效果

tickerText显示在状态栏中的文字

icon设置图标

常用方法介绍:

voidsetLatestEventInfo(Contextcontext,CharSequencecontentTitle,CharSequencecontentText,PendingIntentcontentIntent)

功能:显示在拉伸状态栏中的Notification属性,点击后将发送PendingIntent对象。

参数:context上下文环境

contentTitle状态栏中的大标题

contentText状态栏中的小标题

contentIntent点击后将发送PendingIntent对象

另外的就是Notification的几步不同构造方法了,其构造方法的参数含义如上,请参考SDK。

第一种:使用默认的形式(效果图如上显示)。具体使用是为Notification对象设置setLatestEventInfo()方法(该方法内部创建

了默认的RemoteViews对象,因此为默认显示),否则程序会报异常;

第二种:使用自定义的View(RemoteViews对象)显示(功能更加自由,强大),具体方法为设置Notification对象的

contentView属性和contentIntent属性,此时不需要设置setLatestEventInfo()方法。具体使用方法如下:

第一种:例子:main.xml

Intent.FLAG_ACTIVITY_CLEAR_TOP:如果在当前Task中,有要启动的Activity,那么把该Acitivity之前的所有Activity都关掉,并把此Activity置前以避免创建Activity的实例

NotificationDemoActivity.java

别忘了添加震动的权限:

效果图:

第二种:自定义view

代码如下:

view.xml

java代码

NotificationRomoteViewActivity.java

1、熟练掌握基本控件以及容器控件的使用;

常用的基本控件有:Button、TextView、EditText、ListView等

常用的容器控件有:FrameLayout、LinearLayout、RelativeLayout等

常用监听器有:OnClickListener、OnLongClickListener、OnItemClickListener等

3、掌握Log的使用以及分析方法;

4、掌握Activity、Service的生命周期和使用方法;

5、掌握BroadcastReceiver(广播)的接受和使用;

6、掌握Intent以及IntentFilter的使用;

7、基本掌握数据库方面知识,包括SQLiteDatabase以及ContentProvider的使用方法

除此之外,我们必须得掌握adbshell的使用方法,常用功能有:

adbpull、adbpush、adbremount指令等

由于shell类同于Linuxshell,我们还得掌握基本的Linux指令等,例如cat、cd等。

知识获取渠道主要为:

AndroidSDK以及网上大牛的博客。

附:关于基础知识的介绍,国内的一些书籍质量真是相当差劲,味同嚼蜡。强烈不建议在此阶段买书籍。

这时,您已经小有所成了,能够基本掌握Android开发了。这儿,我推荐一个手把手讲解Android项目的视频:

zhengping老师讲解的,强烈推荐。

实践出真知。这个阶段,你可以自己编写一些小Demo了,帮助自己在更深层次发展了。

PS:我通过看了Mars老师视频后,编写了一个简易的音乐播放器Demo,感觉挺有成就感的。

通过前面的学习,我们可以成功进入第二个阶段了。

1、掌握Canvas类的使用--如何绘图

3、掌握Context类以及实现原理

4、掌握View树的绘制流程。View绘制流程很重要,掌握它就基本上掌握了Android核心之一了。

4.1、掌握触摸事件的分发流程---onInterceptTouchEvent以及onTouchEvent方法流程

4.3、能够编写自定义View以及ViewGroup

5、理解Binder机制----Binder机制很重要,Android的进程间通信都是靠它完成的。掌握它,才能够好的完成接下

来的学习。

6、基本掌握ActivityManagerService类的使用,主要掌握的知识点包括如下:

6.1、startActivity()流程,即启动一个Activity的流程;

6.2、startService()流程,即启动一个Service的流程;

7、基本掌握PackageManagerService类的使用,主要掌握的知识点包括如下:

7.1、开机时如何解析所有已安装应用程序的Apk包的信息

7.2、Intent以及IntentFilter的匹配规则以及解析过程

8、基本掌握View添加至窗口的过程---即WindowManagerIml、WindowManagerService类的用法

Android引进的Handler类,可以说是Runnable和Activity交互的桥梁,所有的UI线程要负责View的创建并且维护它,例如更新某个TextView显示的内容,都必须在主线程中去做,我们不能直接在UI线程中创建子线程,要利用消息机制:handler,如下就是handler的简单工作原理图:

下面是一个原理图:

UI线程中去创建子线程,要利用消息机制:handler,如下就是handler的简单工作原理图:

我们只要在run方法中发送Message,而在Handler里,通过不同的Message执行不同的任务。

packagecom.lp.ecjtu;importjava.util.Timer;importjava.util.TimerTask;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;publicclassHandlerTestActivityextendsActivity{//title为setTitle方法提供变量,这里为了方便我设置成了int型privateinttitle=0;privateHandlermhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){//TODO接收消息并且去更新UI线程上的控件内容switch(msg.what){case1:updateTitle();break;}}};@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);Timertimer=newTimer();timer.schedule(newMytask(),1,500);}privateclassMytaskextendsTimerTask{@Overridepublicvoidrun(){//子线程中通过handler发送消息给handler接收,由handler去更新titleMessagemsg=newMessage();msg.what=1;mhandler.sendMessage(msg);}}protectedvoidupdateTitle(){setTitle("welcometoecjtu:"+title);title++;}}

因为,我们当我们的主线程队列,如果处理一个消息超过5秒,android就会抛出一个ANP(无响应)的消息,所以,我们需要把一些要处理比较长的消息,放在一个单独线程里面处理,把处理以后的结果,返回给主线程运行,就需要用的Handler来进行线程建的通信,关系如下图;

下面介绍两种进度条分别是圆形进度条和长形进度条的代表:

下面我们看一下两都皆有之的Android自带的浏览器的效果图如下:

第一步:新建一个Android工程命名为ProgressBarDemo.

第二步:修改main.xml代码如下(圆形进度条和长形进度条这里样式不同用系统自带的):

第三步:修改ProgressBarDemo.java代码如下:

查看API文档:android.content.pm.ActivityInfo

在手机的使用中,我们要根据不同的需求来改变屏幕的显示方向,一般在浏览信息时是竖屏,在玩游戏的时候就要切换到横屏。在Android中要想完成屏幕方向的切换,需要Activity类的一些方法的支持。

如图:

下面是横竖屏测试的程序:

我们这里主要是运用了getRequestedOrientation(),和setRequestedorientation()两个方法.但是要利用这两个方法必须先在AndroidManiefst.xml设置一下屏幕方属性,不然程序将不能正常的工作.

Step1:我们建立一个Android工程,命名为ChangeScreemOrientationDemoActivity.

Step2:设计UI,打开main.xml,将其代码修改如下,我们这里只是增加了一个按钮,其他什么都没有动.

Step3:设计主程序ChangeScreemOrientationDemoActivity.java,修改其代码如下:

packagecom.lp.ecjtu;importandroid.app.Activity;importandroid.content.pm.ActivityInfo;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;publicclassChangeScreemOrientationDemoActivityextendsActivity{/**Calledwhentheactivityisfirstcreated.*/privateButtonpressBtn;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);pressBtn=(Button)findViewById(R.id.press);pressBtn.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstub//如果是竖屏,改为横屏if(getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);}//如果是横屏,改为竖屏elseif(getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}}});}}

Step4:在AndroidManifest.xml文件里设置默认方向,不然程序不能正常工作哦.代码如下:

现在我们上网几乎都会用百度或者谷歌搜索信息,当我们在输入框里输入一两个字后,就会自动提示我们想要的信息,这种效果在Android里是如何实现的呢事实上,Android的AutoCompleteTextViewWidget,只要搭配ArrayAdapter就能设计同类似Google搜索提示的效果.

本例子先在Layout当中布局一个AutoCompleteTextViewWidget,然后通过预先设置好的字符串数组,将此字符串数组放入ArrayAdapter,最后利用AutoCompleteTextView.setAdapter方法,就可以让AutoCompleteTextView具有自动提示的功能.例如,只要输入ab,就会自动带出包含ab的所有字符串列表.

packagecom.lp.ecjtu;importandroid.app.Activity;importandroid.os.Bundle;importandroid.widget.ArrayAdapter;importandroid.widget.AutoCompleteTextView;publicclassAutoCompleteTextViewActivityextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);//定义字符串数组,作为提示的文本String[]books=newString[]{"疯狂Java讲义","疯狂Ajax讲义","疯狂XML讲义","疯狂Workflow讲义"};super.onCreate(savedInstanceState);setContentView(R.layout.main);//创建一个ArrayAdapter,封装数组ArrayAdapteraa=newArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,books);//获得AutoCompleteTextView组件AutoCompleteTextViewactv=(AutoCompleteTextView)findViewById(R.id.auto);//设置Adapteractv.setAdapter(aa);}}

JAVA的安装与环境变量的配置

2、安装的时候,最好别改安装路径,默认路径一直点下一步即可!

3、安装完成后,接下来就是配置java环境变量了。

4、打开计算机属性,点击高级系统设置

5、选择“高级”-“环境变量”

二、关于JDK安装,以及Java环境的设置

1、下载JDK1.6,选择对应的安装路径

2、配置相应的Java环境变量

A、属性名称:JAVA_HOME

属性值:C:\ProgramFiles\Java\jdk1.6.0_02

B、属性名称:PATH

属性值:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

C、属性名称:CLASSPATH

属性值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

要加.表示当前路径,另外,%JAVA_HOME%就是引用前面指定的JAVA_HOME

6.关于环境变量是否安装成功的测试

“开始”->;“运行”,键入“cmd”;

键入命令命令,出现画面,说明环境变量配置成功:

A、java-version;

B、java;

C、javac;

=================华==丽==的==分==割==线======================

AndroidSDK的安装与环境变量配置

一、配置Andriod环境变量

2、默认路径安装后,安装完成,开始配置环境变量。

3、打开计算机属性——高级系统设置——环境变量(如上文)

4、新建一个环境变量,变量名:ANDROID_HOME,变量值:D:\ProgramFiles\android-sdk-windows(以你安装目录为准,确认里面有tools和add-ons等多个文件夹),点击确认。

5、在用户变量PATH后面加上变量值;%ANDROID_HOME%\platform-tools;点击确认即可。在系统变量path中添加;D:\ProgramFiles\android-sdk-windows\tools

6、AndroidSDK配置完成,接下来验证配置是否成功。

7、点击运行——输入cmd——回车——输入adb——回车,如果出现一堆英文,如下图所示,即表示配置成功,在输入Android,启动AndroidSDKManager。

二、下载和安装AndriodSDK

1.SDK下载

下载完成后,解压后得到android-sdk-windows文件夹,该文件夹包含如下文件结构:

(1)add-ons:该目录存放额外的附件软件。刚解压时该目录为空。

(2)platforms:该目录存放不同版本的Android版本。刚解压时该目录为空。

(3)tools:该目录存放大量的Android开发,调试工具

(4)SDKManager.exe:该程序就是AndriodSDK管理器。

(5)AVDManager.exe:该程序就是Andoid虚拟设备。

(6)docs:该文件夹存放了AndroidSDK开发文件和API文档等

(8)samples:该文件夹存放不同的Android平台和示例程序。

2.安装sdk开发使用的相应的包

运行之后安装了sdkmanager,然后sdkmanager启动后会去android仓库去取还未安装的包的信息,如下图(由于我的系统中已安装好,因此每个包前面都是绿色打勾的),为了偷懒,我直接就选择了acceptall,将所有的包安装上.其实,如果自己对android整个体系比较了解的话,可以选择只安装自己需要用到的部分.

三、在eclipes中配置和安装ADT(AndroidDevelopmentTools)

1.安装ADT

ADT是eclipse的一个插件,如同cdt和jdt一个道理.要开发android程序,至少要有个cde(集成开发环境).而android官方推荐的是eclipse.并且为eclipse下开发android准备了ADT这样一个插件.有了这个插件,就能比较方便的开发android程序了.

然后点击Help->InstallnewSoftware,在弹出的窗口中点击add按钮

name:AndroidADT或者其它任何名字。

然后点击:ok

2.配置ADT

点击eclipse菜单中的window,选择"Preferences...",在弹出窗口中选择androidsdk的安装位置:这里是D:\ProgramFiles\android-sdk-windows,配置如下图:

四.创建AVD(Android虚拟机)

在eclipse菜单点击window,选着AVDManager弹出:

然后点击new在弹出的AVD中填写虚拟机的名称name:Android2.2,选着Android平台的版本Target:Android2.2-APILevel8,设置虚拟的SD卡的大小,这里size是512MiB,可以设置弹出的虚拟器外观的大小:200*350

配置好后点击EditAVD,最后点击Start启动

五、在eclipes中开发第一个Android应用

大致需要如下3步:

(1)创建一个Android项目.

(2)在XML布局文件中定义应用程序的用户解界面

(3)在java代码中编写业务实现

详细步骤如下:

1.通过在Eclipes下面"File->AndroidProject"

点击next:

选着2.3.3在点击next:

点击Finish。

第一个项目创建成功。

2.在Android项目的layout目录下面有一个main.xml文件,该文件用于定义Android的用户界面:

main.xml:

说明UI组件上几个通用的属性:

android:id:该属性指定了该控件的唯一标识,在java程序中可以通过findViewById("id")来获取指定的Android界面组件。

android:layout_width:指定该组件的宽度。如果属性为fill_parent,说明该组件与父组件具有相同的宽度;如果属性为wrap_content,则说明该组件的高度取于它的内容——基本能包裹它的内容即可。

思考:为什么把用户界面放在XML文档中定义,这样可以让XML文档专门负责用户UI设置,而java程序专门负责业务实现,这样可以较低程序耦合性。大家要接受Android这种优秀的设计,其实这种思想在学习三大框架时候就接触过了。

3.Android项目的src目录是Android项目的源代码:

HelloWorldActivity.java:importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.TextView;publicclassHelloWorldActivityextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//设置使用main文件定义的布局setContentView(R.layout.main);//获取UI界面中ID为R.id.ok的按钮Buttonbn=(Button)findViewById(R.id.ok);//为按钮绑定一个单击事件的监听器bn.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//获取UI界面中ID为R.id.show的文本框finalTextViewshow=(TextView)findViewById(R.id.show);//改变文本框的内容show.setText("helloworld!");}});}上面这个程序只做了三件事情:

(1)设置该Activity使用main文件定义的界面布局作为用户界面。

(2)获取ID为R.id.ok的按钮

(3)为第二部获得的按钮绑定事件监听器--在事件监听器处理方法中改变ID为R.id.show的文本的内容。

THE END
1.面试技术点之安卓篇A HandSome Man: 这个写法有问题啊,首次点击直接是fasle flutter 自定义组件-抽奖大转盘 lostcixin: luck_util这个类文件能否也发一下? 最新文章 Android中Gradle常用配置 面试技术点之kotlin篇 面试技术点之flutter篇 2024年20篇 2023年1篇 2022年7篇 2021年26篇 2020年21篇 2019年15篇 2018年29篇 2017年https://blog.csdn.net/NotesChapter/article/details/144350679
2.Android和iOS平台特性mob64ca12f5c08e的技术博客Android与iOS平台特性分析 在移动应用开发的世界中,Android和iOS是两个主流的平台,它们各自有着独特的特性和优势。了解这些特性对于开发者而言至关重要,可以帮助他们在不同平台上更好地实现应用功能。 1. 平台架构 Android Android是一个开放源代码的平台,运行在Java虚拟机(JVM)上。它的应用是基于Android SDK开发的,https://blog.51cto.com/u_16213454/11873550
3.笔记(24)安卓各版本特性简述腾讯云开发者社区4.4 特性 1.webview与js交换可以使用@JavascriptInterface注释接口方法,通过webveiw向js中注入对象调用该方法,修复4.4以下安全漏洞风险 5.0 新特性—2014年(Lollipop) 1.全新的Material Design设计风格 2.支持64位ART虚拟机。 1.放弃了之前一直使用的Dalvik虚拟机,改用了ART虚拟机,实现了真正的跨平台编译。Android内存https://cloud.tencent.com/developer/article/2368979
4.什么是鸿蒙系统?一文快速了解鸿蒙系统基础知识2.鸿蒙系统与Android有何不同? 鸿蒙系统(HarmonyOS),由华为公司开发,是一种面向智能终端的分布式操作系统。而Android是由Google公司开发的一种基于Linux内核的开源移动操作系统。 1. 设计理念不同 鸿蒙系统:鸿蒙系统的设计理念是构建一个统一的、无缝的分布式操作系统。它支持多种设备之间的协同工作,并提供一致的用户https://www.eefocus.com/e/1593577.html
5.usdt钱包软件有哪些?十大usdt钱包app汇总交易平台区块链imToken冷钱包 v2.14.1 Android & Ios最新版 类型:银行金融 大小:46.18MB 语言:简体中文 时间:2024-02-04 查看详情 imToken钱包优势 多链钱包,轻松使用 一套助记词管理多链钱包,告别繁复备份 多链各有差异,支付体验同样流畅 代币兑换,安全快速 私钥自持,无需信任第三方即可完成操作 https://www.jb51.net/blockchain/877588.html
6.诸神皇冠国际服下载亡人节有三种祈祷,祈祷受伤角色痊愈,祈祷已婚人士生孩子,祈祷延寿,祈祷延寿暂时无用,其他两种成功率看脸。 亡人节可以通过拜神治愈伤痕(后天负面特性消除,先天负面不能消除),延长寿命(表现为不会衰老,但还是会退休),提高怀孕几率(先天绝育无法提高 ),一样要求在自家城堡神庙内修建相关神像 玩家热评 玩家1: https://shouyou.3dmgame.com/android/140612.html
7.文档中心以下为一些常见的技术问题解答及常见概念的理解,本文档将持续补充,对推送有疑问的开发者可以自行 Ctrl+F 搜索关键字找寻解答 一、概况问题 1. 如何申请接入? 感谢您选择小米推送,点此查看接入指南; 2. 小米推送收费吗? 小米推送的基础服务目前是免费的。 3. 小米推送目前支持哪些平台? 目前仅支持Android平台。https://dev.mi.com/console/doc/detail?pId=1292
8.vivo开放平台每次Android系统的升级,几乎都会在交互体验上带来一些新变化,此次Android 11也不例外。 例如: 2.2.1 聊天气泡 聊天气泡(chat bubbles)的会话方式正式推出,不再是实验性功能,该特性支持会话窗口最小化为一个或多个悬浮气泡,气泡可以展开为小窗口模式的页面; https://dev.vivo.com.cn/wap/documentCenter/doc/428
9.OPPO开放平台本文档基于谷歌Android 11 Developer Preview 4(DP4)版本的变更输出,后续Beta版如有新的变更和特性,我们会刷新文档的相关章节内容,请开发者持续关注。 一、兼容性调试工具 Android 11 引入了新的工具,用于针对最新版平台中的行为变更来测试和调试应用。这些工具属于新的兼容性框架的一部分,可让应用开发者单独开启和关https://open.oppomobile.com/new/developmentDoc/info?id=10724
10.ifanr访谈:友盟,不只是数据服务平台爱范儿核心业务:数据服务平台 ifanr:友盟主要的业务是在数据这一块,外界所了解的友盟,也是一个数据服务平台。有什么运营数据可以分享吗? 蒋凡:我们平台里现在有 2 万多款应用,每天活跃用户(DAU)在 4000 万左右。全球(有一些国外用户)覆盖了 1.6 亿部设备,国内占了 9000 万– 1 亿。Android 平台 6000 台设备,iOS https://www.ifanr.com/76731/
11.15款能够替代Notion的优秀软件(都有免费版)有很多优秀的产品都可以代替 Notion 来做笔记和做项目管理,而且这些替代产品的价格比 Notion 更加实惠。 神译局是36氪旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风向。 编者按:Notion 是一个公认的强大的笔记和项目管理平台,但功能的强大来自于极其复杂的定制,并不是所有人都https://36kr.com/p/2291085667260169
12.OSCHINA开源的 Linux 游戏平台「GitHub 热点速览」 977阅 告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐 569阅 云计算专区 169.6万人关注 Coolbpf 最新特性系列解读:eNetSTL 网络功能加速库在龙蜥社区开源 359阅 揭秘Zadig 多环境配置最佳实践 - Helm Chart 篇 https://www.oschina.net/