justfun

一.安卓第一天笔记

安卓基本介绍

1.安卓项目未编译前的项目的必须基本结构

HelloWorld
|——libs
|——res
|	|——drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi
|	|——layout
|	|——values
|
|——src
|	|——cn
|	|————itcast
|	|——————helloworld
|	
|——AndroidManifest.xml

2.对于R.java文件的理解

R.java文件可以理解为Android应用的资源字典
(1)每类资源都对应这R类中的一个内部类
(2)每个具体资源项都对应于内部类的一个public static final int类型的Field
注意:不要手动修改R.java文件的任意内容

3.对于res目录的理解

Android应用的res目录是一个特殊的文件夹,存放着Android应用的全部资源,是资源仓库。包括图片资源,字符资源,颜色资源,尺寸资源,样式资源等等,不同的资源放到res不同文件夹。Android按照约定对res进行扫描生成R.java文件。

4.在Java与XML中使用res资源仓库的资源,即资源引用

Java:AAPT为Android项目自动生成的R.java文件,每个资源项对应于各个资源内部类(不同种类资源生成各自的资源内部类),在Java代码中可通过[R.<资源的内部类名称>.<资源名称>]来获取对应的资源。如R.string.app_name引用到"HelloWorld"字符串常量。

XML:XML文件中使用资源更为简单,按照以下格式访问即可:[@<资源对应的内部类的类名>/<资源项的名称>],例如:引用常量"HelloWorld"字符串常量,我们可以这样书写:@string/app_name

5.重点:组件分配标识符

当在XML文件中想使用自定义的标识符时,这些标识符无须使用专门手段来进行定义,从而才能使XML文件与R.java文件获取到该标识符资源。只需要直接在XML文档中按照如下格式分配标识符即可:

      @+id/<标识符的代号>    例如,在XML文件中可以使用如下代码为一个组件分配一个特定的标识符:android:id="@+id/ok"

分配完组件标识符后,使用该标识符有两种方法,XML与Java获取,

在XML文件上获取该组件,可通过xml资源引用的方式来引用它,格式为:@id/<标识符代号>   例如,"@id/ok"

在Java的代码中获取该组件,可以通过调用Activity中的findViewById()方法来进行获取组件即可,如Button btn = (Button)this.findViewById(R.id.ok);

6.AndroidManifest.xml文件的理解

AndroidManifest.xml清单文件是每个Android项目必需的,它属于整个项目应用的的全局描述文件。

通常包含如下信息:

1.应用程序包名,该包名将会作为该应用的唯一标识(非常重要),对外的显示名称可以重复,但包名是不能重复。

2.应用程序所包含的应用框架的四大组件详细信息,如Activity,Service,BroadcastReceiver,ContentProvider等。

3.应用程序最低兼容版本,编译的目标版本

4.应用程序使用系统所需的权限声明,如打电话,发短信等都是需要获得用户给予的权限才能使用。

5.其他程序访问该程序所需要的权限声明。

7.应用程序权限的说明

      一个Android应用可能需要权限才能调用Android系统的功能,同样一个Android程序也可能被别人所调用,因此它同样需要声明调用自身所需要的权限。

1.声明运行应用本身所需要的权限

通过在AndroidManifest.xml的<manifest.../>元素添加<uses-permission../>子元素即可为程序本身添加权限声明

例如:添加打电话声明:

2.声明调用该应用所需要的权限

需要通过为应用的各个组件元素,如<activity../>添加<uses-permission../>子元素即可声明其他程序调用改程序所需要的权限。

例如:在<activity../>的组件元素中添加发送短信的权限:

8.查询程序权限的方法

通过SDK的docs下index.html网页,点击进入API,点击android包,查看Manifest.permission类即可,里面有全部有关用户权限的所有内容。

安卓四大组件基本理解

1.Activity和View

Activity是Android应用中负责与用户交互的组件,与Jframe本身可以设置布局管理器不同,Activity只能通过setContentView(view)来显示指定的组件。

