收到VPSYou的故障邮件

时间:2011年09月13日作者:么吉查看次数:56 views评论次数:0

  本博客前段时间决定放弃Vpsyou的VPS,我看来这个决定还是明智的. 今天收到Vpsyou发过来的邮件,原文如下:

T2机房openvz16客户您好:
您的vps所在T2机房openvz服务器节点名为openvz16于2011年9月11日晚23:00 左右突然出现无法连接访问的情况, 

我们联系机房后查看:无法ssh或KVM进入服务器,重启母鸡失败,无法进入母鸡,使用急救模式进入服务器查看,无法查看磁盘分区,目录全无,文件系统损坏。。。,

这是一次之前毫无预兆,突然出现的非常严重的情况,目前暂时不排除有人为的因素。

目前正在竭尽全力。查找原因及寻找有无恢复解决的办法,

出现这样的情况,真的非常抱歉,一旦有任何新的情况我们将一时间邮件通知说明!

(登录vpsyour.com可以查看你的vps所在服务器节点名,目前vps处于offline状态,其他节点的用户不用理会)

2011年9月11日06:43

  我不肯定这个节点是跟我之前买的VPS相关的,但可以知道有一批Vps的不能正常访问,连数据都有可能全没了. 如果没有做好备份的话那就惨了.如果博客一段时间不能访问的话,影响很大的,并且现在都不知道数据能否恢复回来.

Android推送方式比较

时间:2011年09月08日作者:么吉查看次数:1,318 views评论次数:0

推送方式的基础知识
  当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如《地震及时通》就需要及时获取服务器上最新的地震信息。要获取服务器上不定时更新的信息一般来说有两种方法,第一种是客户端使用Pull(拉)的方式,隔一段时间就去服务器上获取信息,看是否有更新的信息出现。第二种就是服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。
  虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push is better than pull。因为Pull方式更费客户端的网络流量,更主要的是费电量。

  在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。

  在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能。

  Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。

C2DM操作过程图:

但是经过一番研究发现,这个服务存在很大的问题:

1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;

2)C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的;

  有了上述两个使用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习与参考之用。

  即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。下面我来介绍几种常见的方案:

1)轮询(Pull):应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。

2)SMS(Push):在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现。

3)持久连接(Push):这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允许在低内存情况下杀死系统服务,所以你的通知服务很可能被操作系统Kill掉了。

  前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk以及GoogleVoice都可以实现实时更新的。

采用MQTT协议实现Android推送
  MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。

wmqtt.jar 是IBM提供的MQTT协议的实现。你可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。

Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。

采用XMPP协议实现Android推送
  这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。
  XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。

  androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。

  androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。

  androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器架构如下:

  最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。

  这个解决方案的最大优势就是简单,我们不需要象C2DM那样依赖操作系统版本,也不会担心某一天Google服务器不可用。利用XMPP协议我们还可以进一步的对协议进行扩展,实现更为完善的功能。

  采用这个方案,我们目前只能发送文字消息,不过对于推送来说一般足够了,因为我们不能指望通过推送得到所有的数据,一般情况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。

总结
  现在使用XMPP协议进行推送的方式慢慢多了,主要是原因是比较简单,我后面的博文将会写一些相关androidpn服务器的内容。本人的其中一个软件<足球即时比分>,计划进行升级,从之前的拉(Pull)方式改为 推(Push)方式,我相信这样将会减小服务器的压力,并且比分更新将会更新加及时。

返回 : Android开发博文汇总

本博客决定放弃迁移至VPSYou

时间:2011年08月27日作者:么吉查看次数:240 views评论次数:3

  在前一段经过了一个月的测试与观察,最终决定放弃将本博客迁移到VPSYou.(之前我的博文有这两个VPS的的比较,说了一些想迁移至VPSYou的理由 : [ VPSYou与BurstNet比较 ])

  后来在经过一个月的测试里发现了一些问题,如下 :
