以展讯8810平台-android2.3代码为例:
1. 类SyncSimContactsReceiver:
这个类是一个广播接收器(broadcastReceiver),主要看它的onReceive()方法: 在接收到android.intent.action.BOOT_COMPLETED这个intent的时候,会执行startService(),service对应的类是SyncSimContactsService
2. 类SyncSimContactsService:
这个类是一个服务(service),service被启动后,
2.1 先执行onCreate(),在onCreate()中会创建一个handler(mServiceHandler),
mServiceHandler = new ServiceHandler();
ServiceHandler是一个SyncSimContactsService的内部类,这个类实现了一个handleMessage方法.
创建Handler时默认没有传入参数,那么系统就会默认将当前线程的looper绑定到handler上,looper对象中维护着一个消息队列,handler发送的消息都会存储在这个消息队列中,looper不断的遍历这个消息队列,取出消息交给handleMessage()来处理,因为looper属于当前线程,所以handleMessage()就会在当前线程中执行。
2.2 再执行onStartCommand(),在onStartCommand()中主要执行doServicehandler(),在doServicehandler()中,mServiceHandler会发送两个MESSAGE_INIT消息,消息中的arg2参数会记录sim卡的index,表示要对两个sim卡都行初始化。
2.3 由于mServiceHandler绑定的是当前线程的消息队列,因此当前线程的消息队列收到MESSAGE_INIT后会执行handleMessage方法,handleMessage对消息进行解析,消息中有4个主要参数:
1. what: 存储的值是messageId,在这里就是MESSAGE_INIT。
2 arg1: 存储的值是startId, 这个参数是service在执行onStartCommand方法时,作为形参传入的,表示是由谁启动的service
3. arg2: 存储的值是phoneId, 表明是哪个sim卡。
4. obj: 存储的值是intent, 这个值也是service在执行onStartCommand方法时,作为形参传入的,表示是哪个intent来启动的service。
接下来就是具体处理MESSAGE_INIT这个消息了,先要根据phoneId获取到对应的TelephonyManager的对象,然后通过调用getSimOperator方法来获取sim_oper_num(MCC+MNC),如果这个值有效,则执行importDualSimAction方法来导入sim卡联系人的数据了。
在importDualSimAction中会创建一个线程,并启动这个线程:
DualSimcardImportThread simImport = new DualSimcardImportThread(serviceId,new ContactsAccount(accountName, Account.SIM_ACCOUNT_TYPE, uri), phoneId);
simImport.start();
DualSimcardImportThread是一个内部类, 它的构造函数的形参有3个:
1. serviceId:即前面提到的startId,
2. ContactsAccount:这个对象里面携带了访问sim卡的URI数据,如果是sim1,则对应的URI是"content://icc0/adn",如果是sim2,对应的URI是"content://icc1/adn"
3. phoneId: 前面已经提到过。
这个线程类最主要的当然是实现了run方法,
在run方法中,先执行deleteSimAction方法,删除本地数据库"content://com.android.contacts/raw_contacts"中account_name=sim1 or sim2的数据,这些联系人不是本地联系人,所以开机后需要删除后重新加载。
接下来就是访问sim卡数据库了“content://icc0/adn”:
simCursor = mResolver.query(mAccount.getContactsAccountUri(),SIM_COLUMN, null, null, null);
在phone.apk的manifest.xml中:
<provider android:name="MsmsIccProvider"
android:authorities="icc"
android:multiprocess="true"
android:readPermission="android.permission.READ_CONTACTS"
android:writePermission="android.permission.WRITE_CONTACTS" />
<provider android:name="MsmsIccProvider"
android:authorities="icc0"
android:multiprocess="true"
android:readPermission="android.permission.READ_CONTACTS"
android:writePermission="android.permission.WRITE_CONTACTS" />
<provider android:name="MsmsIccProvider"
android:authorities="icc1"
android:multiprocess=