此功能的主要设计思路是:
在短信添加附件的list列表中添加一个定时发送短信的选项,用户可以通过添加定时短信来设置短信要发送出去的时间,定时短信发送出去后,后台定时器会根据用户设置的时间进行定时判定,然后再重新发送短信。
关键技术:
1 定时短信时间的设置判断 (SetTimeSendMms.java)
2 在手机重启时,短信后台会接收开机广播,重新启动定时器定时
3 设置的定时短信存储到新建的数据库中(SetTimerMmsDatabase.java)
4 发送定时短信会调用系统的接口smsManager.sendTextMessage重新发生短信
以下是详细的代码实现(由于部分文件代码太过零散,单条贴出来太过混乱,不能做到参考和分析,所以将修改的具体文件贴出来,别且代码里有相关问题的备注,关键字请搜索“luoyalong@wind-mobi.com 20161215”)
有专门写的文档可以下载参考。https://download.csdn.net/download/m1126125223/10680960
1、添加定时短信
Mms/src/com/android/mms/ui/ComposeMessageActivity.java;代码太多未标出
Mms/src/com/android/mms/ui/AttachmentTypeSelectorAdapter.java
public static final int ADD_VCALENDAR = 8;
//luoyalong@wind-mobi.com 20161215 begin
public static final int ADD_TIMER = 9;
//luoyalong@wind-mobi.com 2015.07.29 end
------
protected static List<IconListItem> getData(int mode, Context context) {
//luoyalong@wind-mobi.com 20161215 begin
List<IconListItem> data;
if(android.os.SystemProperties.get("ro.sms.time.send").equals("1")){
data = new ArrayList<IconListItem>(9);
}else{
data = new ArrayList<IconListItem>(8);
}
//luoyalong@wind-mobi.com 20161215 end
------
if ((mode & MODE_WITH_VCALENDAR) == MODE_WITH_VCALENDAR) {
addItem(data, context.getString(R.string.attach_vcalendar),
R.drawable.ic_vcalendar_attach_menu, ADD_VCALENDAR);
}
}
//luoyalong@wind-mobi.com 20161215 begin
if(android.os.SystemProperties.get("ro.sms.time.send").equals("1")){
addItem(data, context.getString(R.string.attach_timer),
R.drawable.ic_attach_timer_holo_light, ADD_TIMER);
}
//luoyalong@wind-mobi.com 20161215 end
2、弹出绘制的时间选择器
Mms/src/com/android/mms/ui/SetTimeSendMms.java 代码太多未标出
Mms/src/com/android/mms/ui/SetTimeSendMmsUtil.java 代码太多未标出
3、设置短信定时的时间,并发送
Mms/src/com/android/mms/ui/MessageListItem.java 代码太多未标出
Mms/src/com/android/mms/transaction/SetATimerMmsReceiver.java 代码太多未标出
Mms/src/com/android/mms/transaction/SetMmsTimerAlarmReceiver.java 代码太多未标出
//定时短信重新发送
Ms/src/com/android/mms/transaction/SetTimerMmsDatabase.java 代码太多未标出
//定时短信和时间的数据库
Mms/src/com/android/mms/transaction/SmsReceiverService.java 代码太多未标出
Mms/src/com/android/mms/transaction/MessagingNotification.java
//设置发送的定时短信的状态
NotificationManager notificationMgr = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
if (isDownload) {
//luoyalong@wind-mobi.com 20161215 begin
if(android.os.SystemProperties.get("ro.sms.time.send").equals("1")){
Log.d(TAG, "next is to show failed mms notification !!!");
if(com.android.mms.ui.SetTimeSendMmsUtil.is_timer_mms == true){
Log.e("luoyalong01", "this mms is timer send , not show the notification !!!");
}else{
notificationMgr.notify(MESSAGE_FAILED_NOTIFICATION_ID, notification);
}
} else {
notificationMgr.notify(MESSAGE_FAILED_NOTIFICATION_ID, notification);
}
}
}
//luoyalong@wind-mobi.com 20161215 begin
4其他相关文件配置
Mms/AndroidManifest.xml
Mms/res/drawable-xhdpi/
Mms/res/layout/message_list_item_send.xml
等。。。