1 ) 小量的访问就让CPU占用率很高(用top命令看到负载去到0.4-0.6之间,很多时候去到1.5-2.0,还是小访问量的时候. 如果是BurstNET的话,小于0.1) .并且这种情况是一直都存在的,不是偶尔这样的. 这样根本就无法接受. 从配置看VPSYou的cpu应该是比burstNet要好的.
2 ) VPSYou网速是比较快,ping的反应也比burstNET快些,但是由于CPU负载比较高,最终反应比burstNET还才慢.

总结 :
1 ) 相信是VPSYou的OPENVZ超卖吧,性能根本就跟不上,只是看上去配置好.还好,当时没有直接迁移过去.
2 ) 有可能是OPENVZ的原因,相信用XEN应该会好一些. 这个我就没有考虑试试VPSYou的XEN了,如果了解的朋友可以留言告诉我.
3 ) 由于CPU负载问题,所以就决定不考虑继续使用VPSYou了. 先用回burstNET,当流量上去了,再考虑一些更好的.

PS : 现在正在考虑 photonvps,价钱会贵一些,一直评价都不错. 正在用的朋友麻烦留言说一下使用情况吧.

PSPS : 先说明,我用的VPSYou是 OPENVZ版本的VZ512. 价格为6美元(42RMB).
VPSYou VZ512详细信息 :
硬盘 : 30 GB
独立内存 : 512MB
Burst内存: 1024 MB
CPU限制MHz : 700×4核
IP地址 : 1个
虚拟技术 : OPENVZ

BurstNET VPS的详细介绍 :
VPS PACKAGE #2
VPS Software: vePortal™ / OpenVZ™
CPU: 1500MHZ GUARANTEED
Memory: 1GB GUARANTEED
Disk Space: 50GB (RAID BASED CONFIG)
Bandwidth: 1000GB/MONTH
IP Addresses: 2 (IPv4) + IPv6
Management: BASIC MANAGED
DDOS Protection: CISCO™ GUARD
FREE SETUP $9.95/MONTH

相关博文 :
VPSYou与BurstNet比较
Ronald的天空两个月了
计划将博客从BurstNet迁移到VPSYou

Eclipse最全快捷键

时间:2011年08月21日作者:么吉查看次数:104 views评论次数:0

常用快捷键:
Ctrl+1 快速修复
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在当前行插入空行(原理同上条)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Ctrl+T 快速显示当前类的继承结构
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小键盘) 展开当前类中的所有代码
Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+X 把当前选中的文本全部变味小写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)
Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)
Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)
Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)
Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)
Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)
Alt+Shift+I 合并变量(可能这样说有点不妥Inline)
Alt+Shift+V 移动函数和变量(不怎么常用)
Alt+Shift+Z 重构的后悔药(Undo)

编辑
全局 查找并替换 Ctrl+F
文本编辑器 查找上一个 Ctrl+Shift+K
文本编辑器 查找下一个 Ctrl+K
全局 撤销 Ctrl+Z
全局 复制 Ctrl+C
全局 恢复上一个选择 Alt+Shift+↓
全局 剪切 Ctrl+X
全局 快速修正 Ctrl1+1
全局 内容辅助 Alt+/
全局 全部选中 Ctrl+A
全局 删除 Delete
全局 上下文信息 Alt+?
Alt+Shift+?
Ctrl+Shift+Space
java编辑器 显示工具提示描述 F2
java编辑器 选择封装元素 Alt+Shift+↑
java编辑器 选择上一个元素 Alt+Shift+←
java编辑器 选择下一个元素 Alt+Shift+→
文本编辑器 增量查找 Ctrl+J
文本编辑器 增量逆向查找 Ctrl+Shift+J
全局 粘贴 Ctrl+V
全局 重做 Ctrl+Y

查看
全局 放大 Ctrl+=
全局 缩小 Ctrl+-