View组件是所有UI控件,容器控件的基类,View组件就是Android应用中用户实实在在看到的部分。但View组件需要放到容器组件中,或者使用Activity将它显示出来。

指定View通过Activity显示出来,可以通过setContentView方法来显示。

setContentView(View view)可接受任意一个View对象作为参数,如:

//创建一个线性布局管理器
LinearLayout layout = new LinearLayout();
//设置该Activity显示layout
setContentView(layout);

若在资源中存在相应的布局,直接调用setContentView(R.layout.main),即调用名字为main的布局。

注意点:
1.Activity的父类是Context
2.Layout的父类是ViewGroup,ViewGroup的基类是View
3.事实上,Activity是Window的容器,Activity包含一个返回该Activity窗口的方法getWindow(),若应用程序不调用setContentView()方法设置窗口显示内容,该程序为一个空窗体。
4.Activity包含一个setTheme(int resid)方法设置其窗体的风格。(包括不显示ActionBar,以对话框形式显示窗口等)

Service

    Service与Activity的地位相等,表明它是Android的一个独立组件,但它通常是位于后台,无须与用户进行交互,所以Service组件无图形用户界面。使用Service需要继承Service基类,一个Service组件被运行起来后,拥有自己独立的生命周期。

Service组件的作用:为其他组件提供后台服务或监控其他组件的运行状态。

BroadCastReceiver

BroadCastReceiver,广播消息接收器,是重要的组件。非常类似事件编程中的监听器,但不同的是,普通事件监听器的事件源是程序中的对象;而BroadCastReceiver监听的事件源是Android应用中的其他组件。

使用BroadCastReceiver组件需要实现自己的BroadCastReceiver子类,并重写onReceive(Context context,Intent intent)方法。当其他组件通过sendBroadCast(),sendSickyBroadcast()或sendOrderBroadcast()方法发送广播,通过设置IntentFilter,即可对其中一个或多个方法进行监听,触发onReceive(Context context,Intent intent)方法。

开发者实现自己的BroadCastReceiver后,可以通过以下方式进行注册

1.在Java代码中通过Context.registReceiver()方法注册BroadCastReceiver。

2.在AndroidMainfest.xml文件中通过<recevier../>元素完成相应的注册。

ContextProvider

ContextProvider,是Android系统为跨应用的数据交换提供一种通用标准。

使用方法:只需要继承抽象类ContextProvider后实现抽象方法即可。

通常与ContextProvider结合使用的是ContextResolver,一个app使用ContextProvider暴露自己的数据,另一个app使用ContextResolver来访问数据。

Intent与IntentFilter

    Intent并不是Android的应用组件,它是Android应用内不同组件之间通讯的载体。当Android运行时需要连接不同的组件是,通常需要借助Intent来实现。

    Intent可以启动应用中另一个Activity,也可以启动一个service组件,还可以发送一条广播消息触发系统BroadCastReceiver。BroadCastReceiver,Service,Activity三个组件都是通过Intent作为载体来进行通信。注意,不同组件的Intent的使用机制不同。

Intent启动Activity,调用Context(Activity为Context的子类)的startActivity(Intent intent)或startActivityForResult(Intent intent,int requestCode)方法,其中,intent包含需要启动Activity的信息。

Intent启动Service,调用Context的startService(Intent intent)或startActivityForResult(Intent intent,...)方法,同样intent包含需要启动Service的信息。

触发一个BroadCastReceiver时,调用Context的sendBroadCast(Intent intent)或sendSickyBroadcast(Intent intent),sendOrderBroadcast(Intent intent)来发送广播,内部intent包含相应触发信息在里面。

当一个组件通过Intent启动或触发另一个组件的的"意图"后,该意图会分为两个部分。

1.显示Intent,需要明确指定需要启动或者触发的组件类名,系统无须做任何的解析,直接找到组件启动或触发它。

2.隐式Intent,隐式Intent只是指定需要启动或触发的组件需要什么条件,系统需要对intent进行解析,当系统找到该组件时,才能启动或触发它。

posted @ 2015-08-13 22:39  暴走骑士  阅读(256)  评论(0编辑  收藏  举报