1. Android的应用和进程
对Android多任务机制一个常见的误解就是没有很好地区分单个进程和应用(a process and an application)。在Android中它们并不是紧密耦合的实体:相对于用户开启的多个应用并不一定存在唯一一个实际承载这些应用的进程;多个应用之间可以共享进程,或者一个应用可以根据需要使用多个进程;即使这个应用不处于活动运行的状态,与这一应用程序关联的一个(或多个)进程都会由android来维护。
你看到一个应用程序的进程“正在运行”,并不意味着这个应用正在运行或是在做其它的事情。进程的存在只能说明android在某一时刻还需要它,同时决定最好保留它以便再次用到。同样的,你可以离开应用程序一段时间然后回到原来的地方,在这期间Android可能会因为其它原因而需要终结这一进程。
2. Android的多任务机制
Android手机应用与PC应用有明显的不同,主要有以下几点:
A.不需要用户在使用完毕应用程序后立即关闭。因为作为小屏幕的智能设备,在众多应用之间相互切换(比如短信和联系人之间的切换),不断关闭应用程序是对资源的浪费;
B.对用户操作的响应速度。比如在用户看视频时,插进一个电话,接听完毕又回到视频播放窗口。这个切换过程如果耗时超过1秒以上,就是令人难以接受的;
C.智能设备的内存相对较小。
3. 同一个组件的不同任务之间的同步可以使用信号量机制Semaphore
// 在线程A中等待信号可用,
sem.wait();
//=====================================================
// 线程B使用完数据后释放或者通知A开始下一步语句的执行
sem.release();
4. 组件之间的通信使用Intent实现
进程的概念被淡化,强调Activity, Service。
这些组件间通信的核心机制是Intent,通过Intent可以开启一个Service, Activity。 而不管这个组件是否属于当前应用。
5. Activity与Service之间的通信可使用IPC机制
Intent实现的是一些相对比较简单的组件通信机制,复杂的控制请求就无法实现了。
IPC机制可用于Activity和Service之间的通信。类似RPC方法。即定义一个AIDL接口文件,Server端实现IPC接口,Client调用IPC接口实现本地代理。
IPC调用是同步进行的。如果一个IPC服务需要超过几秒才能完成的话,应该避免在主程序中使用,否则IPC调用会挂起应用程序导致界面没有响应。这种情况下应该考虑一个单独的线程来处理IPC访问。
6. Android应用程序之间数据共享使用ContentProvider
这是应用程序之间唯一共享数据的方法。
如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
(1)消费者:ContentResolver是通过URI来查询ContentProvider中提供的数据。
<uses-permission android:name="android.permission.READ_CONTACTS"/>
Cursor c =getContentResolver().query(Phones.CONTENT_URI, null, null, null, null);
while(c.moveToNext()){
String str =c.getString(c.getColumnIndex("name"));
Log.i(TAG, str);
}
(2)生产者:数据提供方ContentProvider
自定义消费者:
// 查询我自己的数据, 来自SqliteTest.CreateContacts
Uri uri =Uri.parse("content://com.example.sqlitetest.createcontactscontentprovider/person");
Cursor c =getContentResolver().query(uri, null, null, null, null);
while(c.moveToNext()){
String str =c.getString(c.getColumnIndex("name"));
Log.i(TAG, str);
}
自定义生产者:
<provider android:name="CreateContacts"
android:authorities="com.example.sqlitetest.createcontactscontentprovider">
</provider>
public class CreateContacts extends ContentProvider {
public static DBOperateHelper mydb =null;
public static final Uri CONTENT_URI =Uri.parse("content://com.example.sqlitetest.createcontactscontentprovider");
public static void setDB(DBOperateHelperd){
mydb = d;
}
@Override
public boolean onCreate() {
return true; // 特别注意,这里一定要return true,默认的是return false;
}
@Override
public Cursor query(Uri uri, String[]projection, String selection,
String[] selectionArgs,String sortOrder) {
SQLiteDatabasedb = mydb.getReadableDatabase();
Cursorc = db.query("person", projection, selection, selectionArgs, null,null, sortOrder);
c.setNotificationUri(getContext().getContentResolver(),uri);
returnc;
}
// ... 其他自动生成的方法
}