窗口
全局 激活编辑器 F12
全局 切换编辑器 Ctrl+Shift+W
全局 上一个编辑器 Ctrl+Shift+F6
全局 上一个视图 Ctrl+Shift+F7
全局 上一个透视图 Ctrl+Shift+F8
全局 下一个编辑器 Ctrl+F6
全局 下一个视图 Ctrl+F7
全局 下一个透视图 Ctrl+F8
文本编辑器 显示标尺上下文菜单 Ctrl+W
全局 显示视图菜单 Ctrl+F10
全局 显示系统菜单 Alt+-

导航
java编辑器 打开结构 Ctrl+F3
全局 打开类型 Ctrl+Shift+T
全局 打开类型层次结构 F4
全局 打开声明 F3
全局 打开外部javadoc Shift+F2
全局 打开资源 Ctrl+Shift+R
全局 后退历史记录 Alt+←
全局 前进历史记录 Alt+→
全局 上一个 Ctrl+,
全局 下一个 Ctrl+.
java编辑器 显示大纲 Ctrl+O
全局 在层次结构中打开类型 Ctrl+Shift+H
全局 转至匹配的括号 Ctrl+Shift+P
全局 转至上一个编辑位置 Ctrl+Q
java编辑器 转至上一个成员 Ctrl+Shift+↑
java编辑器 转至下一个成员 Ctrl+Shift+↓
文本编辑器 转至行 Ctrl+L

搜索
全局 出现在文件中 Ctrl+Shift+U
全局 打开搜索对话框 Ctrl+H
全局 工作区中的声明 Ctrl+G
全局 工作区中的引用 Ctrl+Shift+G

文本编辑
文本编辑器 改写切换 Insert
文本编辑器 上滚行 Ctrl+↑
文本编辑器 下滚行 Ctrl+↓

文件
全局 保存 Ctrl+X
Ctrl+S
全局 打印 Ctrl+P
全局 关闭 Ctrl+F4
全局 全部保存 Ctrl+Shift+S
全局 全部关闭 Ctrl+Shift+F4
全局 属性 Alt+Enter
全局 新建 Ctrl+N

项目
全局 全部构建 Ctrl+B

源代码
java编辑器 格式化 Ctrl+Shift+F
java编辑器 取消注释 Ctrl+\
java编辑器 注释 Ctrl+/
java编辑器 添加导入 Ctrl+Shift+M
java编辑器 组织导入 Ctrl+Shift+O
java编辑器 使用try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。也可以使用Ctrl+1自动修正。

运行
作用域 功能 快捷键
全局 单步返回 F7
全局 单步跳过 F6
全局 单步跳入 F5
全局 单步跳入选择 Ctrl+F5
全局 调试上次启动 F11
全局 继续 F8
全局 使用过滤器单步执行 Shift+F5
全局 添加/去除断点 Ctrl+Shift+B
全局 显示 Ctrl+D
全局 运行上次启动 Ctrl+F11
全局 运行至行 Ctrl+R
全局 执行 Ctrl+U

重构
作用域 功能 快捷键
全局 撤销重构 Alt+Shift+Z
全局 抽取方法 Alt+Shift+M
全局 抽取局部变量 Alt+Shift+L
全局 内联 Alt+Shift+I
全局 移动 Alt+Shift+V
全局 重命名 Alt+Shift+R
全局 重做 Alt+Shift+Y

Android有未接来电后处理(判断未接来电)

时间:2011年08月21日作者:么吉查看次数:487 views评论次数:1

  在Android的手机状态中没有未接来电的监听器,所以如果想当手机有未接来电后进行处理,这时候就需要自己对手机的状态判断是未接来电后再进行处理.

实现思路 :
1,继承PhoneStateListener后,当手机的状态改变后将会触发onCallStateChanged.手机的状态分为CALL_STATE_RINGING(响铃中),CALL_STATE_IDLE(空闲),CALL_STATE_OFFHOOK(忙音).
2,记录上一次的手机状态,如果的手机现在的空闲,上次的状态响铃中的话,就可以判断是未接来电.

不足:
1,我现在的处理不能判断出是用户是否主动不接电话.

