Embed
Email

Android????

Document Sample
Android????
Shared by: HC120105031437
Categories
Tags
Stats
views:
0
posted:
1/4/2012
language:
pages:
48
Android应用开发

2010年8月13日

目录

Android平台架构





Android环境配置和开发





Android应用程序构成





如何开发一个例子

Android平台架构



JAVA







JNI





C/汇编

简介

• Linux核心:Android依赖Linux 2.6来提供核心的服务,

例如存储管理、进程(Process)管理等

• Android Runtime:Java语言层级的Virtual Machine

• Libraries:Android里已经提供的C/C++组件。例如,

SQLite、OpenGL 3D等。

• 应用框架(Application Framework,):这是结合

Applications和Libraries的主架构,让Libraries組

件能不断地为Applications所重复使用

• 应用程序(Applications):根据用户的期望而将AF的

组件及Libraries组件组合而成的服务。

用汉堡比喻Android 平台架构

目录



Android平台架构





Android环境配置和开发





Android应用程序构成





如何开发一个例子

如何安装 Android SDK 和Eclipse 插件

所需开发环境:

JDK 5 或 JDK 6 (仅有JRE不够)

Eclipse 3.5 (galileo)

下载ADT 的Eclipse 插件

http://dl.google.com/android/ADT-0.9.5.zip

安装 Eclipse 插件 (ADT)

启动 Eclipse,选择 Help > Install New Software,在出现的对话框里,点击

Add按钮,在对话框的name一栏输入“ADT”, 然后点击Archive...,浏

览和选择已经下载的ADT插件压缩文件。

点击 OK.。返回可用软件的视图,你会看到这个插件,然后选择Developer

Tools (会选中下面的“Android Developer Tools”和 “Android Editors“),

点击 Next,最后重启 Eclipse。

下载Android SDK:

http://dl.google.com/android/android-sdk_r04-windows.zip

下载完SDK后,把.zip文件解压到你电脑上合适位置。启动 Eclipse,选择

window->preferences,在打开的视图左边点击android,在右边的SDK

Location中选择Android SDK所在位置。

开发第一个Android应用

打开Eclipse,新建项目(点击FileNewProject),在项目列表中展开Android目录,选择Android

Project,如下图:

开发第一个Android应用

开发第一个Android应用

点击”finish”即可完成项目的创建,创建后的项目已经是一个可运行

的Android应用,我们可以通过下面方式运行此应用:

点击工具栏上手机形状的虚拟设备管理器(简称“AVD“),如下:

开发第一个Android应用

在打开的虚拟设备管理器中创建一个虚拟手机:

开发第一个Android应用

在项目上右键点击run as Android application,如下图:

Android应用程序架构

src/ java原代码存放目录

gen/ 自动生成目录

gen 目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。 这个

文件由Android开发工具自动产生的。Android开发工具会自动根据你放入res目录的xml界面

文件、图标与常量,同步更新修改R.java文件。正因为R.java文件是由开发工具自动生成的,

所以我们应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了界面、图标、

常量等各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查

R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少

应用在手机占用的空间。

res/ 资源(Resource)目录

在这个目录中我们可以存放应用使用到的各种资源,如xml界面文件,图片或数据。具体请看ppt

下方备注栏。

AndroidManifest.xml 功能清单文件

这个文件列出了应用程序所提供的功能,在这个文件中,你可以指定应用程序使用到的服务(如电

话服务、互联网服务、短信服务、GPS服务等等)。另外当你新添加一个Activity的时候,也需

要在这个文件中进行相应配置,只有配置好后,才能调用此Activity。

default.properties 项目环境信息,一般是不需要修改此文件

目录

Android平台架构





Android环境配置和开发





Android应用程序构成





如何开发一个例子

Android应用程序构成



Activity Service



Intent



Broadcast Content

Receiver Provider

Activity

• A visual user interface

• 通过view管理UI

• 每一个有用户界面的应用至少包含一个

activity

• 一个应用可以有多个activity,其中一个

作为main activity用于启动显示

• Activity通过startActivity或

startActivityForResult启动另外的activity

Activity生命周期



• Activity通过onCreate

被创建

• 当一个activity失去焦

点,该activity将进入

pause状态,系统在内

