Android应用程序由4个模块构造而成。
Activity, Intent, Content Provider, Service.
Activity. 是最基本的模块,一个Activity通常就是一个单独的屏幕。当一个新的屏幕打开后,前一个屏幕将会暂停,并保留在历史栈中。用户可以返回到历史栈中的前一个屏幕,当屏幕不再使用时,还可以从历史栈中删除。
Intent. 实现在Activity之间的切换。用于描述应用的功能。在描述中,action和data最重要。典型的action有MAIN,VIEW,PICK, EDIT等。data以URI的形式表示。
例如:查看一个人的联系方式。需要创建一个action为VIEW的Intent,以及表示这个人的URI。
向前导航调用方法:startActivity(Intent it)
调用startActivity方法之后,系统会在IntentFilter中查找最匹配的Activity.
IntentReceiver。可以用于系统对外部事件做出响应(比如电话呼入,数据网络可用,到了晚上)。会使用NotificationManager通知用户,但不能生成UI。可以在AndroidManifest.xml中注册,也可以在代码中使用Context.registerReceiver()进行注册。
ContentProvider。android将数据保存到文件、SQLite数据库中。想将应用间共享数据时,ContentProvider可以发挥作用。在android中,每个应用都运行在各自的进程中。通常情况下,一个应用不能读取其他应用的db文件。ContentProvider提供了一套标准的接口用来获取和操作数据。Android自身也提供了现成的ContentProvider: Contacts, Browser, CallLog, Settings, MediaStore. 应用通过ContentResolver来使用ContentProvider。ContentResolver提供的方法包括query(), insert(), update()等,其参数之一URI可以理解为String形式的ContentProvider的完全路径。
举例:通过ContentProvider获得联系人数据。
private void getContactData() {
// 得到ContentResolver对象
ContentResolver cr = getContentResolver();
// 取得电话本中开始一项的光标
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,
null, null, null, null);
// 向下移动光标
while(cursor.moveToNext()) {
// 取得联系人姓名
String name = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
// 取得电话号码
String number = cursor.getString(cursor.getColumnIndex(PhoneLookup.NUMBER));
}
cursor.close();
}
使用读取联系人API,需要授权:
<uses-permission android:name="android.permission.READ_CONTACTS" />
Service. Service是一个生命周期长且没有用户界面的程序。举例:媒体播放器可以通过context.startService()来启动一个service在后台播放音乐。还可以通过context.bindService()连接到一个service上。如果这个service没有启动,则将启动它。当连接到一个service之后,还可以调用service提供的接口。
举例:实现音乐的播放和停止
1. 在Activity中启动和停止service
private void startMusic() {
// 开启service
startService(new Intent("com.example.android.MUSIC"));
}
private void stopMusic() {
// 停止service
stopService(new Intent("com.example.android.MUSIC"));
}
2. 扩展Service类实现音乐的播放和停止
public class MusicService extends Service {
private MediaPlayer player;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
// 装载音乐文件
player = MediaPlayer.create(this, R.raw.test);
// 开始播放
player.start();
}
@Override
public void onDestroy() {
super.onDestroy();
// 停止播放
player.stop();
}
}
3. 在AndroidManifest.xml文件中声明Service
<service android:name=".MusicService">
<intent-filter>
<action android:name="com.example.android.MUSIC"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
</application>