实现步骤:
1,编写CallListener,处理手机状态变更监听,当状态改变时进行处理。如果想知道如何在Android发送短信可以看我另一博文[ Android中发送短信(sms) ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package rbase.app.smshelpmate.call.listener;
 
import java.text.MessageFormat;
 
import rbase.app.smshelpmate.Config;
import rbase.app.smshelpmate.R;
import rbase.app.smshelpmate.call.enums.CallStateEnum;
import rbase.app.smshelpmate.forward.ForwardManager;
import rbase.app.smshelpmate.forward.enums.ForwardType;
import rbase.app.smshelpmate.forward.vo.ForwardParam;
import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
 
/**
 * @author www.r-base.net
 */
public class CallListener extends PhoneStateListener {
	private static final String TAG = "sms";
	private static int lastetState = TelephonyManager.CALL_STATE_IDLE; // 最后的状态
	private Context context;
 
	public CallListener(Context context) {
		super();
		this.context = context;
	}
 
	public void onCallStateChanged(int state, String incomingNumber) {
		Log.v(TAG, "CallListener call state changed : " + incomingNumber);
		String m = null;
 
		// 如果当前状态为空闲,上次状态为响铃中的话,则破觚为认为是未接来电
		if(lastetState ==  TelephonyManager.CALL_STATE_RINGING 
		        && state == TelephonyManager.CALL_STATE_IDLE){
			sendSmgWhenMissedCall(incomingNumber);
		}
 
		// 最后的时候改变当前值
		lastetState = state;
	}
 
	private void sendSmgWhenMissedCall(String incomingNumber) {
	     // ... 进行未接来电处理(发短信,发email等等通知)
	}
}

2,编写CallReceiver,注册来电广播接收器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package rbase.app.smshelpmate.call.service;
 
import rbase.app.smshelpmate.Const;
import rbase.app.smshelpmate.call.listener.CallListener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
 
/**
 * @author www.r-base.net
 */
public class CallReceiver extends BroadcastReceiver{
	public void onReceive(Context context, Intent intent) {
		Log.i("sms", "CallReceiver Start...");
		TelephonyManager telephony = (TelephonyManager) context
				.getSystemService(Context.TELEPHONY_SERVICE);
		CallListener customPhoneListener = new CallListener(context);
 
		telephony.listen(customPhoneListener,
				PhoneStateListener.LISTEN_CALL_STATE);
 
		Bundle bundle = intent.getExtras();
		String phoneNr = bundle.getString("incoming_number");
		Log.i("sms", "CallReceiver Phone Number : " + phoneNr);
	}
}

3,在AndroidManifest.xml中的application节点下添加如下代码.进行注册电话状态改变广播接收.

1
2
3
4
5
6
7
8
9
<manifest ...>
  <application ...>
    <receiver android:name=".call.service.CallReceiver">
	    <intent-filter android:priority="100">
		    <action android:name="android.intent.action.PHONE_STATE" />
	    </intent-filter>
    </receiver>
  </application>
</manifest>

4,在AndroidManifest.xml中添加读取手机状态的权限.

1
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

总结:
  通过以上的步骤,当手机有未接来电时 sendSmgWhenMissedCall 该方法就会触发,就可以进行相应的处理.本人的其中一个应用(RBase短信助手) 就是用以上的代码实现了当手机有未接来电后可以发短信给指定的手机进行通知. 想了解的朋友可以到这里下载 : http://www.goapk.com/pkg/rbase.app.smshelpmate

相关博文:
Android中发送短信(sms)
Android文章汇总

Android中发送短信(sms)

时间:2011年08月21日作者:么吉查看次数:104 views评论次数:0

  分享一下本人中其中一个应用(手机短信转发)的代码,主要是实现短信的发送功能。
  如果想做一些短信相关的应用,以下的代码可能对你有帮助。
相关的软件可以访问我发布在goapk里的页面 : http://www.goapk.com/pkg/rbase.app.smshelpmate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package rbase.app.smshelpmate.sms.util;
 
import java.util.ArrayList;
 
import rbase.android.core.util.StringUtils;
import rbase.android.core.util.UIUtil;
import rbase.app.smshelpmate.R;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.SmsManager;
import android.util.Log;
 
/**
 * SMS 的工具类,主要是发送短信的辅助
 * 
 * @author r-base.net
 */
public class SmsUtil {
 
	public static void sendSMS(Context ctx, String phoneNumber, String message) {
		sendSMS(ctx, phoneNumber, message, null);
	}
 
	/**
	 * 发送sms
	 * 
	 * @param ctx Android 的 Context
	 * @param phoneNumber 发送的手机号码
	 * @param message 发送短信的内容
	 * @param toastText 发送后显示的toast内容
	 */
	public static void sendSMS(Context ctx, String phoneNumber, String message,String toastText) {
		Log.d("sms", "sending sms");
 
		// 检查手机号和转发内容,主要是检查手机号码与发送内容的合法性
		if(!checkMessage(ctx, phoneNumber, message)){
			return;
		}
 
		// 得到SMS的管理类
		SmsManager smsMgr = SmsManager.getDefault();
 
		// 如果大于70个字符需要分割成多条短信发送
		if (message.length() > 70) {
			ArrayList<String> msgs = smsMgr.divideMessage(message);
			for (String msg : msgs) {
				smsMgr.sendTextMessage(phoneNumber, null, msg, null, null);
			}
		} else {
			smsMgr.sendTextMessage(phoneNumber, null, message, null, null);
		}
 
		if(toastText == null){
			UIUtil.showMessage(ctx, "forward sms to "+ phoneNumber);
		}else{
			UIUtil.showMessage(ctx, toastText);
		}
	}
 
        // 检查合法性
	private static boolean checkMessage(Context ctx,String phoneNumber,String message){
		if(StringUtils.isEmptyTrim(phoneNumber)){
			UIUtil.showMessage(ctx, R.string.error_forward_phone_is_empty);
			Log.d("sms", "Forward Failure! Forward phone is empty!");
			return false;
		}
 
		if(StringUtils.isEmptyTrim(message)){
			UIUtil.showMessage(ctx, R.string.error_forward_message_is_empty);
			return false;
		}
 
		return true;
	}
}

注:需要添加以下的权限。

	<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
	<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>

郁闷的一天,车被追尾了

时间:2011年08月07日作者:么吉查看次数:51 views评论次数:2

  今天刚买没多久的一辆高尔夫6被追尾了,唉。。。相当的郁闷,提车不到两个星期,才开了1300公里,磨合期都还没有过就要去4S店修了。
  后面追尾的也是一汽大众的迈腾,大众撞大众啊。真是受伤~~ 心里想如果撞的是小日本的车会怎么样呢?呵呵
  虽然说被追尾了,但是还是有一点暗爽,就是后面的迈腾比较严重多了,看来说高尔夫的安全性能很高还真不是吹出来的。。

最后贴几张车被撞后的图.(银色的是我的车)

Ipad游戏推荐-明星鼓手 iSTAR Drummer HD

时间:2011年08月03日作者:么吉查看次数:49 views评论次数:0

游戏介绍 :
  iSTAR Drummer HD是一款真真正正的可以打出鼓声的iPad音乐游戏,非常劲爆。我们尽力保留了架子鼓演奏的体验效果。
  游戏中内置了10首免费音乐,风格多样。同时我们为每一首音乐分别配上相应的真实的架子鼓音效。每个音乐的鼓点设置是90%的重现录音棚中的原始打击鼓谱,所以如果你在iSTAR Drummer中敲击正确了,那么你就最接近真正的敲击正确了。音乐难度分为简单、普通和iSTAR。
  STAR ROAD,模拟了一个从濒临解散默默无闻的乐队鼓手,通过参加全球选秀而不断成长成为明星的历程。
  在以后的版本中,我们将会增加更多有趣的功能。音乐商店也正在建设中,到时可以提供更多有趣的更多风格的音乐。

游戏截图 :

游戏下载 :
http://u.115.com/file/dngajmuz