Android2.2应用解析
??? 了解了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-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>?