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>