一.Android应用结构分析
1.res目录说明
1> 在XML文件中使用资源
@<资源对应的内部类的类名>/<资源项的名称>
如@string/app_name
当我们在XML文件中使用标识符时,这些标识符无须使用专门的资源进行定义,直接在XML文档中按如下格式分配标识符即可:
@+id/<标识符代号>
如下: 为一个组件分配标识符:
android:id = “@+id/ok”
接下来如果希望在Java代码中获取该组件,通过调用Activity的findViewById()方法即可实现;
如果希望在XML文件中获取该组件,则可通过引用的方式来引用它,语法如下:
@id/<标识符代号>
2.Android应用的清单文件
AndroidManifest.xml文件是Android项目的系统清单文件。它用于控制Android应用的名称,图标,访问权限等整体属性。除此之外,Android应用的Activity,Service,ContentProvider,BroadcastReceiver这4大组件都需要在该文件中配置。
可以包含如下信息:
1.应用程序的包名,该包名为该应用的唯一标识。
2.应用程序所包含的组件;
3.应用程序兼容的最低版本;
4.应用程序使用系统所需的权限声明;
5.其他程序访问该程序所需的权限声明。
<?xml version="1.0" encoding="utf-8"?>
<!-- 指定Android应用的包名,唯一标识该应用-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld"
android:versionCode="1"
android:versionName="1.0">
<!--指定Android应用标签,图标-->
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<!--定义Android应用的一个组件:Activity -->
<activity android:name="HelloWorld"
android:label="@string/app_name">
<intent-filter>
<!--指定该Activity是程序的入口-->
<action android:name="android.intent.action.MAIN" />
<!--指定加载该应用时运行该Activity-->
<category android:name="android.intent.category.LAUNCHER" />
<!--声明该应用需要拨打电话的权限-->
<uses-permission android:name="android.permission.CALL_PHONE" />
</intent-filter>
</activity>
</application>
</manifest>
3.应用程序权限说明
1> 声明运行该应用本身所需要的权限
为<manifest…/>元素添加<uses-permission…/>子元素即可为程序本身声明权限。
例如: 在<manifest…/>元素里添加如下代码:
<!--声明该应用需要拨打电话的权限-->
<uses-permission android:name="android.permission.CALL_PHONE" />
2> 声明调用该应用所需的权限
为应用的各组件元素,如<activity…/>元素添加<uses-permission…/>子元素即可声明调用该程序所需的权限。
例如:在<activity…/>元素里添加如下代码:
<!--声明该应用需要发送短信的权限-->
<uses-permission android:name="android.permission.SEND_SMS" />
二.Android应用的基本组件介绍
1.Activity
Acitivity为Android应用提供了可视化用户界面,通过setContentView()方法来指定组件,view组件是所有UI控件,容器控件的基类。
setContentView()接收一个view对象作为参数
//创建一个线性布局管理器
LinearLayout layout = new LinearLayout(this);
//设置该Activity显式layout
setContentView(layout);
setContentView()接收一个布局管理资源的ID作为参数
//设置该Activity显式activity_main.xml文件定义的View
setContentView(R.layout.activity_main);
2.Service
Service组件需要继承Service基类,Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。
3.BroadcastReceiver
BroadcastReceiver非常类似于事件编程中的监听器。与普通事件监听器不同的是,普通事件监听器监听的事件源是程序中的对象;而BroadcastReceiver监听的事件源是Android应用中的其他组件。
开发者通过实现自己的BroadcastReceiver子类,并重写onReceive(Context context, Intent intent)方法即可。当其他组件通过sendBroadcast(),sendStickyBroadcast()或sendOrderBroadcast()方法发送广播消息时,如果该BroadcastReceiver也对该消息感兴趣(通过IntentFilter配置),onReceive方法将会被调用。
两种方式注册这个系统级的事件监听器
3.1 在Java代码中通过Context.registReceiver()方法注册BroadcastReceiver。
3.2 在AndroidMainfest.xml文件使用<receiver…/>元素完成注册。
4.ContentProvider
为多个应用程序之间进行数据交换。利用ContentProvider和ContentResolver相结合,前者暴露自己的数据,后者来访问这些数据。
5.Intent和IntentFilter
Intent是Android应用内不同组件之间通信的载体。Intent可以启动应用中另一个Activity,也可以启动一个Service组件,还可以发送一条广播消息来触发系统中BroadcastReceiver。
5.1 要启动一个Activity时,可调用Context的startActivity(Intent intent)或startActivityForResult(Intent intent, int requestCode)方法。
5.2 要启动一个Service时,可调用Context的startService(Intent intent)或bindService(Intent service, ServiceConnection conn, int flags)方法。
5.3 要触发一个BroadcastReceiver时,可以调用Context的sendBroadcast(),sendStickyBroadcast()或sendOrderBroadcast()方法发送广播消息。
显式Intent:显式Intent明确指定需要启动或者触发的组件的类名;
隐式Intent:隐式Intent只是指定需要启动或者触发的组件应满足怎样的条件。这就需要IntentFilter来声明自己所满足的条件。