最近在做一个Android手机项目,这个项目是7.0的,负责的是Contacts模块。
Contacts:又叫Phone book,源码路径:package/app/Dialer,Dialer整合了InCall,Contacts模块。
详细可以参考:http://www.cnblogs.com/lance2016/p/6107376.html
在android源码中主入口:DialtactsActivity
出于机密,就不说是什么Activity了,只是用到了android:targetActivity="xxxxxx",使用这个是关联一个目标Activity,也就是说如果有发响应Action和category,这个关联到xxxxxx的代码中去。
我这里就先不用源码做分析了
-------------------------------------------------------------------------------------------------------------------------------------------------------------
1.初次进入Dialer应用:
1.1 启动修改新进未接来电和取消未接来电的Notification的服务类
是在主入口Activity中通过handler.postDelayed()的方法,启动一个Service。该服务类是继承于IntentService,继续调用onHandleIntent()。通过onHandleIntent将之前新进
的未接来电全部变为不是New,且cancel掉之前的未接来电的Notification。
1.1.1 修改新进未接来电
查询的数据库URI:public static final Uri CONTENT_URI = Uri.parse("content://call_log/calls");
查询的数据库条件:(type = 3(未接来电) or type = 103(未接视频来电)) and new = 1(True)
1.1.2 取消未接来电的Notification的服务类
归根揭底,是用的反射机制来实现的。
具体代码如下:
当SDK>20
public void cancelMissedCallsNotification() { Class<?> clz = mTelecomManagerService.getClass(); Method method = null; try { method = clz.getMethod("cancelMissedCallsNotification", new Class<?>[]{}); if (method != null) { method.invoke(mTelecomManagerService, (Object[]) null); } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
当SDK<=20
public void cancelMissedCallsNotification() { ITelephony iTelephony = ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)); try { invoke(iTelephony, "cancelMissedCallsNotification", null, new Object[]{}); } catch (Exception e) { e.printStackTrace(); }
}
1.2 异步添加Fragment页签
为什么要异步呢?我觉得是为了功耗的考虑