存不足时会将其终止

• 当一个activity被另一

个activity覆盖,该

activity将进入stop状

态,系统在需要内存

的时候会将其终止

Intent

• 类似于消息、事件通知

• Intent构成:action、category、data

• Activity、Service、broadcast receiver之间的桥





activity service



Intent



Broadcast receiver

Intent

• 两类intent:

– 显式:指定具体的目标组件处理

– startActivity(new Intent(ActivityLifecycle.this, AnotherActivity.class));

– 隐式:由系统接受并决定如何处理

– startActivity(new Intent(Intent.ACTION_DIAL));



• 在AndroidManifest.xml中定义activity、service、

broadcast receiver接受的intent

Intent

• Intent filter: action、category、data









Component name activity

Action

framework Data component service

Category

Broadcast

intent receiver

实例



action -- DIAL action -- VIEW

data -- tel:01038639592 data -- http://www.google.cn

Service

• 没有UI,启动之后一直运行于后台

• 例子:音乐播放器

• 与应用程序的其他模块(例如activity)

一同运行于主线程中

• 通过startService或bindService创建Service

• 通过stopService或stopSelf终止Service

• 一般的,在activity中启动和终止service

Service生命周期

Context.startService() Context.bindService()









Context.stopService()

Serivce.stopSelf()

服务--Service

Android中的服务和windows中的服务是类似的东

西,服务一般没有用户操作界面,它运行于系

统中不容易被用户发觉,可以使用它开发如监

控之类的程序。服务的开发比较简单,如下:

第一步:继承Service类

public class SMSService extends Service { }

服务--Service

第二步:在AndroidManifest.xml文件中的节点里对

服务进行配置:



服务不能自己运行,需要通过调用Context.startService()或

Context.bindService()方法启动服务。这两个方法都可以启动

Service,但是它们的使用场合有所不同。使用startService()方

法启用服务,调用者与服务之间没有关连,即使调用者退出了,

服务仍然运行。使用bindService()方法启用服务,调用者与服务

绑定在了一起,调用者一旦退出,服务也就终止。

如果打算采用Context.startService()方法启动服务,在服务未被

创建时,系统会先调用服务的onCreate()方法,接着调用

onStart()方法。如果调用startService()方法前服务已经被创建,

多次调用startService()方法并不会导致多次创建服务,。采用

startService()方法启动的服务,只能调用Context.stopService()

方法结束服务,服务结束时会调用onDestroy()方法。

服务--Service



如果打算采用Context.bindService()方法启动服务,在

服务未被创建时,系统会先调用服务的onCreate()方

法,接着调用onBind()方法。这个时候调用者和服务

绑定在一起,调用者退出了,系统就会先调用服务的

onUnbind()方法,接着调用onDestroy()方法。如果调

用bindService()方法前服务已经被绑定,多次调用

bindService()方法并不会导致多次创建服务及绑定

(也就是说onCreate()和onBind()方法并不会被多次调

用)。如果调用者希望与正在绑定的服务解除绑定,可

以调用unbindService()方法,调用该方法也会导致系

统调用服务的onUnbind()-->onDestroy()方法。

服务--Service

服务常用生命周期回调方法如下:

onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调

用多少次startService()或bindService()方法,服务也只被创建一次。

onDestroy()该方法在服务被终止时调用。



 与采用Context.startService()方法启动服务有关的生命周期方法

onStart() 只有采用Context.startService()方法启动服务时才会回调该方

法。该方法在服务开始运行时被调用。多次调用startService()方法尽

管不会多次创建服务,但onStart() 方法会被多次调用。



 与采用Context.bindService()方法启动服务有关的生命周期方法

onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。

该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次

调用Context.bindService()方法并不会导致该方法被多次调用。

onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方

法。该方法在调用者与服务解除绑定时被调用。

采用startService()启动服务

采用Context.startService()方法启动服务的代码如下:

public class HelloActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

......

Button button =(Button)

this.findViewById(R.id.button);

button.setOnClickListener(new

View.OnClickListener(){

public void onClick(View v) {

Intent intent = new Intent(HelloActivity.this,

SMSService.class);

startService(intent);

}});

}

}

采用bindService()启动服务

采用Context.startService()方法启动服务的代码如下:

