文献标识码: A
文章编号: 0258-7998(2012)12-0126-04
随着3G业务的全面推广,使用手机进行实时交流的需求也越来越大,短信服务由于其快捷方便和良好的交互性[1]广受青睐。通常使用手机发送短信的形式比较单一,在需要发送信息时必须由人工干预将短信发送给一个或多个联系人,而且同时发给多人时,短信内容相同。而人们在繁忙的工作和学习中往往会忘记一些必要的短信祝福、合作提醒等。为了解决这一问题,本文在Android平台下,采用SharedPreferences、SQLite进行数据存储,利用Service组件实现系统后台运行,使用BaseAdapter适配器进行用户界面显示,设计了一个自发短信系统。该系统可以随意设置短信内容、发送时间,在指定的时间当天,由系统自动给好友、生意伙伴等发送祝福短信、合作提醒,也可以设置给多人发送不同的短信。
1 Android系统
Android是Google开发的基于Linux开放性内核的手机操作系统,目前已广泛应用于智能手机中。Android系统的软件结构包含操作系统、中间件及一些关键的平台应用程序。该系统采用软件堆层(Software Stack)的架构[2-3],主要分为4个部分:(1)应用层,采用Java语言编写,运行在Dalvik虚拟机,供用户使用的应用程序;(2)应用框架层,使用API框架编写Google发布的核心应用,开发人员可以使用这些框架开发自己的应用; (3)系统运行库层;(4)Linux内核层,即硬件和软件栈之间的抽象层,提供了Android系统的核心服务。
2 系统设计
自发短信系统是用户预先设定的信息内容和发送时间的好友列表,系统每24 h检测一次好友信息。当好友的发送时间与手机设定时间一致时,就将该好友添加到发送集合中,由系统自动完成定制短信的发送。
2.1 系统功能设计
按照用户使用短信服务的习惯和需求,自发短信系统的主要功能模块如图1所示。
(1)好友管理模块:显示已添加的好友信息(包括头像、姓名、倒计时天数及发送状态等);添加、修改、删除好友信息。
(2)短信管理模块:显示用户设置的待发送短信内容;修改短信内容。
(3)后台检测服务模块:该模块不间断地在后台运行,检测好友列表中的发送日期与手机日期是否相同。如果相同,则根据选定的短信内容自动地向该好友发送信息,并在发送完成后修改发送状态信息。如果不相同,则修改倒计时天数。
2.2 数据存储设计
随着软件应用程序逐渐模块化,嵌入式数据库可直接在应用程序进程中运行,提供了零配置运行模式,并且资源占用非常少。Android系统支持多种数据存储技术,其中有简单信息存储方式SharedPreferences[4],也有内存占用少、效率高。支持 SQL 语言的轻量级嵌入式数据库引擎——SQLite。在进行开发设计时,结合功能需求和软件性能,本系统采用了SharedPreferences进行简单短信信息存储,及SQLite数据库存储数据量较大的好友信息。
短信信息以sms_db.xml为文件名,存储在默认位置/data/data/<包名>/shared_prefs目录下,其内容格式如下:
<?xml version=′1.0′encoding=′utf-8′standalone=′yes′?>
<map>
<string name="sms1">祝宝贝生日快乐,天天开心!</string>
<string name="sms2">开业大吉,生意兴隆!</string>
……
</map>
数据库myinformation.db存储好友信息,结构如表1所示。
3 系统功能实现
系统整体使用MVC模式设计,将数据(Model)、界面(View)、控制(Controller)分为不同的模块,不仅使程序结构更加清晰,代码更加健壮,而且降低了程序之间的耦合度,提高了模块化程度[5]。
3.1 好友管理
3.1.1 好友列表显示界面
系统运行后,首先调用MainActivity.java显示主界面,如图2所示。主界面上的好友列表由ListView组件来实现,该组件中的数据由继承了BaseAdapter自定义的MainListAdapter适配器类来填充。实现代码如下:
Cursor c = managedQuery(MyInformation.CONNECT_URI,
MyInformation.SelectStrArr, null, null,MyInformation.DEFAULT_
SORT_ORDER);
List<User> mList = new ArrayList<User>();
c.moveToFirst(); // 实例化游标对象,查找数据库
if (c.getCount() > 0) {
do {
mList.add(new User(c));
} while (c.moveToNext());
}
c.close();
ListView mainListView = (ListView) findViewById(R.id.
mainlist); // 添加用户到集合
MainListAdapter mainListAdapter = new MainListAdapter
(this, mList); // 实例化自定义适配器
mainListView.setAdapter(mainListAdapter);
// 给ListView设置适配器
3.1.2 添加好友信息界面
用户单击图3主界面上的“添加好友”菜单后,将执行如下代码:
Intent intentAdd = new Intent(MainActivity.this, InformationAdd.class);
MainActivity.this.startActivity(intentAdd)
然后显示如图3所示“添加好友信息”界面。通过此界面,可以设置好友姓名、电话号码、定时发送时间(生日)、定时开启状态及短信内容。短信内容可以单独设置,也可以点击“选择已有的祝福”按钮选择定制短信。
3.2 短信管理
用户单击图2主界面上的“编辑短信”菜单后,执行PrepareSms类,该类继承Avtivity类,实现了OnClickListener接口。然后进入短信显示界面,通过自定义SelectSharedPreferencesDb类实例对象的getSMS( )方法读取sms_db.xml文件,并把短信内容显示在TextView上。单击短信显示文本框TextView,进入短信内容编辑界面,如图4所示。编辑完成后调用saveSMS()方法保存短信内容到sms_db.xml文件,代码如下:
public class SelectSharedPreferencesDb {
public static Map<String, String> getSMS(Context con) {
Map<String, String> map=new HashMap<String, String>();
SharedPreferences mysp = con.getSharedPreferences
("sms_db",Activity.MODE_PRIVATE); // 获取sms
map.put("sms1", mysp.getString("sms1", "宝贝!祝你生日快乐!!"));
for (int i = 2; i < 11; i++) {
String content = mysp.getString("sms" + i, "未设置");
map.put("sms" + i, content);}
return map;
} //默认有第一条短信内容,可以修改
public static void saveSMS(Context con, String num, String smscontent) {
SharedPreferences mysp = con.getSharedPreferences
("sms_db", Activity.MODE_PRIVATE);
mysp.edit().putString(num, smscontent).commit(); }
} // 保存sms
3.3 后台检测服务
为了实现系统在指定日期自发短信,必须启动监听测试服务,并且始终在后台运行,每隔24 h自动检测手机日期与指定日期是否一致,并作相应处理。Android系统提供了Service组件来实现服务的后台运行[6],通过实现Runnable接口的方法启动线程对短信发送日期进行检测。本系统自定义一个MainService类,它继承了Service,实现了Runnable接口具体实现功能。
3.3.1 Service后台服务
Service组件与Activity组件类似,但它一直在后台运行,没有用户界面[7],该组件的启动有两种方式:context.startService()和context.bindService()。开发步骤如下:
(1) 继承Service类
public class MainService extends Service implements Runnable {……}
(2)在AndroidManifest.xml文件中的<application>节点里对服务进行配置
<service android:name="ie.nnutc.edu.cn.MainService" >
<intent-filter>
<action android:name= "ie.nnutc.edu.cn.MainService "/ >
</intent-filter>
</service>
(3) 启动Service
Intent it = new Intent("ie.nnutc.edu.cn.MainService ");
this.startService(it)
3.3.2 实现时间检测和短信发送线程
在Java中通过继承Thread类和实现Runnable接口两种方式实现多线程,但由于一个类只能继承一个父类[8],而MainService类已经继承了Service类,所以本系统采用Runnable接口来实现时间检测和短信发送线程。
当检测到发送日期与手机日期相同时,将好友信息加入发送集合,产生一个Message类信号放入消息队列,并分发给Handler进行处理。Handler接收到消息后启动短信发送代码(本系统将该功能封装成sendmessage方法)实现短信发送。部分代码如下:
Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SEND_MESSAGE:
sendmessage(……); //执行自发短信任务
break;
}
super.handleMessage(msg);
}
}
结合Android系统手机用户的实际需要,本文基于SQLite存储技术、Service后台服务技术和消息处理机制设计了自发短信系统,成功地解决了按时发送定制信息这一问题。通过实际项目验证了设计的正确性和可行性。随着3G的到来,利用 Android系统提供的拍照、录音等功能,也可实现图片、音频等多媒体信息的自动发送,从而使自发短信系统的应用前景更加广泛。
参考文献
[1] 沈冰,陈向东,黄馨竹,等.基于J2ME技术的短信智能回复系统的设计与实现[J].计算机应用研究,2007,24 (12):263-265.
[2] 王向辉,张国印,沈洁.Android应用程序开发[M].北京:清华大学出版社,2010.
[3] 姚昱昱,刘卫国.Android的架构与应用开发研究[J].计算机系统应用,2008,17(11):110-112.
[4] 郭宏志.Android应用开发详解[M].北京:电子工业出版 社,2010.
[5] GAO J,MODAK M,DORNADULA S,et al. A wirelessbased text chatting system[C]. 2004 IEEE International Conference on E-Commerce Technology, 2004.
[6] 张元亮.Android开发应用实战详解[M].北京:中国铁道出版社,2010.
[7] 王秀芳,杨阳.基于Android的YOBO在线音乐播放器[J]. 科学技术与工程,2011,11(11):2506-2509.
[8] 张雪萍,鲍丹,王家耀.Java多线程测试策略及测试方法探讨[J].计算机应用研究,2006,23(11):12-14.