开机后将sim/uim卡上的联系人写入数据库(2)

本文详细介绍了Android系统在开机后如何通过广播接收器和服务读取SIM卡联系人并导入数据库的过程。从SyncSimContactsReceiver接收ACTION_BOOT_COMPLETED开始,经SyncSimContactsService、AdnRecordCache、IccPhoneBookInterfaceManager等类,通过AIDL接口与RIL交互,最后通过ContentProvider将数据存储到本地数据库。整个流程涉及多线程、Handler、socket通信和数据库操作。
摘要由CSDN通过智能技术生成

以展讯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=

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值