我的红米1s移动版线刷包M521短信打不开了,上面显示几个短信,一点就返回主界面,不知道怎么处理,除短信功能不正

系统自带短信程序源码部分分析 - 业余Java/Android - ITeye技术网站
这里并不打算对整个短信源码进行分析,完全是看了某部分代码后的自我总结。我从GIT上clone了Conversation(即短信程序)的所有源码,结果编译不过。不过这对分析它的源码并不造成太大的阻碍。
这里主要对短信主界面的数据和UI的交互角度进行分析,因为我自己写的短信程序在加入获取联系人头像功能后,程序启动时花费的查询时间太长。虽然我也觉得系统默认的短信程序,甚至HandcentSMS,启动时间都不是很快。(大概是我的机器性能太差)
一、代码结构
Conversation中整体结构主要包括com.android.mms.data和com.android.mms.ui,如名字所示,大概就是数据处理部分和UI部分。数据部分主要是获取/缓存联系人信息、获取/缓存会话信息等。
ConversationList类是程序的主activity,派生于ListActivity,就是一个大的列表。此外:
ConversationListAdapter是这个ListView的adapter,派生于CursorAdapter;
ConversationListItem是一个自定义的ViewGroup,派生于RelativeLayout,用于表示会话列表的每一个item;
Conversation表示一个会话数据;Contact表示一个联系人;ContactList维护一个联系人列表;
RecipientIdCache用于开线程读取一个特殊的表,该表映射会话数据到联系人信息,也就是通过Recipient就可以获取联系人信息。
二、UI结构
这里的UI主要就是ConversationList/ConversationListAdapter/ConversationListItem三者之间的交互。
在layout中,conversation_list_item.xml作为这个ListView(ConversationList)的item定义,直接使用了ConversationListItem这个view:
&com.android.mms.ui.ConversationListItem xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="@drawable/conversation_item_background_unread"
android:paddingRight="10dip" &
这个自定义item最重要的工作,就是将会话数据绑定到UI控件上,例如QuickContactBadge。在ListView的使用中,要绑定数据,还有个方法就是自写adapter,在构造adapter时就传入所有数据。但是如你所见,这种方法需要先读取出所有的数据。
而这个系统自带的短信程序,则没有一次读入。这个自定义item还有个功能就是,作为一条联系人信息的更新监听器。读取联系人信息是非常慢的,因为会涉及到几个表的查询。在构造这个item时,程序在另一个线程中异步读取联系人信息,而item只有一个联系人的简要信息(电话号码)。当联系人读出来后,再通知它的监听器,也就是这个item,然后更新UI显示。
ConversationListAdapter中只实现了bindView和newView这两个函数,此外,它作为listView的AbsListView.RecyclerListener,还实现了onMovedToScrapHeap函数。
关于RecyclerListener,这里从源码级角度分析了下,大概意思就是ListView在处理item时,有个缓存机制。
三、数据与UI的映射
这部分才是重要的分析部分,也是我需要学习的部分。
ConversationList的onStart中,开启了一个异步查询,查询所有的会话:
protected void onStart() {
super.onStart();
startAsyncQuery();
startyAsyncQuery调用了Conversation.startQueryForAll函数,该函数说白了还是调用AsyncQueryHandler.startQuery函数:
public static void startQueryForAll(AsyncQueryHandler handler, int token) {
handler.cancelOperation(token);
handler.startQuery(token, null, sAllThreadsUri,
ALL_THREADS_PROJECTION, null, null, Conversations.DEFAULT_SORT_ORDER);
关于如何获取会话列表,其实就是个SQL的连表查询,可以参见这里:
当查询完后,android回调到自己实现的AsyncQueryHandler.onQueryComplete,该函数主要就是告诉adapter,we have done!:
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
switch (token) {
case THREAD_LIST_QUERY_TOKEN:
mListAdapter.changeCursor(cursor);
一旦adapter获得了一个cursor后,就会主动去取得listview的各项数据。以上便是获取会话列表的大致流程。
接下来看看联系人获取的流程:
adapter获得数据后,会调用bindView来绑定数据到UI的item:
public void bindView(View view, Context context, Cursor cursor) {
if (!(view instanceof ConversationListItem)) {
Log.e(TAG, "Unexpected bound view: " + view);
ConversationListItem headerView = (ConversationListItem)
Conversation conv = Conversation.from(context, cursor);
ConversationListItemData ch = new ConversationListItemData(context, conv);
headerView.bind(context, ch);
Conversation.from函数会先检查Conversation缓存中是否有该cursor对应的数据,没有的话则会从cursor中取:
public static Conversation from(Context context, Cursor cursor) {
// First look in the cache for the Conversation and return that one. That way, all the
// people that are looking at the cached copy will get updated when fillFromCursor() is
// called with this cursor.
long threadId = cursor.getLong(ID);
if (threadId & 0) {
Conversation conv = Cache.get(threadId);
if (conv != null) {
fillFromCursor(context, conv, cursor, false);
// update the existing conv in-place
Conversation conv = new Conversation(context, cursor, false);
Cache.put(conv);
} catch (IllegalStateException e) {
LogTag.error("Tried to add duplicate Conversation to Cache");
然后主要是fillFromCursor函数(如果是创建新的Conversation,其构造函数中也是调用了该函数),该函数就是简单地从cursor中getXXXX获取各个数据,并且,最重要的,获取联系人信息:
private static void fillFromCursor(Context context, Conversation conv,
Cursor c, boolean allowQuery) {
ContactList recipients = ContactList.getByIds(recipientIds, allowQuery);
注意这里allowQuery参数为false。
ContactList.getByIds函数根据Conversation中recipientIds获取出对应的address,然后根据address从联系人URI中进一步获取联系人信息。
public static ContactList getByIds(String spaceSepIds, boolean canBlock) {
ContactList list = new ContactList();
for (RecipientIdCache.Entry entry : RecipientIdCache.getAddresses(spaceSepIds)) {
if (entry != null && !TextUtils.isEmpty(entry.number)) {
Contact contact = Contact.get(entry.number, canBlock);
contact.setRecipientId(entry.id);
list.add(contact);
最终的contact被生成于Contact.get(entry.number, canBlock)中。该函数在canBlock为false的情况下,会push一个异步执行体(Runnable)到一个线程中。然后将contact返回。最终返回到adapter那一层的函数。
这个异步查询线程,会真正地去查询联系人信息。在此之前,外界获取出来的联系人不过是一个很简单的信息:只有电话号码。
adapter的bindView中,紧接着:
ConversationListItemData ch = new ConversationListItemData(context, conv);
headerView.bind(context, ch);
bind函数中很重要的操作,就是建立该会话对应的联系人对象的监听:
ContactList contacts = ch.getContacts();
if (DEBUG) Log.v(TAG, "bind: contacts.addListeners " + this);
Contact.addListener(this);
以上过程,即展示了会话数据是如何映射到ListView的item,及联系人信息是如何与会话和listview item建立联系(即异步查询,然后同步)。
值得一提的是:查询联系人信息都是在bindView时发生,当一个listview被显示出来后,未显示的item是不会被触发bind的,也就是说:在listview显示时,不会触发查询整个会话对应的所有联系人,只有显示出来的item才会涉及到查询联系人。
基于以上,我写了一个测试程序。结果似乎很好,就像系统自带的短信程序一样。启动速度依然不算快。问题的所在,似乎并不在于查询时间花费的很长。listview倒是早就显示出来了(看见了程序标题),但是items却要花些时间才能显示。
而且,我的测试程序更为恶心的是,listview在上下滚动时,会显得有点卡。经过一番折腾,发现是bindView里花的时间过长,后来加了Conversation的缓存,甚至去掉了日志,依然有点卡。不知道有否高手帮我解决下。
测试例子见附件。
1.10.2011 update
之前例子程序中ListView上下滚动时,会显得有点卡。本来都放弃不管了,结果今天打开eclipse时莫名其妙就想起这事:也许应该用ListActivity!结果一改,还真不卡了。注:系统的短信程序用的就是ListActivity。
下载次数: 315
浏览: 51145 次
来自: 成都
恩。不错。学习一下
你们都能运行吗
,我这里运行过后什么都没有啊
楼主QQ多少啊,有问题请教
写得不错。
我只关心,发信息成功的时候是什么广播?[笑话]妹妹群发短信:昨晚上你太给力了… - 饭饭TXT论坛
查看完整版本: [--
&Pages: ( 2 total )
[笑话]妹妹群发短信:昨晚上你太给力了…
话说我和我妹在同一个大学,然后每天晚上一起去锻炼,不要想歪了,就是去操场跑步,昨天跑的时候刚好碰到了我的一个长跑队的好朋友,然后我就说我们来比比,我妹也跟着我一起跑(主要是因为她怕黑,操场没灯),然后可想而知,我妹都快跑疯过去了。今天我问她还跑步不,她跟我回短信说:“昨天晚上你太给力了,我现在全身酸痛,估计要休息好几天,过几天再说。”然后GC来了,她的手机是触屏的,翻通讯录的时候一下没刷上力,然后,然后,直接群发给她的大学同学组群了......现在她还在给他同学解释到底是怎么回事......车上放天鹅湖音乐,一时兴起给6岁的女儿讲。女儿没有听过这个故事,于是简化讲到:一只天鹅变成美女,嫁给了王子。。。女儿无限忧郁道:王子让她生宝宝,她下个蛋怎么办?和LG去拍婚纱照的事情。1、我和LG两个人在和摄影师沟通。翻看很多样本,我指着其中一张新郎新娘两人背对背低头装恬静的照片对摄影师说:“我不要拍这种假兮兮的,我们要自然的,没有装b的长相,就不照装b的傻相!”摄影师惊诧不语,LG缓解气氛说:“我们喜欢自然的,自然的。”摄影师突然拍着我肩膀说:“哎呀妹子,爽快人啊!”2、摄影师介绍自然版样板,突然说:“妹子,你要自然的,要不要拍个裸体婚纱照啊?”我囧:“不用了,咱身材又不好。”摄影师:“这不用担心,完了我给你修修,保证你该大的地方大……”上下扫了我一眼,继续说:“该大的地方大,呃,该大的地方大。”好吧,我把它理解为夸我瘦!3、拍摄过程,摄影师为了迷惑本人,拼命夸:“恩,不错,妹子,你肩膀真好看!”继续:“你肩膀真好看!”然后还是:“你肩膀真好看!”我自以为幽默地回:“难道我只有肩膀好看么?”摄影师沉默数秒,继续说:“哎呀,妹子,你肩膀真好看!”上学时候经常丢暖瓶被子之类的…某天在启事栏看见一童鞋贴一副药方,不解,仔细端详:本人严重皮肤病,久医不好,昨天谁趁太阳公公晒操场时,抱走我被子的师傅,请吃药!!!班里有一对情侣,都是我的好友,两人虽在一起,但一直未挑明。女孩姓毕,正好我们一个老师也姓毕,所以平时我们就管女孩叫“毕老师”。这一天,帅男终于下定决心表白,我们几个上课去就谈论这事,正当一个人说“你们知道么?今天帅男终于要向毕老师表白了,真希望能成功”时,真正的毕老师出来了……老师表情很不自然“你们…你们回去好好劝劝他吧,我都结婚了”…下午去南岗地下逛,走了三个小时真想爬回去!一个卖纱巾的小屋 ,卖丝巾的小伙在喊,漂亮丝巾啦!给你老婆买一条吧!没有老婆的,给别人老婆买一条吧!高中的数学老师是我们班主任,此人酒量一般,还偏偏喜欢喝两杯。有一次中午不知道是谁请他吃饭了,喝得有点高了。下午上课开始将上次的考试题。老师拿着粉笔把黑板当成了卷子,极其工整地板书。正当我们都以为他没喝高的时候,发现这位已经写到黑板旁边的墙上去了,还一个劲地问我们:今天的粉笔怎么和黑板一个颜色呢,你们在下面能看出来吗?于是我们都内伤了。昨日向老公炫耀自己的胸器,老公不屑的表情,老婆我气呼呼:『难道你还见过比这更大的?』老公淡定回答:『当然,大学时候有个女同学,那才叫胸器呢?』老婆我怒道:『什么状况,从实招来!』老公依然淡定:『话说当年跳集体舞,就是大家手拉手围成一圈的那种。跳到热烈处,她的衣服就全抽上去了,胸器一览无余,汹涌澎湃。』『啊?她不知道吗?』『知道啊。』『那她为什么不整理衣服?』『不能啊,她两只手都被别人拉住的啊!』老妈总是嫌我踢被子…晚上要去我房间给我盖被子很累,于是便逼我和她一个床睡。半夜,我突然感到被子一点点没了…原来是老妈把被子拉走了裹到身上。我使劲拽了几下…居然没拽动…正要放弃…老妈似乎醒了摸摸我身上居然是光溜溜的,捉起我来就打,死妮子,叫你踢被子,叫你踢被子…我姐25了,还木男朋友,我妈的姐姐也就是我的大姨经常给她安排相亲,都木有成。刚刚一大家子人在大姨家吃饭。又说到这事、我大姨说:“婷婷啊,妈明天给你安排了相亲,你去见见吧”我姐说:“怎么又介绍,他是干嘛的”大姨:“挺好的男人,在中国特别行动部队”我姐满脸惊讶:“当兵的啊?我喜欢,那是空军还是陆军啊”这时大姨说了句话差点把我们雷翻了“哪个军也不是,是个城管”昨天去央财zhaopin,拿回来一堆简历,现已按如下顺序精选:1、剔除所有党员,2、剔除所有学生会干部后,再从剩下的人中挑选。原因有三个:我不认为党员有独立思想,除非有证据表明为潜伏;第二,学生会干部是啥样,你我都清楚...破学校出了个新规定、上课不让去厕所。某天、一男生水喝多了,上课实在憋不住了,就试图博取老师的同情心、结果特悲剧的被告知:憋着、憋坏了我带你看去! 那哥们满脸红黑交错(憋的、无语的)这时他旁边的一男童鞋、飞快的从桌里掏出了小半瓶矿泉水、一饮而尽、然后把空瓶子递给了他…hll的来了句 先用这个吧…那哥们用特忧郁的眼身看了他一眼,问了周围一句:你们谁有营养快线的?这个口太小……
太好笑了,亲差点笑到断气。。。。
最后一个是广告贴吧 ·~~
我也是看见最后一个 才喷了0 0
最后那个还好,&&貌似现在都喜欢带点色的?还有之前手拉手跳舞的那个。莫非莫非, 是我太....不过话说生活中的喜剧 还真是无处不在啊。
呵呵 都蛮好玩的
摄影师赚俩钱儿也不容易啊汗
你们谁有营养快线的?这个口太小……这个哥们抄有才的啊~~
很搞笑,那个zhaopin的是不是真的啊?那样党员岂不很惨?还有啊。zhaopin为什么是非法词语呢?
开心一下,都很好笑啊。
现在的笑话咋都跟黄段勾搭上了
果然很给力,这些笑话都没看过啊
好吧最后一个亮了啊有这回答滴咩
噗,都很好笑呀,尤其是拍婚纱照那个
哈哈,每天都能看到很多给力的小笑话,谢谢分享呢!
呵呵,我都笑喷了几次了,太有趣了
嗯,有几个还挺逗的,有的我欣赏不了
╮(╯▽╰)╭最好一个我想歪了!!
可怜的 妹妹哟 …噗呵呵呵&&最后一个好好笑…
最后一个,那个递瓶子的男生会很郁闷吧
看到最后一个时喷了,强大啊、、
最后一个是亮点啊啊话说第一个真的很难解释清
最后一个实在是高啊,很巧妙的推广啊!
哈哈~好好笑啊~
难道是我笑点高了?!~!?~?!~······还是说我面部肌肉迟钝了????
噗----------- 看到营养快线我内伤了osz...这哥有欧美血统吧...
笑遭了啊!要断气了
哈哈哈 都挺好笑的 好生活化好真实的笑话
“王子让她生宝宝,她下个蛋怎么办?“小孩子的话最可爱了
噗 都是些搞笑的片段啊 喜感呢
呵呵,太好笑了呢~~~~
哈哈,真是太好笑了。
&&&& 话说高中的时候我们文科班稀有的那几个男生很喜欢拿营养快线说事。。
&&&&&&&&有的好的有的很冷~~~~~
噗 好逗 拍婚纱照那个摄影师真腹黑啊。。。
招&聘的那个好,给广大一般的大学生群众打了强心剂
看到最后一个 喷了
太好笑了,亲差点笑到断气。。。。
太搞笑了。。。。 笑~~~~~~~~~
哈哈,太搞笑了,那个摄影师好可怜噢,赚钱不容易啊!
只能說這種東西每次都是最後一個故事亮了~!
扑哧 这妹妹回答的还真是…脑神经少一根儿么
话说最后那个 额 脉动也行的说 噗。。
哈哈,有些笑话实在是太坑爹了
哈哈,妹妹的尴尬~~
看见最后一个 才喷了0 0 && 太好笑了
漂亮丝巾啦!给你老婆买一条吧!没有老婆的,给别人老婆买一条吧!
这个口太小,汗,这个男的也太强悍了
这些也太搞笑了吧,还不错哈
看到最后,嘴都快合不上了
查看完整版本: [--
Powered by phpwind Code ©彩信打不开,一点击图片就返回到了短信的界面,求解_百度知道
彩信打不开,一点击图片就返回到了短信的界面,求解
cn/content-19-6598-1.html更多MIUI技巧和优惠活动可以关注MIUI官方微博
已回答987519
响应时间&7小时
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 口袋妖怪移动版 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信