- 浏览: 112011 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
SSB4455:
嗯 应该是这样
java线程学习之Thread.sleep() 和 Thread.yield() 区别 -
wishlee:
不详细啊
Java中23种设计模式详解 -
Vin-G:
正在学习,我想修改成:在主屏中不能长按和拖拉,不知道能不能实现 ...
android2.2源码在eclipse中的配置与分析 -
star_887012:
qq16881699 写道LZ的文章就是海量数据。。。。
常见的海量数据处理方法 -
I清晰:
看来头疼啊
常见的海量数据处理方法
了解了Android应用程序的目录结构和其中每个文件的功能,要进行应用开发,还需要对Android应用构造进行深入的分析。Android应用程序由以下4个模块构造而成:
Activity
Intent
Content Provider
Service
当然,也不是每个Android应用程序都必须由这4部分组成,它可以根据开发者需求来进行组合,比如上面建立的HelloAndroid项目就只使用了Activity这一个模块。但是,任何一个应用程序都必须在AndroidManfest.xml文件中声明使用到的这些模块。
1. Activity
Activity是最基本的模块,我们在HelloAndroid项目中已经使用过。我们称之为"活动",在应用程序中,一个活动(Activity)通常就是一个单独的屏幕。每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并对事件作出响应。例如上HelloAndroid项目中的HelloAndroid.java即继承了活动(Activity)类。大多数的应用都是由多个Activity显示组成,例如,对一个文本信息应用而言,第一个屏幕用来显示发送消息的联系人列表,第二个屏幕用来写文本消息和选择收件人,第三个屏幕查看消息历史或者消息设置操作等。
这里的每一个屏幕就是一个活动,很容易实现从一个屏幕到一个新的屏幕,并且完成新的活动。当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史栈中。用户可以返回到历史栈中的前一个屏幕,当屏幕不再使用时,还可以从历史栈中删除。
简单理解,Activity代表一个用户所能看到的屏幕,主要用于处理应用程序的整体性工作,例如,监听系统事件(按键事件、触摸屏事件等),为用户显示指定的View,启动其他Activity等。所有应用的Activity都继承于android.app.Activity类,该类是Android提供的基层类,其他的Activity继承该父类后,通过父类的方法来实现各种功能,这种设计在其他领域也较为常见。
2. Intent
Android用Intent这个特殊类实现在Activity与Activity之间的切换。Intent类用于描述应用的功能。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。典型的动作类型有:MAIN、VIEW、PICK、EDIT等,而动作对应的数据则以URI的形式表示。例如,要查看一个人的联系方式,需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI。
通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity将会调用startActivity(IntentmyIntent)方法。然后,系统会在所有已安装的应用程序中定义的IntentFilter中查找,找到最匹配myIntent的Intent对应的activity。新的activity接收到myIntent的通知后,开始运行。当startActivity方法被调用时,将触发解析myIntent的动作,该机制提供了两个关键好处:
Activities能够重复利用从其他组件中以Intent的形式产生的请求。
Activities可以在任何时候被具有相同IntentFilter的新的Activity取代。
下面我们举例来说明两个Activity之间的切换。运行效果:当应用程序启动时显示布局main.xml,如图3-2所示,当我们点击"切换"按钮时,屏幕显示布局main2.xml,如图3-3所示,再点击"切换"按钮,又回到如图3-2所示。就这样通过Intent完成了两个Activity之间的切换。
图3-2 Activity01 |
图3-3 Activity02 |
具体实现参见本书所附代码:第三章\Examples_03_01
代码清单3-9 Activity01.java
- package com.yarin.android.Examples_03_01;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- /**
- * 在Examples_02_01项目中一共使用了2两个Activity,
- * 每使用一个Activity都必须在AndroidManifest.xml中
- * 进行声明。
- */
- public class Activity01 extends Activity
- {
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- /* 设置显示main.xml布局 */
- setContentView(R.layout.main);
- /* findViewById(R.id.button1)取得布局main.xml中的button1 */
- Button button = (Button) findViewById(R.id.button1);
- /* 监听button的事件信息 */
- button.setOnClickListener(new Button.OnClickListener() {
- public void onClick(View v)
- {
- /* 新建一个Intent对象 */
- Intent intent = new Intent();
- /* 指定intent要启动的类 */
- intent.setClass(Activity01.this, Activity02.class);
- /* 启动一个新的Activity */
- startActivity(intent);
- /* 关闭当前的Activity */
- Activity01.this.finish();
- }
- });
- }
- }
代码清单3-10 Activity02.java
- package com.yarin.android.Examples_03_01;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- public class Activity02 extends Activity
- {
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- /* 设置显示main2.xml布局 */
- setContentView(R.layout.main2);
- /* findViewById(R.id.button2)取得布局main.xml中的button2 */
- Button button = (Button) findViewById(R.id.button2);
- /* 监听button的事件信息 */
- button.setOnClickListener(new Button.OnClickListener() {
- public void onClick(View v)
- {
- /* 新建一个Intent对象 */
- Intent intent = new Intent();
- /* 指定intent要启动的类 */
- intent.setClass(Activity02.this, Activity01.class);
- /* 启动一个新的Activity */
- startActivity(intent);
- /* 关闭当前的Activity */
- Activity02.this.finish();
- }
- });
- }
- }
代码清单3-11 main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello"
- />
- <Button
- android:id="@+id/button1"
- android:layout_width="100px"
- android:layout_height="wrap_content"
- android:layout_x="100px"
- android:layout_y="80px"
- android:text="切换"
- >
- </Button>
- </LinearLayout>
代码清单3-12 main2.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello2"
- >
- </TextView>
- <Button
- android:id="@+id/button2"
- android:layout_width="100px"
- android:layout_height="wrap_content"
- android:layout_x="100px"
- android:layout_y="80px"
- android:text="切换"
- >
- </Button>
- </LinearLayout>
如代码清单3-9所示,我们需要在AndroidManifest.xml中声明使用的Activity02,如下代码清单3-13所示。
代码清单3-13 AndroidManifest.xml
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.yarin.android.Examples_03_01"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".Activity01"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name="Activity02"></activity>
- </application>
- <uses-sdk android:minSdkVersion="5" />
- </manifest>
如果希望Android应用能够对外部事件(如当电话呼入时,或者数据网络可用时,或者到了晚上时)做出响应,可以使用IntentReceiver。虽然IntentReceiver在感兴趣的事件发生时会使用NotificationManager通知用户,但它并不能生成UI。IntentReceiver在AndroidManifest.xml中注册,但也可以在代码中使用Context.registerReceiver()进行注册。当intentreceiver被触发时,应用不必对请求调用intentreceiver,系统会在需要时启动应用。各种应用还可以通过使用Context.broadcastIntent()将它们自己的intentreceiver广播给其他应用。
3. Content Provider
Android应用能够将它们的数据保存到文件和SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其他的应用共享时,Content Provider就可以发挥作用了。因为Content Provider类实现了一组标准的方法,能够让其他的应用保存或读取此内容提供器处理的各种数据类型。
数据是应用的核心。在Android中,默认使用鼎鼎大名的SQLite作为系统数据库。但是在Android中,使用方法有点小小的不一样。在Android中,每一个应用都运行在各自的进程中,当一个应用需要访问其他应用的数据时,也就是数据需要在不同的虚拟机之间传递,这样的情况操作起来可能有些困难(正常情况下,你不能读取其他应用的db文件),ContentProvider正是用来解决在不同的应用包之间共享数据的工具。
在Android中,content provider是一个特殊的存储数据的类型,它提供了一套标准的接口用来获取和操作数据。并且,Android自身也提供了现成的content provider:Contacts、Browser、CallLog、Settings、MediaStore。应用可以通过唯一的ContentResolver interface来使用具体的某个content provider,然后你就可以用ContentResolver提供的方法来使用你需要的content provider了。其中,contentResolver提供的方法包括query()、insert()、update()等。要使用这些方法,还会涉及URI。你可以将它理解成string形式的contentProvider的完全路径。
下面我们通过一个例子来学习ContentProvider的使用,该例子主要实现通过ContentProvider获得电话本中的数据,然后显示到一个TextView中,在运行程序之前我们先看看电话本中存储的电话号码,如图3-4所示,然后再运行程序看看我们获得的数据,如图3-5所示,来看看我们通过ContentProvider获得的数据是否正确。
图3-4 电话本数据 图3-5 通过ContentProvider获得电话本数据
代码清单3-14:Activity01.java 前面强调过,要使用这些模块,需要在AndroidManifest.xml声明,如代码清单3-15所示。 代码清单3-15 AndroidManifest.xml 4. Service Service即"服务"的意思,既然是服务,那么Service将是一个生命周期长而且没有用户界面的程序。比如一个正在从播放列表中播放歌曲的媒体播放器,在这个媒体播放器应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者会认为在导航到其他屏幕时音乐应该还在播放。在这个例子中,媒体播放器这个activity会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service一直执行,直到这个service运行结束。另外,我们还可以通过使用Context.bindService()方法连接到一个service上(如果这个service当前还没有处于启动状态,则将启动它)。当连接到一个service之后,还可用service提供的接口与它进行通讯。以媒体播放器为例,我们还可以执行暂停、重播等操作。 下面我们通过一个例子来学习service的使用,该例子通过service来播放一首MP3,如图3-6所示。当用户点击"开始"按钮,音乐开始播放;点击"停止"按钮,停止音乐播放。当然,这里需要在资源文件中添加一首MP3歌曲,如图3-7所示。
图3-6 使用Service播放音乐
图3-7 test.mp3 |
代码清单3-16 Activity01.java
- package com.yarin.android.Examples_03_03;
- 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;
- public class Activity01 extends Activity
- {
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //从main.xml布局中获得Button对象
- Button button_start = (Button)findViewById(R.id.start);
- Button button_stop = (Button)findViewById(R.id.stop);
- //设置按钮(Button)监听
- button_start.setOnClickListener(start);
- button_stop.setOnClickListener(stop);
- }
- //开始按钮
- private OnClickListener start = new OnClickListener()
- {
- public void onClick(View v)
- {
- //开启Service
- startService(new Intent("com.yarin.Android.MUSIC"));
- }
- };
- //停止按钮
- private OnClickListener stop = new OnClickListener()
- {
- public void onClick(View v)
- {
- //停止Service
- stopService(new Intent("com.yarin.Android.MUSIC"));
- }
- };
- }
使用Server来播放音乐如代码清单3-17所示。
代码清单3-17 MusicService.java
- package com.yarin.android.Examples_03_03;
- import android.app.Service;
- import android.content.Intent;
- import android.media.MediaPlayer;
- import android.os.IBinder;
- public class MusicService extends Service
- {
- //MediaPlayer对象
- private MediaPlayer player;
- public IBinder onBind(Intent arg0)
- {
- return null;
- }
- public void onStart(Intent intent, int startId)
- {
- super.onStart(intent, startId);
- //这里可以理解为装载音乐文件
- player = MediaPlayer.create(this, R.raw.test);
- //开始播放
- player.start();
- }
- public void onDestroy()
- {
- super.onDestroy();
- //停止音乐--停止Service
- player.stop();
- }
- }
界面布局XML文件如代码清单3-18所示。
代码清单3-18 main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello"
- />
- <Button
- android:id="@+id/start"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="开始播放"/>
- <Button
- android:id="@+id/stop"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="停止播放"
- />
- </LinearLayout>
我们使用Service时同样需要在"AndroidManifest.xml"声明,声明方式如代码清单3-19所示。
代码清单3-19 AndroidManifest.xml
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.yarin.Android.Examples_03_03"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".Activity01"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android. intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <service android:name=".MusicService">
- <intent-filter>
- <action android:name="com.yarin.Android.MUSIC" />
- <category android:name="android. intent.category.default" />
- </intent-filter>
- </service>
- </application>
- <uses-sdk android:minSdkVersion="5" />
- </manifest>
发表评论
-
Android系统名词解释汇总
2011-08-07 16:03 939可能刚刚接触Androi ... -
Android上HDMI介绍(基于高通平台)
2011-06-22 20:41 2336本文重点针对HDMI在android上的应用,而比较相关的就是 ... -
Android项目目录结构
2010-09-20 14:57 1151我们以HelloAndroid项目,来分析其项目目录结 ... -
android系统构架
2010-09-20 14:40 1244Android 架构 下图显示的是Android操作系统的主要 ... -
Android2.2新特性
2010-08-07 23:07 1009Android2.2(开发代 ... -
解决android2.2 开发时在eclipse 中的视图file explorer 中不显示sdcard现象
2010-08-07 23:04 1564解决android2.2 开发时 在eclipse 中 ... -
Android2.2软件开发工具包
2010-08-07 23:00 1396针对Android2.2操作系统的软件开发工具包(SDK ... -
TextView多行本文滚动轻松实现
2010-08-06 23:49 2232Android中我们为了实现文本的滚动可以在ScrollV ... -
Android中内嵌字体实现个性化
2010-08-06 23:47 2293在Android中我们的应用可以灵活的内嵌自己的字体文件 ... -
Android游戏开发---图像渐变特效
2010-08-06 23:45 1697在Android游戏开发中我们不免要涉及到一些图形特效处 ... -
Android多线程下载远程图片
2010-08-06 23:42 2187很多时候我们需要在Android设备上下载远程服务器上的图 ... -
Android Txt文本读写类源代码
2010-08-06 23:40 1269Android系统内部提供了一个不错的txt文本读写类, ... -
Android Market新反盗版机制原理
2010-08-06 23:39 1177目前来说Android平台的应用还是很容易盗版的,虽然G ... -
android2.2源码在eclipse中的配置与分析
2010-08-06 23:32 4375开发android时经常因为无法查看源码而痛苦,有两个原因: ...
相关推荐
Android 蓝牙BLE全面解析以及智能车锁开发实例一、蓝牙BLE产生背景——蓝牙的发展历程 二、蓝牙BLE的基本概念 三、蓝牙BLE的架构介绍 1. 蓝牙BLE架构概览 2. 简述BLE如何发送数据包 2.1 广播方式 2.2 连接方式 四、...
3.1.2 Android应用解析 3.2 Android的生命周期 3.3 Android程序U设计 3.4 小结 第4章 用户界面开发 4.1 用户界面开发详解 4.1.1 用户界面简介 4.1.2 事件处理 4.2 常用控件应用 4.2.1 文本框...
3.1.2 Android应用解析 3.2 Android的生命周期 3.3 Android程序U设计 3.4 小结 第4章 用户界面开发 4.1 用户界面开发详解 4.1.1 用户界面简介 4.1.2 事件处理 4.2 常用控件应用 4.2.1 文本框...
3.2 Android应用程序结构解析 9 3.2.1活动 9 3.2.2意图接收器 10 3.2.3服务 11 3.2.4内容提供者 11 3.3 Intent的详细解析 11 3.3.1 Intent的抽象描述 11 3.3.2 Android如何解析Intent 12 3.4 Android活动的生命周期 ...
巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...
巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...
2.2 Android SDK 2.2.1 安装ADT 2.2.2 安装Android SDK 2.3 Android模拟器 2.3.1 创建AVD 2.3.2 开发环境测试 2.3.3 模拟器的使用 2.4 SDK中的常用命令 2.4.1 adb命令 2.4.2 Android命令 2.5 ...
3.2 Android应用程序结构解析 9 3.2.1活动 9 3.2.2意图接收器 10 3.2.3服务 11 3.2.4内容提供者 11 3.3 Intent的详细解析 11 3.3.1 Intent的抽象描述 11 3.3.2 Android如何解析Intent 12 3.4 Android活动的生命周期 ...
3.2 Android应用程序结构解析 10 3.2.1 活动 10 3.2.2 意图接收器 11 3.2.3 服务 11 3.2.4 内容提供者 11 3.3 Intent的详细解析 12 3.3.1 Intent的抽象描述 12 3.3.2 Android如何解析Intent 13 3.4 Android活动的...
3.1.2 Android应用解析 3.2 Android的生命周期 3.3 Android程序U设计 3.4 小结 第4章 用户界面开发 4.1 用户界面开发详解 4.1.1 用户界面简介 4.1.2 事件处理 4.2 常用控件应用 4.2.1 文本框(Textiew) 4.2.2 列表...
Android2.2+API+中文文档系列.pdf Android_CTS测试研究.pdf Android_GoogleMaps基础开发教程.pdf Android_GPS架构分析.doc android_jni操作指南.pdf android_JNI编程_一些技巧.doc Android_NDK开发实例.doc Android_...
3.2.4 先来热热身——AndroidSDK例子解析 3.2.5 SDK提供的工具介绍 3.3 Android典型包分析 3.3.1 开发的基石——AndroidAPI核心开发包介绍 3.3.2 拓展开发外延——Android可选API介绍 3.4 本章小结 第4章 赚钱的...
1.3 Android应用程序构成 1.3.1 活动(Activity) 1.3.2 意图(Intent) 1.3.3 服务(Service) 1.3.4 内容提供器(ContentProvider) 1.4 Android网上资源 第2章 搭建Android开发环境 2.1 Android开发环境要求 2.2 ...
3.2 Android应用程序结构解析 10 3.2.1 活动 10 3.2.2 意图接收器 11 3.2.3 服务 11 3.2.4 内容提供者 11 3.3 Intent的详细解析 12 3.3.1 Intent的抽象描述 12 3.3.2 Android如何解析Intent 13 3.4 Android活动的...
1.4 编译在G1上运行的android 2.2(froyo)代码_旧方法 12 1.5 编译在G1上运行的android 2.2(froyo)代码_新方法 15 1.6 编译在N1上运行的android 2.3(GingerBread)代码 18 1.7 系统结构 21 1.8 模拟器调试与真机调试 ...
3.1.2 Android应用解析 3.2 Android的生命周期 3.3 Android程序U设计 3.4 小结 第4章 用户界面开发 4.1 用户界面开发详解 4.1.1 用户界面简介 4.1.2 事件处理 4.2 常用控件应用 4.2.1 文本框(Textiew) 4.2.2 列表...
1.3.1 开发基于Android平台的应用 1.3.2 参加Android开发者大赛 1.3.3 个人英雄主义再现——得到更多人的认可和尊重 1.3.4 获得应有的收益——AndroidMarket 1.4 真实体验——Android模拟器 1.4.1 模拟器概述 1.4.2 ...
Android-studio-ide-143.2739321-mac.dmg 调试环境:API17 因为没有自己的音乐服务器,网络上的音乐网站在这边博客发表的2016年5月已经很难找到免费且在线下载的了,就算找到解析也是一个难题。如果你在练习同样...