public class HelloActivity extends Activity {

ServiceConnection conn = new ServiceConnection() {

public void onServiceConnected(ComponentName name, IBinder

service) {

}

public void onServiceDisconnected(ComponentName name) {

}

};

@Override public void onCreate(Bundle savedInstanceState) {

Button button =(Button) this.findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener(){

public void onClick(View v) {

Intent intent = new Intent(HelloActivity.this,

SMSService.class);

bindService(intent, conn, Context.BIND_AUTO_CREATE);

//unbindService(conn);//解除绑定

}});

}

}

何为Content provider



• 什么是Content provider?

– Content Provider 是Android应用程序的四大

组成部分之一

– 是android中的跨应用访问数据机制

• 为何需要content provider?

– Android中每一个app的资源是私有的

– app通过content provider和其他app共享私有

数据

如何使用content provider

• 通过content resolver访问

 Context.getContentResolver()





app app app





ContentResolver ContentResolver ContentResolver





ContentProvider A ContentProvider B

如何使用content provider

• URI定位资源

– content://contacts/people

– content://call_log

• 类似关系数据库的访问方式

delete(Uri url, String where, String[] selectionArgs)

insert(Uri url, ContentValues values)

query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder)

update(Uri uri, ContentValues values, String where,

String[] selectionArgs)



• 以二维数据表的格式暴露数据,缺省都包含_id字段

定义自己的content provider

Android的存储

• 一般的,应用程序的数据(包括文件)

都是私有的

• 四种持久存储方式

– Preferences——类似properties,xml文件

– Files

– Database——SQLite

– Network

Broadcast receiver

• 接收和处理android的广播消息

• Android的广播机制

– 系统事件——例如变换时区、电量低等

– 应用程序发出广播消息:sendBroadCast

– 广播消息:intent



android

Send Broadcast

broadcast receiver



app

创建Broadcast Receiver

• 实现一个BroadcastReceiver

– public class MyAndroidReceiver extends BroadcastReceiver

– override onReceive(Context context, Intents Intents)

• 注册BroadcastReceiver

– 在AndroidManifest.xml文件当中进行注册













– 在代码当中直接进行注册



IntentsFilter filter = new IntentsFilter(NEW_BROADCAST );

MyAndroidReceiver MyAndroidReceiver = new MyAndroidReceiver();

registerReceiver(MyAndroidReceiver , filter);

Broadcast receiver生命周期







Broadcast receiver对象在onReceive返回后被销毁

onReceive中不适合处理异步过程。例如弹出对话框

与用户交互,可使用消息栏替代。

Android权限控制

• 在AndroidManifest.xml中描述一个app的权限

• 例如:











 权限举例(参考android. Manifest.permission)

权限名称 权限描述

接收短信 android.permission.RECEIVE_SMS

拨打电话 android.permission.CALL_PHONE

系统启动完毕通知 android.permission.RECEIVE_BOOT_COMPLETED

读取联系人信息 android.permission.READ_CONTACTS

修改联系人信息 android.permission.WRITE_CONTACTS

目录

Android平台架构





Android环境配置和开发





Android应用程序构成





如何开发一个例子

从Internet获取数据

利用HttpURLConnection对象,我们可以从网络中获取网页数据.

URL url = new URL("http://www.sina.com");

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(6* 1000);//设置连接超时

if (conn.getResponseCode() != 200) throw new RuntimeException("请求url失败");

InputStream is = conn.getInputStream();//得到网络返回的输入流

String result = readData(is, "GBK");

conn.disconnect();

System.out.println(result);

//第一个参数为输入流,第二个参数为字符集编码

public static String readData(InputStream inSream, String charsetName) throws

Exception{

ByteArrayOutputStream outStream = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int len = -1;

while( (len = inSream.read(buffer)) != -1 ){

outStream.write(buffer, 0, len);

}

byte[] data = outStream.toByteArray();

outStream.close();

inSream.close();

return new String(data, charsetName);

}

从Internet获取数据

利用HttpURLConnection对象,我们可以从网络中获取文件数据.

URL url = new URL("http://sinaapp.com/Img269812337.jpg");

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(6* 1000);

