在前两篇文章中,我们了解了SMSPopup的概况
及研究了目录结构和Mainfest文件
,现在我们深入代码,来看看SMSPopup的具体实现。
SMSPopupConfigActivity
此类为程序入口,主要是SMSPopup的相关配置,该类继承了PreferenceActivity,该类是使用SharedPreferneces以键值对的形式保存相关配置数据的。
在onCreate方法中,addPreferencesFromResource(R.xml.preferences);作用是从preferences.xml中加载PreferenceActivity的UI。
preferences.xml中的元素有:
PreferenceScreen --xml顶层节点,若出现在子节点中,当点击此Preference时,会另外显示一屏
PreferenceCategory --代表一类相关的配置,用于分组
以下四类为具体的Preference,依次是单选框,输入编辑框,列表选择,铃声选择。
CheckBoxPreference
EditTextPreference
ListPreference
RingtonePreference
程序就是通过这些基本的Preference来显示及更改配置信息的,也可以自定义Preference,定义类,继承上面几种Preference中的一种,在xml文件中引用即可,net.everythingandroid.smspopup.preferences包中的5个类都是自定义的Preference。
SMSPopupUtilsService
此类中利用了Android Message机制来使不同线程间通信。分析之前建议先了解下Android线程相关知识:http://zjf1428.iteye.com/blog/695491
,文中详细描述了怎样使用Message、Handle、Looper相关类来完成线程间的通信。
Android程序在启动时,系统会启动一个对应的主线程,主线程主要负责处理与UI相关的事件,Android UI操作并不是线程安全的并且这些操作必须在主线程中执行,这就引发了一个问题,当主线程正在做一些比较耗时的操作的时候,如正从网络上下载一个大图片,或者访问数据库,由于主线程被这些耗时的操作阻塞住,无法及时的响应用户的事件,从用户的角度看会觉得程序已经死掉,为增强用户体验,Android设置了一个5秒钟超时时间:一旦用户的事件由于主线程阻塞而超过5秒 钟没有响应,Android会 弹出一个应用程序没有响应的对话框。作为开发者,应当尽量避免在主线程中执行比较耗时的操作。来看看此类中是怎样做的:
@Override
public void onCreate() {
HandlerThread thread = new HandlerThread(Log.LOGTAG,
Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
context = getApplicationContext();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public void onStart(Intent intent, int startId) {
//mResultCode = intent.getIntExtra("result", 0);
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
此类继承了Service(后台服务),在onCreate()方法中,首先定义了一个HandlerThread,为ServiceHandler的创建准备Looper,Looper是MessageQueue和Handler之间的桥梁,具体参见上面的文章。再看onStart()方法,构造了一条Message,包含了一个intent对象,改intent来自于SMSPopupUtils调用startService(intent),intent中包含了一条SmsMmsMessage(短信实体)和Action(标志将短信设为已读的动作)。最后一句mServiceHandler.sendMessage(msg)执行完成后,Message就被转到Handler处理
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
Log.v("SMSPopupUtilsService: handleMessage()");
int serviceId = msg.arg1;
Intent intent = (Intent) msg.obj;
String action = intent.getAction();
if (ACTION_MARK_THREAD_READ.equals(action)) {
Log.v("SMSPopupUtilsService: marking thread read");
SmsMmsMessage message = new SmsMmsMessage(
context, intent.getExtras());
message.setThreadRead();
} else if (ACTION_OTHER.equals(action)) {
}
finishStartingService(SMSPopupUtilsService.this, serviceId);
}
}
Handler类只有两个方法,一个构造方法,一个重写的handleMessage,用于处理sendMessage()发过来的消息,在handleMessage方法中,首先取出Message中包含的数据,根据Aciton做处理,此处Action表示将短信设为已读,由message.setThreadRead()完成。最后调用finishStartingService()停止Service并释放唤醒锁(释放CPU,使屏幕变暗)。
实际上,在创建需要与用户界面交互的长时间运行的任务时,Android为我们提供了更简单的方法---使用AsyncTask类,具体用法见上面的文章,接下来动手改造SMSPopupUtilsService类,我们用简便的AsyncTask来替代Handler,改造过程比较顺利,就遇到一个把方法参数写错的小错误,改造后的代码确实比原来的简洁干净些。
代码学习过程中,发现一处很有意思的地方:
if (ACTION_MARK_THREAD_READ.equals(action)) {
if (Log.DEBUG) Log.v("SMSPopupUtilsService: Marking thread read");
SmsMmsMessage message = new SmsMmsMessage(context, intent.getExtras());
message.setThreadRead();
} else if (ACTION_MARK_MESSAGE_READ.equals(action)) {
if (Log.DEBUG) Log.v("SMSPopupUtilsService: Marking message read");
SmsMmsMessage message = new SmsMmsMessage(context, intent.getExtras());
message.setMessageRead();
} else if (ACTION_DELETE_MESSAGE.equals(action)) {
if (Log.DEBUG) Log.v("SMSPopupUtilsService: Deleting message");
SmsMmsMessage message = new SmsMmsMessage(context, intent.getExtras());
message.delete();
} else if (ACTION_QUICKREPLY.equals(action)) {
if (Log.DEBUG) Log.v("SMSPopupUtilsService: Quick Reply to message");
SmsMmsMessage message = new SmsMmsMessage(context, intent.getExtras());
message.replyToMessage(intent.getStringExtra(
SmsMmsMessage.EXTRAS_QUICKREPLY));
} else if (ACTION_UPDATE_NOTIFICATION.equals(action)) {
if (Log.DEBUG) Log.v("SMSPopupUtilsService: Updating notification");
updateNotification(intent);
}
请注意前两个判断,完全相同,也就是如果符合第一个条件,if里面的代码或执行两边,也就是将信息两次置为已读,完全多余,看了一下最新版本,代码还是如此。
实际上参看AsyncTask的源代码
,发现原来AsyncTask的实现竟然就是使用Handler Message机制,只是把它封装得更易用些,我们还是要熟练使用Message来处理线程间通信。
分享到:
相关推荐
总的来说,通过学习SMSPopup开源项目的源码,开发者可以深化对Android广播接收器、自定义通知、UI设计、数据库操作、权限管理、线程控制以及版本管理等多个核心概念的理解。这不仅有助于提高个人技能,也提供了构建...
在IT行业中,Android开源项目是开发者们学习、借鉴和创新的重要资源。这些开源项目提供了丰富的代码示例,有助于提升开发者的技术水平,同时也推动了整个Android生态系统的进步。下面,我们将详细探讨这些开源项目的...
这十个Android开源项目是初学者和进阶开发者学习Android编程的重要资源,它们展示了各种实用功能和技术的应用,有助于提升编程技能和理解Android平台的工作原理。 【描述】:“十个Android经典开源项目”的完整项目...
以下是一些推荐的Android开源项目及其相关的知识点: 1. **Android 示例项目**:由Android核心团队提供的15个示例项目,覆盖了从基础到进阶的各种功能,包括游戏、图像处理、时间显示和快捷方式等。通过这些项目,...
从该项目代码中,可以学习到很多Android安全方面的内容,这些是你在开发应用时经常需要考虑的安全问题。 10、 WordPress的Android应用 当然在最后不能不提WordPress的Android应用了,这是WordPress官方开发团队...
"经典的Android项目——SMSPopup.zip" 这个标题表明我们讨论的是一个基于Android平台的开源项目,名为SMSPopup。这个项目很可能是用来处理短信通知的,因为"SMS"通常指的是手机短信服务,而"Popup"则暗示了它可能...
通过研究和学习Android-SMSPopup开源项目,开发者不仅可以掌握如何在Android平台上实现短信弹窗功能,还能深入理解Android应用开发的各个方面,包括系统广播、UI设计、数据库操作、权限管理等,为自己的Android开发...
下面推荐几个应用开源项目,这些项目不仅提供了优秀的创意,也可以直接掌握 Android内核的接口使用: 1、Android团队提供的示例项目 如果不是从学习Android SDK中提供的那些样例代码开始,可能没有更好的方法来...
在本资源包中,我们收集了一系列的Android开源项目,这些项目涵盖了从基础应用到复杂游戏开发的多个领域,为开发者提供了丰富的学习和实践材料。以下是对每个文件的详细解析: 1. **Android开源项目源码.doc**:这...
这些压缩包文件包含了一些经典的Android开源项目,它们是开发者学习和参考的理想资源,涵盖了不同的功能和应用场景。让我们逐一探讨这些项目及其可能涉及的关键知识点。 1. **TorProxy和Shadow开源项目**:这两个...
【Android SMSPopup速读短信源码】是一个针对安卓(Android)平台的开源项目,它提供了快速查看和处理新接收短信的功能。通过分析这个源码,我们可以深入理解Android系统中的短信处理机制,以及如何自定义UI来提升...
值得研究的10个安卓项目源码 1.Android SMSPopup 2.Android团队提供的示例项目 3.ConnectBot 4.Foursquare 5.OpenSudoku-android 6.Pedometer 7.Remote Droid
这些开源项目代表了Android开发的多样化,涵盖了游戏、图像处理、通知管理、日程管理、远程控制、自动化等多个领域。让我们一一深入探索这些经典项目的亮点和知识点。 1. **TorProxy和Shadow开源项目**: 这两个项目...
为了帮助开发者更好地理解和掌握Android开发的关键技术和实践技巧,以下将详细介绍十个值得关注的Android开源项目,这些项目不仅能够提供宝贵的实践经验,还能加深对Android系统内核的理解。 #### 1. Android团队...
对于Android开发者来说,深入学习开源应用项目是提升技能和拓宽视野的重要途径。以下是一些推荐的开源项目,它们涵盖了各种技术和功能,可以帮助开发者更全面地理解Android开发。 1. **Android团队提供的示例项目**...
【Android SMSPopup】是一个开源项目,其主要功能是截取手机接收到的短信内容,并在屏幕上以一个泡泡形状的浮动窗口展示,而非通过默认的系统短信应用。这个项目为开发者提供了一个很好的学习平台,让他们了解如何在...
《Android短信弹窗应用SMSPopup的编程解析》 在移动设备的世界里,Android系统以其开源性和灵活性赢得了广大开发者和用户的喜爱...对于想要提升Android开发技能的程序员来说,SMSPopup无疑是一个不可多得的学习资源。
通过对SMSPopup源码的分析,开发者不仅可以掌握Android短信处理的细节,还能学习到UI设计、事件处理、数据存储以及权限管理等多个方面的知识,这对于提升Android开发技能大有裨益。同时,源码实践也有助于理解...