if (conn.getResponseCode() != 200) throw new RuntimeException("请

求url失败");

InputStream is = conn.getInputStream();

readAsFile(is, "Img269812337.jpg");



public static void readAsFile(InputStream inSream, File file)

throws Exception{

FileOutputStream outStream = new FileOutputStream(file);

byte[] buffer = new byte[1024];

int len = -1;

while( (len = inSream.read(buffer)) != -1 ){

outStream.write(buffer, 0, len);

}

outStream.close();

inSream.close();

}

向Internet发送请求参数

利用HttpURLConnection对象,我们可以向网络发送请求参数.

String requestUrl = "http://localhost:8080/itcast/contanctmanage.do";

Map requestParams = new HashMap();

requestParams.put("age", "12");

requestParams.put("name", "中国");

StringBuilder params = new StringBuilder();

for(Map.Entry entry : requestParams.entrySet()){

params.append(entry.getKey());

params.append("=");

params.append(URLEncoder.encode(entry.getValue(), "UTF-8"));

params.append("&");

}

if (params.length() > 0) params.deleteCharAt(params.length() - 1);

byte[] data = params.toString().getBytes();

URL realUrl = new URL(requestUrl);

HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();

向Internet发送请求参数

conn.setDoOutput(true);//发送POST请求必须设置允许输出

conn.setUseCaches(false);//不使用Cache

conn.setRequestMethod("POST");

conn.setRequestProperty("Connection", "Keep-Alive");//维持长连接

conn.setRequestProperty("Charset", "UTF-8");

conn.setRequestProperty("Content-Length", String.valueOf(data.length));

conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());

outStream.write(data);

outStream.flush();

if( conn.getResponseCode() == 200 ){

String result = readAsString(conn.getInputStream(), "UTF-8");

outStream.close();

System.out.println(result);

}

=向Internet发送xml数据

利用HttpURLConnection对象,我们可以向网络发送xml数据.

StringBuilder xml = new StringBuilder();

xml.append("");

xml.append("");

xml.append("中国");

xml.append("");

byte[] xmlbyte = xml.toString().getBytes("UTF-8");

URL url = new URL("http://localhost:8080/itcast/contanctmanage.do?method=readxml");

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(6* 1000);

conn.setDoOutput(true);//允许输出

conn.setUseCaches(false);//不使用Cache

conn.setRequestMethod("POST");

conn.setRequestProperty("Connection", "Keep-Alive");//维持长连接

conn.setRequestProperty("Charset", "UTF-8");

conn.setRequestProperty("Content-Length", String.valueOf(xmlbyte.length));

conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");

DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());

outStream.write(xmlbyte);//发送xml数据

outStream.flush();

if (conn.getResponseCode() != 200) throw new RuntimeException("请求url失败");

InputStream is = conn.getInputStream();//获取返回数据

String result = readAsString(is, "UTF-8");

outStream.close();

HTTP多线程断点下载应用程序

• 多线程下载:

HTTP多线程断点下载应用程序

• 如何才能从文件的指定位置处开始下载

文件?(比如从50MB开始)这一点我们

可以通过HTTP请求信息头来设置,可以

使用HTTP请求信息头的“Range‖属性。

例如:只要在请求头中加入以下代码就

可以只请求部分数据: Content-Range:

bytes 20000-40000/47000 ,

即从第20000字节请求到第40000个字

节,(文件长度是47000字节)

HTTP多线程断点下载应用程序

• 如何支持断点下载。就是将下载的进度

保存到文件中,但在Android中却不能这

么做。在Android平台中,我们需要向文

件中写出下载的文件数据,我们通过数

据库的方式保存下载进度


Related docs
Other docs by HC120105031437
?????????????????????? ...
Views: 0  |  Downloads: 0
Hoja de datos y pedidos
Views: 1  |  Downloads: 0
TEMA 4 (BLOQUE B)
Views: 1  |  Downloads: 0
16250:19289IA
Views: 0  |  Downloads: 0
GOBIERNO DEL ESTADO
Views: 9  |  Downloads: 0
Operational Guidance
Views: 0  |  Downloads: 0
FORMULARIO PARA CARTA DE INVITACION
Views: 4  |  Downloads: 0
By registering with docstoc.com you agree to our
privacy policy

You are almost ready to download!

You are almost ready to download!