<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/feedsky2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.vc4j.com" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/vincent4j" type="application/rss+xml"></fs:self_link><lastBuildDate>Sun, 30 Oct 2011 15:27:03 GMT</lastBuildDate><title>Vincent 4J</title><description>by Vincent 4J from vc4j.com</description><link>http://vc4j.com</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><language>en</language><pubDate>Sun, 30 Oct 2011 15:54:48 GMT</pubDate><item><title>Android中的类MVC设计方案 – Trigger机制</title><link>http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387133/6511196/1/item.html</link><content:encoded>&lt;p&gt;当然，“MVC”是针对Web项目提出的；也就是说，Android中没有MVC一说；但此处“MVC”能十分精辟地进行概括，毕竟Java开发人员对该概念十分之熟悉，所以在此借用“类MVC”；下面进入正题：&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;一、效果图展示&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;http://img.vc4j.com/2011/10/4jtrigger_screenshot_main.png&quot; alt=&quot;android 4j trigger&quot;/&gt;&lt;br/&gt;&lt;span id=&quot;more-29&quot;&gt;&lt;/span&gt;&lt;img src=&quot;http://img.vc4j.com/2011/10/4jtrigger_screenshot_news.png&quot; alt=&quot;android 4j trigger&quot;/&gt;&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/10/4jtrigger_screenshot_weather.png&quot; alt=&quot;android 4j trigger&quot;/&gt;&lt;br/&gt;从效果展示层面是无法体现该方案的便宜之处，但从设计层面可以得到很好的体现，层次划分清晰可见，每层各负其责，耦合度相当之低。为了更能说明问题，4J就分别以ListActivity(即上图中的“4J NewsHeadline”)和Activity（即上图中的“4J Weather”）进行展示；但两者的实质完全相同，避免累赘，下文在阐述时仅以“4J NewsHeadline”为例。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;二、设计思想&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;为了能更直观的阐述设计思想，先将类图和时序图贴出来：&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/10/4jtrigger_pkg.png&quot; alt=&quot;android 4j trigger&quot;/&gt;&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/10/4jtrigger_sd.png&quot; alt=&quot;android 4j trigger&quot;/&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;1. OnTriggerListener&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;该Interface有且仅有1个方法onTrigger ()，具体如下：&lt;/p&gt;
&lt;pre&gt;
public boolean onTrigger(TriggerInfo triggerInfo);
&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;2. FJUIControlManager&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;首先，该类中有3个成员属性：&lt;br/&gt;mCurrentActivity:Activity，用于记录当前处于foreground状态的Activity；&lt;br/&gt;mOnTriggerListener: OnTriggerListener，用于监听mCurrentActivity；&lt;br/&gt;mFJUIControlManagerHandler: FJUIControlManagerHandler&lt;/p&gt;
&lt;p&gt;其次，该类中有3个重要的成员方法：setCurrentActivity()、setOnTriggerListener()和postTrigger()。&lt;/p&gt;
&lt;p&gt;该类的详细代码如下：&lt;/p&gt;
&lt;pre&gt;
public class FJUIControlManager {

	// 当前处于foreground状态的Activity
	private static Activity mCurrentActivity;
	// 用于监听mCurrentActivity
	private static OnTriggerListener mOnTriggerListener;

	// 接收Control层post过来的Trigger，并通过重写handleMessage()做出相应处理
	private static final FJUIControlManagerHandler
		mFJUIControlManagerHandler = new FJUIControlManagerHandler();

	public static void setCurrentActivity(Activity currentActivity) {
		mCurrentActivity = currentActivity;
	}

	public static void setOnTriggerListener(OnTriggerListener onTriggerListener) {
		mOnTriggerListener = onTriggerListener;
	}

	public static void removeOnTriggerListener() {
		mOnTriggerListener = null;
	}

	/**
	 * 供Control层调用，将Trigger post到主消息队列中去。
	 */
	public static void postTrigger(TriggerInfo triggerInfo) {
		Message msg = mFJUIControlManagerHandler.obtainMessage
                                                  (TriggerId.IDENTIFY, triggerInfo);
		mFJUIControlManagerHandler.sendMessage(msg);
	}

	private static class FJUIControlManagerHandler extends Handler {
		/**
		 * 注意：一定得是Looper.getMainLooper()
		 */
		public FJUIControlManagerHandler() {
			super(Looper.getMainLooper());
		}

		@Override
		public void handleMessage(Message msg) {
			// msg来自于postTrigger()
			if ((msg == null) || (msg.what != TriggerId.IDENTIFY)
                             || (msg.obj == null) || (msg.obj.getClass() != TriggerInfo.class))
				return;

			TriggerInfo triggerInfo = (TriggerInfo) msg.obj;
			mOnTriggerListener.onTrigger(triggerInfo);
		}
	}

}
&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;3. FJListActivity&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;该类主要负责重写onResume()、onPause()和实现onTrigger()；在onResume()中主要负责给FJUIControlManager. mCurrentActivity赋值和注册监听，这样在子类中就不需每次重复，只需super.onResume()代替之；在onPause()中主要负责注销监听，同理在子类中只需super.onPause()代替之；而onTrigger()留给子类重写，进而分别实现各自的功能。该类的具体代码如下：&lt;/p&gt;
&lt;pre&gt;
public class FJListActivity extends ListActivity implements OnTriggerListener {

	@Override
	protected void onResume() {
		super.onResume();

		FJUIControlManager.setCurrentActivity(this);
		FJUIControlManager.setOnTriggerListener(this);
	}

	@Override
	protected void onPause() {
		super.onPause();

		FJUIControlManager.removeOnTriggerListener();
	}

	public boolean onTrigger(TriggerInfo triggerInfo) {
		return true;
	}
}
&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;4. FJTriggerMainActivity&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;该类继承FJListActivity，有1个重要的成员属性：mNewsHeadlineRequestId；2个重要的成员方法：onListItemClick()和onTrigger()；具体代码（主要部分）如下：&lt;/p&gt;
&lt;pre&gt;
public class FJTriggerMainActivity extends FJListActivity {

	// 发送NewsHeadline请求时返回的Trigger唯一标识符
	private int mNewsHeadlineRequestId; 

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		switch (position) {
		case 0:
			// 将数据请求发送到Control层，返回一个Trigger唯一标识符。
			mNewsHeadlineRequestId = NewsHeadlineControl.requestHeadlines();
			break;
		default:
			break;
		}
	}

	@Override
	public boolean onTrigger(TriggerInfo triggerInfo) {
		int triggerId = triggerInfo.getId();

		if (triggerId == mNewsHeadlineRequestId) {
			switch (triggerInfo.getArg1()) {
			case TriggerId.NEWS_HEADLINE_SUCCESS:
                                // 画面跳转
				startActivity(new Intent(this, FJNewsHeadlineActivity.class));
				break;
			case TriggerId.NEWS_HEADLINE_SERVER_EXCEPTION:
				Toast.makeText(this,
                                             R.string.news_headline_request_server_exception, 1000).show();
				break;
			default:
				break;
			}
		} else {}

		return true;
	}

}
&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;5. NewsHeadlineControl&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;该类代码比较单一，不需过多解释，就直接贴代码：&lt;/p&gt;
&lt;pre&gt;
public class NewsHeadlineControl extends FJControl {

	private static List&lt;NewsHeadline&gt; mHeadlinesList = new ArrayList&lt;NewsHeadline&gt;();

	public static int requestHeadlines() {
		// 从服务器获取数据
		getHeadlinesFromServer();

		TriggerInfo triggerInfo = TriggerInfo.factory
                                                        (TriggerId.NEWS_HEADLINE_IDENTIFY,
						         TriggerId.NEWS_HEADLINE_SUCCESS);

		// 将Trigger发送到消息队列中去
		FJUIControlManager.postTrigger(triggerInfo);

		return triggerInfo.getId();
	}

	public static List&lt;NewsHeadline&gt; getHeadlines() {
		return mHeadlinesList;
	}
&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;6. FJNewsHeadlineActivity&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;该类主要用于展示内容，而这些数据从Control层取得：NewsHeadlineControl.getHeadlines()&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;三、源码下载&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://dl.vc4j.com/android/app/4jtrigger/4jtrigger.v1.0.src.zip&quot; target=&quot;_blank&quot;&gt;下载“4J Trigger”程序源码&gt;&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387133/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387133/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://vc4j.com/archives/29.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>当然，“MVC”是针对Web项目提出的；也就是说，Android中没有MVC一说；但此处“MVC”能十分精辟地进行概括，毕竟Java开发人员对该概念十分之熟悉，所以在此借用“类MVC”；下面进入正题： 一、效果图展示 从效果展示层面是无法体现该方案的便宜之处，但从设计层面可以得到很好的体现，层次划分清晰可见，每层各负其责，耦合度相当之低。为了更能说明问题，4J就分别以ListActivity(即上图中的“4J NewsHeadline”)和Activity（即上图中的“4J Weather”）进行展示；但两者的实质完全相同，避免累赘，下文在阐述时仅以“4J NewsHeadline”为例。 二、设计思想 为了能更直观的阐述设计思想，先将类图和时序图贴出来： 1. OnTriggerListener 该Interface有且仅有1个方法onTrigger ()，具体如下： public boolean onTrigger(TriggerInfo triggerInfo); 2. FJUIControlManager 首先，该类中有3个成员属性：mCurrentActivity:Activity，用于记录当前处于foreground状态的Activity；mOnTriggerListener: OnTriggerListener，用于监听mCurrentActivity；mFJUIControlManagerHandler: FJUIControlManagerHandler 其次，该类中有3个重要的成员方法：setCurrentActivity()、setOnTriggerListener()和postTrigger()。 该类的详细代码如下： public class FJUIControlManager { // 当前处于foreground状态的Activity private static Activity mCurrentActivity; // 用于监听mCurrentActivity private static OnTriggerListener mOnTriggerListener; // &amp;#8230; &lt;a href=&quot;http://vc4j.com/archives/29.html&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387133/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387133/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>4J App</category><pubDate>Sun, 30 Oct 2011 23:27:03 +0800</pubDate><author>Vincent 4J</author><comments>http://vc4j.com/archives/29.html#comments</comments><guid isPermaLink="false">http://vc4j.com/archives/29.html</guid><dc:creator>Vincent 4J</dc:creator><fs:srclink>http://vc4j.com/archives/29.html</fs:srclink><fs:srcfeed>http://vc4j.com/feed/</fs:srcfeed><fs:itemid>feedsky/vincent4j/~8496348/571387133/6511196</fs:itemid></item><item><title>关于搭建Android App – APK推荐站点的一些想法</title><link>http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387134/6511196/1/item.html</link><content:encoded>&lt;p&gt;4J前期做过部分准备工作，并将该项目命名为“&lt;a href=&quot;http://apktalk.com&quot; target=&quot;_blank&quot;&gt;APK Talk&lt;/a&gt;”，下面将详细阐述其中的各个细节。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;一、想法萌芽&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;前不久入手一部HTC Desire，本本分分地熟悉了一星期；实在是耐不住寂寞，开始折腾起来。首先，刷MIUI的ROM——当然，这个不是我要说的重点；然后，开始折腾App。&lt;/p&gt;
&lt;p&gt;在此插播一段说明，4J个人习惯将Android App称为APK，可能有些许牵强，APK是Android Package的缩写，可能有点偏向于开发方面的知识。这种叫法主要有以下两种缘由：第一，Android App安装包的扩展名就为”.apk”。第二，出于搜索排名方面的考虑，如果以”android app”作为关键字进行Google，因为是组合查询，搜索结果中无效数据的比例应该非常大；毕竟当下iPhone已经自然而然地抢占”app”关键字，民众一听到”app”这三个字符就立马想到的是Apple的AppStore；但如果以”apk”作为关键字的话，无效数据比例应该非常之小。&lt;/p&gt;
&lt;p&gt;回到正题。所谓智能机，最大的乐趣应该来源于折腾无穷无尽的App；但作为一名Android菜鸟，&lt;span id=&quot;more-28&quot;&gt;&lt;/span&gt;如何选取APK就是一件令人无比头疼的事情。当时4J就在想，如果有这么一个APK推荐站点该多让人省心。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;二、市场需求&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;作为一个Android手机终端用户，对手机的功能需求就不仅仅只是局限于语音通话和文字短信；他们往往对功能的需求会高出许多，或者是对新功能充满好奇，等等；然而，功能的载体是APK；所以说随着Android手机用户数量的节节攀升，对APK的需求会日益增多；软件厂商为了满足用户的需求，进而达到抢占市场的目的，就会大量发布APK。&lt;/p&gt;
&lt;p&gt;如此一来，&lt;a href=&quot;http://market.android.com&quot; target=&quot;_blank&quot;&gt;菜场&lt;/a&gt;里就如雨后春笋，数以亿计的APK上架，最终导致终端用户不知如何取舍。作为一名折腾者，4J一般是通过如下几种途径来获取心仪的APK，具体如下：&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;1. &lt;a href=&quot;http://market.android.com&quot; target=&quot;_blank&quot;&gt;菜场&lt;/a&gt;排行榜&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;http://img.vc4j.com/2011/05/28-01-android-market-top.png&quot; alt=&quot;android market 排行榜&quot;/&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;2. 搜索引擎&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;以下两幅截图分别对应“android app 推荐”和“android app 测评”关键字的搜索结果，呈现出一种十分发散的态势；反应出这两组关键字没有被特意推广，也就是说，APK推荐或测评站点少之又少。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://img.vc4j.com/2011/05/28-02-android-app-recommend.png&quot; alt=&quot;android app 推荐&quot;/&gt;&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
&lt;img src=&quot;http://img.vc4j.com/2011/05/28-03-android-app-test.png&quot; alt=&quot;android app 测评&quot;/&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;3. 文字推荐&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;例如某个博主或围脖主钟情于某一款APK，然后写篇日志对之进行阐述；但他们并不是专门从事APK推荐，这部分比例应该很小。&lt;/p&gt;
&lt;p&gt;综上所述，APK推荐站点的市场需求还是非常之大，前景被4J所看好。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;三、示例站点：&lt;a href=&quot;http://appsku.com&quot; target=&quot;_blank&quot;&gt;Apps Ku&lt;/a&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;大体与Apps Ku类同，在细节方面可能有一定的差别。4J感觉Apps Ku可取之处就是关注点比较专一、切入点十分准确；但上面的文章内容过于简单，基本上在菜场的APK描述一栏就能获取得到，可读性有待深究。通过阅读上面的文章，读者只能获得该App的名字，而无法知晓是否是自己需要的，因为文章写的过于官方，省略掉核心的测评感言片段；从而得进行安装试玩；如此一来推荐站点的效果就大打折扣，发挥不到应有的效应。&lt;/p&gt;
&lt;p&gt;4J当前有些许不成形的想法，例如，测评感言、对比测评、视频测评等。本想和&lt;a href=&quot;http://herock.net&quot; target=&quot;_blank&quot;&gt;Herock&lt;/a&gt;交流交流，向前辈取取经，但一直没能通过GTalk联系上。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;四、站点定位&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;新站最大的忌讳就是将目标制定的过于雄伟、气派，这样到最后大多的结局就是项目周期一拖再拖，最后一事无成。毕竟人的精力有限，每个人的关注点比较局限、单一；当然如果运营方有足够的财力和人力的话，那就得另当别论。接下来，将详细阐述项目的进度和一些细节。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;1. 项目定位&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://apktalk.com&quot; target=&quot;_blank&quot;&gt;APK Talk&lt;/a&gt;定位于小众，关注点十分专一，唯一专注于Android App，即APK；不会去关注iOS App，也不会去关注Android资讯；以团队博客的形式进行展示。还是举例说明：某一天，4J发现一款名为”&lt;a href=&quot;https://market.android.com/details?id=com.shazam.android&quot; target=&quot;_blank&quot;&gt;Shazam&lt;/a&gt;”的APK不错，可推荐性较强；4J就会针对该APK，结合自己的使用经历撰写一篇测评文章：首先，讲述功能；接着，表述自己的使用经历；然后，测评感言等等。&lt;/p&gt;
&lt;p&gt;接下来，就是该项目的发稿频率；计划每周3-5篇文章——过少，用户等待时间过长，会失去耐性；过多，文章质量欠佳，毕竟可推荐性强的APK为数不多。&lt;/p&gt;
&lt;p&gt;然后，就是项目的人员配置，3-5人，每人每周发布一篇文章即可，不宜超过两篇；主要是考虑到人的精力有限，吸引人眼球的APK同样稀少；在数亿计的APK中淘出一个心仪的对象谈何容易。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;2. 项目进度&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;项目所需的域名、主机、Twitter帐号、Weibo帐号都已经布局完毕，粘贴于下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://apktalk.com&quot; target=&quot;_blank&quot;&gt;APKTalk.COM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://twitter.com/apktalk&quot; target=&quot;_blank&quot;&gt;APKTalk @ Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://weibo.com/apktalk&quot; target=&quot;_blank&quot;&gt;APKTalk @ Weibo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;6月1日之前，我会独自将该项目开展起来；后期再拉人入伙，共同努力。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;五、盈利模式&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;现阶段没去考虑盈利模式，只是觉得这项目可行性很高；当然，也不太可能有实际的盈利；但在其他方面可能会得到一些回报；例如，会结识一波具共同癖好的折腾者；可能会让撰稿者在“行内”有一定的知名度；4J将此理解成人脉，可以为以后做事提供便捷。&lt;/p&gt;
&lt;p&gt;多说两句，人脉在成事中可说举足轻重；古语有云：天时、地利、人和。就拿&lt;a href=&quot;http://ipaddh.com&quot; target=&quot;_blank&quot;&gt;iPad导航&lt;/a&gt;来说，该站点的idea和具体的实现应该可以算得上so easy，况且iPad也是个非常之小众的群体，但该站点能生存下来，并且健康状况还算OK——4J的猜测，具体每天多少访问量不得而知；其中起着决定性因素的就应该归结于&lt;a href=&quot;http://fairyfish.net&quot; target=&quot;_blank&quot;&gt;我爱水煮鱼&lt;/a&gt;等人的人脉。举这个例子只是为了说明人脉的重要性，并没有其他神马更深层次的用意，不要想太多；如果该站站长觉得内容欠妥的话，可以联系4J来将之删除。&lt;/p&gt;
&lt;p&gt;简而言之，可以通过之来为撰稿者积累人脉，这也是目前唯一可能的“获利”。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;六、投资成本&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;投资成本主要分为两部分；第一，经济成本；第二，时间成本。初期的经济成本基本上可以忽略，域名续费和主机续费；因为初期的访问量不可能大，一般的共享主机都能吃消。反倒，时间成本占据一个可怕的比重，要发布可读性强的APK测评文章，撰稿者必须花足够多的时间去试用大量的APK，然后从中进行筛选，这方面的代价可是巨大的。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;七、存在问题&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;最大的问题就是欠缺人手，目前有强烈意向的唯独我一人。尝试着去拉人入伙，可终究没能成功；只好在此广发英雄帖。目前还需2-4人，一定是要对该idea认可的，且具有强烈意愿的，千万别抱着试一试的态度；因为这是一个持久战，且没有任何物资回报。&lt;/p&gt;
&lt;p&gt;如果有意愿者，可通过以下方式联系4J&gt;&gt; &lt;a href=&quot;http://vc4j.com/about&quot; target=&quot;_blank&quot;&gt;http://vc4j.com/about&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8212;-EOF&amp;#8212;-&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;by Vincent 4J from &lt;a href=&quot;http://vc4j.com&quot; target=&quot;_blank&quot;&gt;vc4j.com&lt;/a&gt; @ 2011-05-26 15:06&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387134/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387134/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://vc4j.com/archives/28.html/feed</wfw:commentRss><slash:comments>5</slash:comments><description>4J前期做过部分准备工作，并将该项目命名为“APK Talk”，下面将详细阐述其中的各个细节。 一、想法萌芽 前不久入手一部HTC Desire，本本分分地熟悉了一星期；实在是耐不住寂寞，开始折腾起来。首先，刷MIUI的ROM——当然，这个不是我要说的重点；然后，开始折腾App。 在此插播一段说明，4J个人习惯将Android App称为APK，可能有些许牵强，APK是Android Package的缩写，可能有点偏向于开发方面的知识。这种叫法主要有以下两种缘由：第一，Android App安装包的扩展名就为”.apk”。第二，出于搜索排名方面的考虑，如果以”android app”作为关键字进行Google，因为是组合查询，搜索结果中无效数据的比例应该非常大；毕竟当下iPhone已经自然而然地抢占”app”关键字，民众一听到”app”这三个字符就立马想到的是Apple的AppStore；但如果以”apk”作为关键字的话，无效数据比例应该非常之小。 回到正题。所谓智能机，最大的乐趣应该来源于折腾无穷无尽的App；但作为一名Android菜鸟，如何选取APK就是一件令人无比头疼的事情。当时4J就在想，如果有这么一个APK推荐站点该多让人省心。 二、市场需求 作为一个Android手机终端用户，对手机的功能需求就不仅仅只是局限于语音通话和文字短信；他们往往对功能的需求会高出许多，或者是对新功能充满好奇，等等；然而，功能的载体是APK；所以说随着Android手机用户数量的节节攀升，对APK的需求会日益增多；软件厂商为了满足用户的需求，进而达到抢占市场的目的，就会大量发布APK。 如此一来，菜场里就如雨后春笋，数以亿计的APK上架，最终导致终端用户不知如何取舍。作为一名折腾者，4J一般是通过如下几种途径来获取心仪的APK，具体如下： 1. 菜场排行榜 2. 搜索引擎 以下两幅截图分别对应“android app 推荐”和“android app 测评”关键字的搜索结果，呈现出一种十分发散的态势；反应出这两组关键字没有被特意推广，也就是说，APK推荐或测评站点少之又少。 3. 文字推荐 例如某个博主或围脖主钟情于某一款APK，然后写篇日志对之进行阐述；但他们并不是专门从事APK推荐，这部分比例应该很小。 综上所述，APK推荐站点的市场需求还是非常之大，前景被4J所看好。 三、示例站点：Apps Ku 大体与Apps Ku类同，在细节方面可能有一定的差别。4J感觉Apps Ku可取之处就是关注点比较专一、切入点十分准确；但上面的文章内容过于简单，基本上在菜场的APK描述一栏就能获取得到，可读性有待深究。通过阅读上面的文章，读者只能获得该App的名字，而无法知晓是否是自己需要的，因为文章写的过于官方，省略掉核心的测评感言片段；从而得进行安装试玩；如此一来推荐站点的效果就大打折扣，发挥不到应有的效应。 4J当前有些许不成形的想法，例如，测评感言、对比测评、视频测评等。本想和Herock交流交流，向前辈取取经，但一直没能通过GTalk联系上。 四、站点定位 新站最大的忌讳就是将目标制定的过于雄伟、气派，这样到最后大多的结局就是项目周期一拖再拖，最后一事无成。毕竟人的精力有限，每个人的关注点比较局限、单一；当然如果运营方有足够的财力和人力的话，那就得另当别论。接下来，将详细阐述项目的进度和一些细节。 1. 项目定位 APK Talk定位于小众，关注点十分专一，唯一专注于Android App，即APK；不会去关注iOS &amp;#8230; &lt;a href=&quot;http://vc4j.com/archives/28.html&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387134/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387134/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>APK</category><pubDate>Thu, 26 May 2011 14:36:40 +0800</pubDate><author>Vincent 4J</author><comments>http://vc4j.com/archives/28.html#comments</comments><guid isPermaLink="false">http://vc4j.com/archives/28.html</guid><dc:creator>Vincent 4J</dc:creator><fs:srclink>http://vc4j.com/archives/28.html</fs:srclink><fs:srcfeed>http://vc4j.com/feed/</fs:srcfeed><fs:itemid>feedsky/vincent4j/~8496348/571387134/6511196</fs:itemid></item><item><title>4JPlayer.v1.1-软件评测</title><link>http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387135/6511196/1/item.html</link><content:encoded>&lt;h2&gt;&lt;strong&gt;一、欢迎界面&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;双击app图标之后，首先显示的是欢迎界面（如下左图所示），该界面上含有1张静态图片和1个动态点状进度条；当进度条循环完2轮之后，跳转到程序主界面中的Local Tab（如下右图所示）。&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/04/27-01-4jplayer-welcome.png&quot; alt=&quot;4JPlayer 欢迎界面 welcome&quot;/&gt;&amp;nbsp;&amp;nbsp;&lt;img src=&quot;http://img.vc4j.com/2011/04/27-02-4jplayer-init-local.png&quot; alt=&quot;4JPlayer Play Tab 播放页签&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;二、初始化界面&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;上右图展示的是初始化时Local Tab的界面，该界面罗列出SDCard上的音频文件。接下来展示该状态下Play Tab（如下左图所示）和Remote Tab界面（如下右图所示）；该状态下Remote Tab罗列出服务器上的音频文件。&lt;span id=&quot;more-27&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/04/27-03-4jplayer-init-play.png&quot; alt=&quot;4JPlayer 初始化PlayTab界面&quot;/&gt;&amp;nbsp;&amp;nbsp;&lt;img src=&quot;http://img.vc4j.com/2011/04/27-04-4jplayer-init-remote.png&quot; alt=&quot;4JPlayer 初始化RemoteTab界面&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;三、音乐播放界面&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;当用户点击Local Tab中某一首歌曲，例如选择标题一的右图中“Vincent.mp3”时；传来歌曲声音，该歌曲后多出一个播放按钮（如下左图所示）；音乐播放一段时间之后，将界面切换到Play Tab，该界面中的数字计时器以1s为单位进行增加，进度条也随之向前挪动，中间的控制键显示的是暂停图标（如下右图所示）。&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/04/27-05-4jplayer-play-local.png&quot; alt=&quot;4JPlayer 播放时Local Tab界面&quot;/&gt;&amp;nbsp;&amp;nbsp;&lt;img src=&quot;http://img.vc4j.com/2011/04/27-06-4jplayer-play-play.png&quot; alt=&quot;4JPlayer 播放时Play Tab界面&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;四、音乐暂停界面&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;继续播放一段时间后，点击Play Tab中的暂停按钮，音乐停止播放，数字计时器停止，滚动条停止，中间的控制键变更成播放图标（如下左图所示）。切换到Local Tab，此时“Vincent.mp3”后面显示为暂停图标（如下右图所示）。一段时间之后，点击“Vincent.mp3”，传出音乐，变成播放图标；切换到Play Tab，数字计时器和滚动条都动起来。&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/04/27-08-4jplayer-pause-play.png&quot; alt=&quot;4JPlayer 暂停时Play Tab界面&quot;/&gt;&amp;nbsp;&amp;nbsp;&lt;img src=&quot;http://img.vc4j.com/2011/04/27-07-4jplayer-pause-local.png&quot; alt=&quot;4JPlayer 暂停时Local Tab界面&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;五、音乐切换界面&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;在标题四的基础之上，点击“下一首”，传来“Nobody”歌声，数字计时器和滚动条从零开始变化。此时切换到Local Tab，“Nobody.mp3”后面显示一个播放图标。&lt;/p&gt;
&lt;p&gt;在上文的基础上，点击“Secret.mp3”，Secret音乐传出，该列后面出现播放图标。切换到Play Tab，此时展示着Secret的播放进度。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;六、下载Mp3&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;切换到Remote Tab，点击“Hero.mp3”后面的下载图标，弹出下载提示（如下左图所示）；一段时间之后浏览sdcard\mp3路径，发现“Hero.mp3”文件。&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/04/27-09-4jplayer-download.png&quot; alt=&quot;4JPlayer Download mp3 下载mp3&quot;/&gt;&amp;nbsp;&amp;nbsp;&lt;img src=&quot;http://img.vc4j.com/2011/04/27-10-4jplayer-notify.png&quot; alt=&quot;4JPlayer mp3 notify&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;七、Notification&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;当退出Activity时，Status Bar里出现个播放图标和文字“4JPlayer”，滑开，如上右图所示。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;八、总结&lt;/h2&gt;
&lt;p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;1. 不足之处&lt;/h3&gt;
&lt;p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拖动播放功能未实现&lt;/li&gt;
&lt;li&gt;歌词同步功能未实现&lt;/li&gt;
&lt;li&gt;界面布局过于简单&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;2. 可行之处&lt;/h3&gt;
&lt;p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本功能已实现&lt;/li&gt;
&lt;li&gt;通过该demo进一步学习Android SDK&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;九、更多信息&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://vc4j.com/archives/26.html&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.1-需求分析与实现方法&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dl.vc4j.com/android/app/4jplayer/4jplayer.v1.1.apk.zip&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.1-apk下载&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dl.vc4j.com/android/app/4jplayer/4jplayer.v1.1.src.zip&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.1-源码下载&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vc4j.com/showcase#4jplayer&quot; target=&quot;_blank&quot;&gt;更多4JPlayer信息&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;#8212;-EOF&amp;#8212;-&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;by Vincent4J from &lt;a href=&quot;http://vc4j.com&quot; target=&quot;_blank&quot;&gt;vc4j.com&lt;/a&gt; @ 2011-04-14 01：56&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387135/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387135/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://vc4j.com/archives/27.html/feed</wfw:commentRss><slash:comments>3</slash:comments><description>一、欢迎界面 双击app图标之后，首先显示的是欢迎界面（如下左图所示），该界面上含有1张静态图片和1个动态点状进度条；当进度条循环完2轮之后，跳转到程序主界面中的Local Tab（如下右图所示）。&amp;#160;&amp;#160; 二、初始化界面 上右图展示的是初始化时Local Tab的界面，该界面罗列出SDCard上的音频文件。接下来展示该状态下Play Tab（如下左图所示）和Remote Tab界面（如下右图所示）；该状态下Remote Tab罗列出服务器上的音频文件。&amp;#160;&amp;#160; 三、音乐播放界面 当用户点击Local Tab中某一首歌曲，例如选择标题一的右图中“Vincent.mp3”时；传来歌曲声音，该歌曲后多出一个播放按钮（如下左图所示）；音乐播放一段时间之后，将界面切换到Play Tab，该界面中的数字计时器以1s为单位进行增加，进度条也随之向前挪动，中间的控制键显示的是暂停图标（如下右图所示）。&amp;#160;&amp;#160; 四、音乐暂停界面 继续播放一段时间后，点击Play Tab中的暂停按钮，音乐停止播放，数字计时器停止，滚动条停止，中间的控制键变更成播放图标（如下左图所示）。切换到Local Tab，此时“Vincent.mp3”后面显示为暂停图标（如下右图所示）。一段时间之后，点击“Vincent.mp3”，传出音乐，变成播放图标；切换到Play Tab，数字计时器和滚动条都动起来。&amp;#160;&amp;#160; 五、音乐切换界面 在标题四的基础之上，点击“下一首”，传来“Nobody”歌声，数字计时器和滚动条从零开始变化。此时切换到Local Tab，“Nobody.mp3”后面显示一个播放图标。 在上文的基础上，点击“Secret.mp3”，Secret音乐传出，该列后面出现播放图标。切换到Play Tab，此时展示着Secret的播放进度。 六、下载Mp3 切换到Remote Tab，点击“Hero.mp3”后面的下载图标，弹出下载提示（如下左图所示）；一段时间之后浏览sdcard\mp3路径，发现“Hero.mp3”文件。&amp;#160;&amp;#160; 七、Notification 当退出Activity时，Status Bar里出现个播放图标和文字“4JPlayer”，滑开，如上右图所示。 八、总结 1. 不足之处 拖动播放功能未实现 歌词同步功能未实现 界面布局过于简单 2. 可行之处 基本功能已实现 通过该demo进一步学习Android SDK &amp;#8230; &lt;a href=&quot;http://vc4j.com/archives/27.html&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387135/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387135/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>4J App</category><pubDate>Thu, 14 Apr 2011 00:07:55 +0800</pubDate><author>Vincent 4J</author><comments>http://vc4j.com/archives/27.html#comments</comments><guid isPermaLink="false">http://vc4j.com/archives/27.html</guid><dc:creator>Vincent 4J</dc:creator><fs:srclink>http://vc4j.com/archives/27.html</fs:srclink><fs:srcfeed>http://vc4j.com/feed/</fs:srcfeed><fs:itemid>feedsky/vincent4j/~8496348/571387135/6511196</fs:itemid></item><item><title>4JPlayer.v1.1-需求分析与实现方法</title><link>http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387136/6511196/1/item.html</link><content:encoded>&lt;h2&gt;&lt;strong&gt;一、需求来源&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;为完善上一版本（&lt;a href=&quot;http://vc4j.com/archives/24.html&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.0&lt;/a&gt;）中存在的不足和增加一些新的功能，从而来进一步学习Android SDK的相关知识点。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;二、功能概要和涉及知识点&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;欢迎界面显示图片和动态点状进度条，并停留一段时间之后跳转到主界面
&lt;ul&gt;
&lt;li&gt;Activity：调用finish()方法来结束当前Activity和startActivity()来开启一个新的Activity。&lt;/li&gt;
&lt;li&gt;Handler：调用sendEmptyMessageDelayed()方法来延迟发送消息和重写handleMessage()方法来接收消息，并用switch-case进行分类处理。&lt;/li&gt;
&lt;li&gt;Thread：定义一个线程类，该类extends Thread，通过传递Handler对象进行实例化，在run()方法中调用Handler对象的sendEmptyMessageDelayed()方法发送消息。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;主界面由4个Tab组成
&lt;ul&gt;
&lt;li&gt;组件：TabHost、TabWidget和FrameLayout组件。&lt;/li&gt;
&lt;li&gt;类：TabActivity、TabHost和TabHost.TabSpec类&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;其中2个Tab（Local Tab和Remote Tab）的内容由ListView来进行布局，并且ListItem中包含文字、图片和按钮（需监听onClick事件）&lt;span id=&quot;more-26&quot;&gt;&lt;/span&gt;
&lt;ul&gt;
&lt;li&gt;组件：ListVew、TextView、ImageView和ImageButton组件。&lt;/li&gt;
&lt;li&gt;类：SimpleAdapter和通过extends BaseAdapter来自定义一个Adapter类，并监听ImageButton的onClick事件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;从服务器上获取mp3文件列表
&lt;ul&gt;
&lt;li&gt;下载XML文件：涉及到URL、HttpURLConnection类&lt;/li&gt;
&lt;li&gt;解析XML文件：通过extends DefaultHandler来自定义一个Handler类，并重写startElement()、endElement()和characters()方法来进行标签解析；还涉及到SAXParserFactory和XMLReader类。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;后台从服务器下载mp3文件，并写入到SDCard中去（给予下载开始提示信息）
&lt;ul&gt;
&lt;li&gt;下载开始提示信息：通过Toast.makeText()实现。&lt;/li&gt;
&lt;li&gt;后台从服务器下载mp3文件：通过extends Service来自定义一个Service类，并重写onStartCommand()方法，在该方法中开启一个Thread来进行下载。当然，同样也涉及到URL、HttpURLConnection类。&lt;/li&gt;
&lt;li&gt;将mp3文件写入到SDCard中去：涉及到一些文件和IO流的操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;罗列SDCard中mp3文件
&lt;ul&gt;
&lt;li&gt;当前的实现方法：直接遍历sdcard\mp3目录下后缀为“.mp3”的文件。&lt;/li&gt;
&lt;li&gt;&lt;strong style=&quot;color:#F00;&quot;&gt;更完善的实现方法&lt;/strong&gt;：通过getContentResolver().query()方法返回一个承载sdcard上所有音频文件记录的Cursor对象，音频文件信息存放在data\data\com.android.providers.media\databases\external-**.db中，对应的Uri为：MediaStore.Audio.Media.EXTERNAL_CONTENT_URI；具体实现请参考&gt;&gt;&lt;a href=&quot;http://blog.csdn.net/Android_Tutor/archive/2010/07/18/5743183.aspx&quot; target=&quot;_blank&quot;&gt;http://blog.csdn.net/Android_Tutor/archive/2010/07/18/5743183.aspx&lt;/a&gt;（由于我编码完之后才知晓有这种更完备的方案，但改动太大，所以这个版本暂时就没做修改，下一版本可能会修改成这种方案。）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;音乐播放控制：播放、暂停、上一首和下一首（可以循环播放）
&lt;ul&gt;
&lt;li&gt;Service：通过extends Service定义一个Serivce，用于后台进行歌曲播放控制。&lt;/li&gt;
&lt;li&gt;MediaPlayer：reset()、prepare()、start()、pause()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;播放音乐时有动态的SeekBar和动态的数字计时器
&lt;ul&gt;
&lt;li&gt;组件：SeekBar&lt;/li&gt;
&lt;li&gt;Thread：在用于播放音乐Service中，新建一个线程，该线程中通过Handler每隔1000ms发送一次消息。&lt;/li&gt;
&lt;li&gt;Handler：在音乐播放控制Activity中，通过Handler的handleMessage()方法接收消息，并移动进度条和设置数字计时器。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;当按后退键退出Activity之后，会在Status Bar显示播放信息
&lt;ul&gt;
&lt;li&gt;涉及到Notification和PendingIntent类的相关方法。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;三、尚欠缺的功能&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;拖动播放&lt;/li&gt;
&lt;li&gt;多播放列表&lt;/li&gt;
&lt;li&gt;歌词同步&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;四、更多信息&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://vc4j.com/archives/27.html&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.1-软件评测&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dl.vc4j.com/android/app/4jplayer/4jplayer.v1.1.apk.zip&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.1-apk下载&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dl.vc4j.com/android/app/4jplayer/4jplayer.v1.1.src.zip&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.1-源码下载&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vc4j.com/showcase#4jplayer&quot; target=&quot;_blank&quot;&gt;更多4JPlayer信息&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;#8212;-EOF&amp;#8212;-&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;by Vincent4J from &lt;a href=&quot;http://vc4j.com&quot; target=&quot;_blank&quot;&gt;vc4j.com&lt;/a&gt; @ 2011-04-13 17:58&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387136/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387136/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://vc4j.com/archives/26.html/feed</wfw:commentRss><slash:comments>7</slash:comments><description>一、需求来源 为完善上一版本（4JPlayer.v1.0）中存在的不足和增加一些新的功能，从而来进一步学习Android SDK的相关知识点。 二、功能概要和涉及知识点 欢迎界面显示图片和动态点状进度条，并停留一段时间之后跳转到主界面 Activity：调用finish()方法来结束当前Activity和startActivity()来开启一个新的Activity。 Handler：调用sendEmptyMessageDelayed()方法来延迟发送消息和重写handleMessage()方法来接收消息，并用switch-case进行分类处理。 Thread：定义一个线程类，该类extends Thread，通过传递Handler对象进行实例化，在run()方法中调用Handler对象的sendEmptyMessageDelayed()方法发送消息。 主界面由4个Tab组成 组件：TabHost、TabWidget和FrameLayout组件。 类：TabActivity、TabHost和TabHost.TabSpec类 其中2个Tab（Local Tab和Remote Tab）的内容由ListView来进行布局，并且ListItem中包含文字、图片和按钮（需监听onClick事件） 组件：ListVew、TextView、ImageView和ImageButton组件。 类：SimpleAdapter和通过extends BaseAdapter来自定义一个Adapter类，并监听ImageButton的onClick事件。 从服务器上获取mp3文件列表 下载XML文件：涉及到URL、HttpURLConnection类 解析XML文件：通过extends DefaultHandler来自定义一个Handler类，并重写startElement()、endElement()和characters()方法来进行标签解析；还涉及到SAXParserFactory和XMLReader类。 后台从服务器下载mp3文件，并写入到SDCard中去（给予下载开始提示信息） 下载开始提示信息：通过Toast.makeText()实现。 后台从服务器下载mp3文件：通过extends Service来自定义一个Service类，并重写onStartCommand()方法，在该方法中开启一个Thread来进行下载。当然，同样也涉及到URL、HttpURLConnection类。 将mp3文件写入到SDCard中去：涉及到一些文件和IO流的操作。 罗列SDCard中mp3文件 当前的实现方法：直接遍历sdcard\mp3目录下后缀为“.mp3”的文件。 更完善的实现方法：通过getContentResolver().query()方法返回一个承载sdcard上所有音频文件记录的Cursor对象，音频文件信息存放在data\data\com.android.providers.media\databases\external-**.db中，对应的Uri为：MediaStore.Audio.Media.EXTERNAL_CONTENT_URI；具体实现请参考&gt;&gt;http://blog.csdn.net/Android_Tutor/archive/2010/07/18/5743183.aspx（由于我编码完之后才知晓有这种更完备的方案，但改动太大，所以这个版本暂时就没做修改，下一版本可能会修改成这种方案。） 音乐播放控制：播放、暂停、上一首和下一首（可以循环播放） Service：通过extends Service定义一个Serivce，用于后台进行歌曲播放控制。 MediaPlayer：reset()、prepare()、start()、pause() 播放音乐时有动态的SeekBar和动态的数字计时器 组件：SeekBar Thread：在用于播放音乐Service中，新建一个线程，该线程中通过Handler每隔1000ms发送一次消息。 Handler：在音乐播放控制Activity中，通过Handler的handleMessage()方法接收消息，并移动进度条和设置数字计时器。 当按后退键退出Activity之后，会在Status Bar显示播放信息 &amp;#8230; &lt;a href=&quot;http://vc4j.com/archives/26.html&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387136/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387136/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>4J App</category><pubDate>Wed, 23 Mar 2011 15:31:33 +0800</pubDate><author>Vincent 4J</author><comments>http://vc4j.com/archives/26.html#comments</comments><guid isPermaLink="false">http://vc4j.com/archives/26.html</guid><dc:creator>Vincent 4J</dc:creator><fs:srclink>http://vc4j.com/archives/26.html</fs:srclink><fs:srcfeed>http://vc4j.com/feed/</fs:srcfeed><fs:itemid>feedsky/vincent4j/~8496348/571387136/6511196</fs:itemid></item><item><title>4JPlayer.v1.0-软件评测</title><link>http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387137/6511196/1/item.html</link><content:encoded>&lt;h2&gt;&lt;strong&gt;一、Welcome&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;双击app图标之后，首先显示的是欢迎界面，该界面上含有1张静态图片和1个动态点状滚动条；当滚动条循环完2轮之后，跳转到程序主界面；截屏如下：&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/03/25-01-4jplayer-welcome.png&quot; alt=&quot;4JPlayer 欢迎界面 welcome&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;二、Play Tab&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Play Tab中含有3个控制按钮，分别是：上一首、播放（暂停）和下一首；但播放控制功能并未实现；截屏如下：&lt;br/&gt;&lt;span id=&quot;more-25&quot;&gt;&lt;/span&gt;&lt;img src=&quot;http://img.vc4j.com/2011/03/25-02-4jplayer-tab-play.png&quot; alt=&quot;4JPlayer PlayTab 播放页签&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;三、Local Tab&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;点击Local Tab跳转到Local页签，该页签罗列出sdcard中名为mp3文件夹的所有mp3文件；截屏如下：&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/03/25-03-4jplayer-tab-local.png&quot; alt=&quot;4JPlayer LocalTab 本地页签&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;四、Remote Tab&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;点击Remote Tab跳转到服务器页签，该页签罗列出服务器上所有的mp3文件，并针对每个列表提供1个对应的下载按钮；截屏如下：&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/03/25-04-4jplayer-tab-remote.png&quot; alt=&quot;4JPlayer LocalTab 本地页签&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;五、Download Mp3&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;点击上图中“Secret.mp3”记录之后的下载图标，弹出提示下载文字“Secret.mp3开始下载”，一段时间之后下载结束；再点击Local Tab，该页签中较上次多出1条“Secret.mp3”记录；截屏如下：&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/03/25-06-4jplayer-remote-download.png&quot; alt=&quot;4JPlayer Download mp3 下载mp3&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;六、Lrc Tab&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;点击Lrc Tab跳转到歌词页签，该页签暂且预留，歌词同步功能尚未实现；截屏如下：&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/03/25-05-4jplayer-tab-lrc.png&quot; alt=&quot;4JPlayer LrcTab 歌词页签&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;七、About&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;点击下方的“About”，弹出“About”窗口；点击其他4个按钮均无反应；截屏如下：&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/03/25-07-4jplayer-btn-about.png&quot; alt=&quot;4JPlayer About 关于&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;八、总结&lt;/h2&gt;
&lt;p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;1. 不足之处&lt;/h3&gt;
&lt;p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;播放控制功能未实现&lt;/li&gt;
&lt;li&gt;歌词同步功能未实现&lt;/li&gt;
&lt;li&gt;界面布局过于简单&lt;/li&gt;
&lt;li&gt;底部5个Button多余（为了满足需求保留着，下一个版本将去除）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;2. 可行之处&lt;/h3&gt;
&lt;p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本满足需求&lt;/li&gt;
&lt;li&gt;通过该demo将各个知识点串联起来&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;九、更多信息&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://vc4j.com/archives/24.html&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.0-需求分析与实现方法&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dl.vc4j.com/android/app/4jplayer/4jplayer.v1.0.apk.zip&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.0-apk下载&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dl.vc4j.com/android/app/4jplayer/4jplayer.v1.0.src.zip&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.0-源码下载&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vc4j.com/showcase#4jplayer&quot; target=&quot;_blank&quot;&gt;更多4JPlayer信息&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;#8212;-EOF&amp;#8212;-&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;by Vincent4J from &lt;a href=&quot;http://vc4j.com&quot; target=&quot;_blank&quot;&gt;vc4j.com&lt;/a&gt; @ 2011-03-21 17：43&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387137/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387137/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://vc4j.com/archives/25.html/feed</wfw:commentRss><slash:comments>3</slash:comments><description>一、Welcome 双击app图标之后，首先显示的是欢迎界面，该界面上含有1张静态图片和1个动态点状滚动条；当滚动条循环完2轮之后，跳转到程序主界面；截屏如下： 二、Play Tab Play Tab中含有3个控制按钮，分别是：上一首、播放（暂停）和下一首；但播放控制功能并未实现；截屏如下： 三、Local Tab 点击Local Tab跳转到Local页签，该页签罗列出sdcard中名为mp3文件夹的所有mp3文件；截屏如下： 四、Remote Tab 点击Remote Tab跳转到服务器页签，该页签罗列出服务器上所有的mp3文件，并针对每个列表提供1个对应的下载按钮；截屏如下： 五、Download Mp3 点击上图中“Secret.mp3”记录之后的下载图标，弹出提示下载文字“Secret.mp3开始下载”，一段时间之后下载结束；再点击Local Tab，该页签中较上次多出1条“Secret.mp3”记录；截屏如下： 六、Lrc Tab 点击Lrc Tab跳转到歌词页签，该页签暂且预留，歌词同步功能尚未实现；截屏如下： 七、About 点击下方的“About”，弹出“About”窗口；点击其他4个按钮均无反应；截屏如下： 八、总结 1. 不足之处 播放控制功能未实现 歌词同步功能未实现 界面布局过于简单 底部5个Button多余（为了满足需求保留着，下一个版本将去除） 2. 可行之处 基本满足需求 通过该demo将各个知识点串联起来 九、更多信息 4JPlayer.v1.0-需求分析与实现方法&gt;&gt; 4JPlayer.v1.0-apk下载&gt;&gt; 4JPlayer.v1.0-源码下载&gt;&gt; 更多4JPlayer信息&gt;&gt; &amp;#8230; &lt;a href=&quot;http://vc4j.com/archives/25.html&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387137/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387137/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>4J App</category><pubDate>Mon, 21 Mar 2011 16:27:49 +0800</pubDate><author>Vincent 4J</author><comments>http://vc4j.com/archives/25.html#comments</comments><guid isPermaLink="false">http://vc4j.com/archives/25.html</guid><dc:creator>Vincent 4J</dc:creator><fs:srclink>http://vc4j.com/archives/25.html</fs:srclink><fs:srcfeed>http://vc4j.com/feed/</fs:srcfeed><fs:itemid>feedsky/vincent4j/~8496348/571387137/6511196</fs:itemid></item><item><title>4JPlayer.v1.0-需求分析与实现方法</title><link>http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387138/6511196/1/item.html</link><content:encoded>&lt;h2&gt;&lt;strong&gt;一、需求来源&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;我最近正在找android开发方面的工作，并将GTalk的状态设置为“找工作：Android开发”。A公司通过GTalk联系到我，但由于我身在魔都，而A公司位在帝都，故面试方面可能会有所不便；最终想到一个解决方案：给我出一道题，就是以图片的形式展示一小应用的需求，然后由我来实现其功能；由于A公司了解我目前还在上班中，只能利用业余时间来完成，就以一个星期为期。需求如下：&lt;img src=&quot;http://img.vc4j.com/2011/03/24-4jplayer-requirement.jpg&quot; alt=&quot;4jplayer-需求&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;二、功能概要&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;欢迎界面显示图片和动态点状进度条&lt;/li&gt;
&lt;li&gt;欢迎界面停留一段时间之后跳转到主界面&lt;/li&gt;
&lt;li&gt;主界面由两部分组成：上面3个Tab、下面5个Button&lt;/li&gt;
&lt;li&gt;ListItem由三部分组成：图片、文字和按钮&lt;/li&gt;
&lt;li&gt;罗列sdcard中mp3文件&lt;/li&gt;
&lt;li&gt;从服务器获取mp3文件列表&lt;/li&gt;
&lt;li&gt;后台下载mp3文件，并给予提示&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;三、需求分析与现实方法&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span id=&quot;more-24&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;1. 欢迎界面显示图片和动态点状进度条，停留一段时间之后跳转到主界面&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;需求分析
&lt;ul&gt;
&lt;li&gt;运行app时，首先显示的是欢迎界面&lt;/li&gt;
&lt;li&gt;欢迎界面居中显示一张静态图片和一串动态点状进度条&lt;/li&gt;
&lt;li&gt;点状进度条循环2轮之后跳转到主界面&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;实现方法
&lt;ul&gt;
&lt;li&gt;静态图片和“Loading”字符可以通过配置文件解决&lt;/li&gt;
&lt;li&gt;动态点的5种不同状态分别来自于string.xml文件中5个不同的字符串；例如：
&lt;pre&gt;
&amp;lt;string name=&quot;tv_welcome_dot_1&quot;&amp;gt;.&amp;lt;/string&amp;gt;
&amp;lt;string name=&quot;tv_welcome_dot_2&quot;&amp;gt;..&amp;lt;/string&amp;gt;
&amp;lt;string name=&quot;tv_welcome_dot_3&quot;&amp;gt;...&amp;lt;/string&amp;gt;
&amp;lt;string name=&quot;tv_welcome_dot_4&quot;&amp;gt;....&amp;lt;/string&amp;gt;
&amp;lt;string name=&quot;tv_welcome_dot_5&quot;&amp;gt;.....&amp;lt;/string&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;新建1个名为LoadHandler的class，该class继承android.os.Handler并重写handleMessage()方法，该方法中通过接收参数使用switch-case进行分类显示string.xml中的5个不同字符串。&lt;/li&gt;
&lt;li&gt;新建1个名为LoadThread的class，该class继承java.lang.Thread并重写run()方法，在该方法中调用LoadHandler实例的sendEmptyMessageDelayed()方法来间隔性的发送消息。&lt;/li&gt;
&lt;li&gt;在该Activity的onCreate()中调用new LoadThread(loadHandle).start()开启线程。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;2. 主界面由两部分组成：上面3个Tab、下面5个Button&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;需求分析
&lt;ul&gt;
&lt;li&gt;切换Tab时，中间数据变化，底部button不动。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;实现方法
&lt;ul&gt;
&lt;li&gt;利用1个TabHost组件和1个LinearLayout组件来完成布局，其中LinearLayout组件中包含5个Button组件。&lt;/li&gt;
&lt;li&gt;通过以下方法来添加4个不同的Tab：
&lt;pre&gt;
// add tab named Remote
Intent remoteIntent = new Intent();
remoteIntent.setClass(this, RemoteListActivity.class);
TabHost.TabSpec remoteSpec = tabHost.newTabSpec(&quot;Remote&quot;);
remoteSpec.setIndicator(&quot;&quot;, res.getDrawable(R.drawable.tab_remote_64));
remoteSpec.setContent(remoteIntent);
tabHost.addTab(remoteSpec);
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;3. 从服务器上下载数据&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;需求分析
&lt;ul&gt;
&lt;li&gt;该过程分为两部分：第一，读取服务器上的文件；第二，将读取到的数据写入sdcard中。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;实现方法
&lt;ul&gt;
&lt;li&gt;提供1个字符串形式的URL，通过HttpURLConnection类的getInputStream()得到InputStream。&lt;/li&gt;
&lt;li&gt;将得到的InputStream通过FileOutputStream类的write()写入到sdcard中去，当然其中会涉及到File的相关操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;4. 从服务器获取mp3文件列表&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;需求分析
&lt;ul&gt;
&lt;li&gt;该过程分为两部分：第一，读取服务器上承载mp3文件列表的xml文件；第二，通过解析读取到的xml文件来获得mp3文件列表。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;实现方法
&lt;ul&gt;
&lt;li&gt;该xml文件的来源为：&lt;br/&gt;&lt;a href=&quot;http://dl.vc4j.com/android/server/4jplayer/resources.xml&quot; target=&quot;_blank&quot;&gt;http://dl.vc4j.com/android/server/4jplayer/resources.xml&lt;/a&gt;&lt;br/&gt;代码片段如下：&lt;br/&gt;
&lt;pre&gt;
&amp;lt;resources&amp;gt;
	&amp;lt;resource&amp;gt;
		&amp;lt;id&amp;gt;0001&amp;lt;/id&amp;gt;
		&amp;lt;mp3.name&amp;gt;Vincent.mp3&amp;lt;/mp3.name&amp;gt;
		&amp;lt;mp3.size&amp;gt;7685487&amp;lt;/mp3.size&amp;gt;
		&amp;lt;lrc.name&amp;gt;Vincent.lrc&amp;lt;/lrc.name&amp;gt;
		&amp;lt;lrc.size&amp;gt;2428&amp;lt;/lrc.size&amp;gt;
	&amp;lt;/resource&amp;gt;
	&amp;lt;resource&amp;gt;...&amp;lt;/resource&amp;gt;
&amp;lt;resources&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;通过继承org.xml.sax.helpers.DefaultHandler，并重写其中的startElement()、endElement()和characters()方法来新建1个名为Mp3ListContentHandler类；然后通过以下代码来实现具体的解析：
&lt;pre&gt;
/**
 * 传入一String，通过解析其中的标签，返回一个ArrayList&lt;Mp3Info&gt;对象。
 */
public static ArrayList&lt;Mp3Info&gt; parserXML(String xmlContent) {
	ArrayList&lt;Mp3Info&gt; mp3InfoList = new ArrayList&lt;Mp3Info&gt;();

	SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
	try {
		XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
		Mp3ListContentHandler mp3ListContentHandler = new Mp3ListContentHandler(mp3InfoList);
		xmlReader.setContentHandler(mp3ListContentHandler);
		xmlReader.parse(new InputSource(new StringReader(xmlContent)));

		for (Iterator&lt;Mp3Info&gt; iterator = mp3InfoList.iterator(); iterator.hasNext();) {
			Mp3Info mp3Info = (Mp3Info) iterator.next();
			//System.out.println(&quot;mp3Info --&gt; &quot; + mp3Info.toString());
		}
	} catch (Exception e) {
		e.printStackTrace();
	}

	return mp3InfoList;
}
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;5. ListItem由三部分组成：图片、文字和按钮&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;需求分析
&lt;ul&gt;
&lt;li&gt;图片位于最左端，文字其次，按钮位于最右端。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;实现方法
&lt;ul&gt;
&lt;li&gt;通过继承android.widget.BaseAdapter，并重写其中的getCount()、getItem()、getItemId()和getView()方法来完成布局。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;6. 后台下载mp3文件，并给予提示。&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;需求分析
&lt;ul&gt;
&lt;li&gt;点击下载按钮之后，后台启动下载线程；而不是让当前界面停留，直至等到下载完成。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;实现方法
&lt;ul&gt;
&lt;li&gt;通过继承android.app.service，并重写其中的onStartCommand()方法，在该方法中启动线程进行下载；并通过Toast.makeText()方法给予提示。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;四、尚欠缺的功能&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;播放控制：播放、暂停、上一首、下一首&lt;/li&gt;
&lt;li&gt;显示播放进度条，并能拖动选择播放&lt;/li&gt;
&lt;li&gt;歌词同步&lt;/li&gt;
&lt;li&gt;下载目录可选&lt;/li&gt;
&lt;li&gt;扫描目录可选&lt;/li&gt;
&lt;li&gt;多播放列表&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;五、更多信息&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://vc4j.com/archives/25.html&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.0-软件评测&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dl.vc4j.com/android/app/4jplayer/4jplayer.v1.0.apk.zip&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.0-apk下载&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dl.vc4j.com/android/app/4jplayer/4jplayer.v1.0.src.zip&quot; target=&quot;_blank&quot;&gt;4JPlayer.v1.0-源码下载&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vc4j.com/showcase#4jplayer&quot; target=&quot;_blank&quot;&gt;更多4JPlayer信息&gt;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;#8212;-EOF&amp;#8212;-&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;by Vincent4J from &lt;a href=&quot;http://vc4j.com&quot; target=&quot;_blank&quot;&gt;vc4j.com&lt;/a&gt; @ 2011-03-21 15:58&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387138/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387138/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://vc4j.com/archives/24.html/feed</wfw:commentRss><slash:comments>3</slash:comments><description>一、需求来源 我最近正在找android开发方面的工作，并将GTalk的状态设置为“找工作：Android开发”。A公司通过GTalk联系到我，但由于我身在魔都，而A公司位在帝都，故面试方面可能会有所不便；最终想到一个解决方案：给我出一道题，就是以图片的形式展示一小应用的需求，然后由我来实现其功能；由于A公司了解我目前还在上班中，只能利用业余时间来完成，就以一个星期为期。需求如下： 二、功能概要 欢迎界面显示图片和动态点状进度条 欢迎界面停留一段时间之后跳转到主界面 主界面由两部分组成：上面3个Tab、下面5个Button ListItem由三部分组成：图片、文字和按钮 罗列sdcard中mp3文件 从服务器获取mp3文件列表 后台下载mp3文件，并给予提示 三、需求分析与现实方法 1. 欢迎界面显示图片和动态点状进度条，停留一段时间之后跳转到主界面 需求分析 运行app时，首先显示的是欢迎界面 欢迎界面居中显示一张静态图片和一串动态点状进度条 点状进度条循环2轮之后跳转到主界面 实现方法 静态图片和“Loading”字符可以通过配置文件解决 动态点的5种不同状态分别来自于string.xml文件中5个不同的字符串；例如： &amp;#60;string name=&quot;tv_welcome_dot_1&quot;&amp;#62;.&amp;#60;/string&amp;#62; &amp;#60;string name=&quot;tv_welcome_dot_2&quot;&amp;#62;..&amp;#60;/string&amp;#62; &amp;#60;string name=&quot;tv_welcome_dot_3&quot;&amp;#62;...&amp;#60;/string&amp;#62; &amp;#60;string name=&quot;tv_welcome_dot_4&quot;&amp;#62;....&amp;#60;/string&amp;#62; &amp;#60;string name=&quot;tv_welcome_dot_5&quot;&amp;#62;.....&amp;#60;/string&amp;#62; 新建1个名为LoadHandler的class，该class继承android.os.Handler并重写handleMessage()方法，该方法中通过接收参数使用switch-case进行分类显示string.xml中的5个不同字符串。 新建1个名为LoadThread的class，该class继承java.lang.Thread并重写run()方法，在该方法中调用LoadHandler实例的sendEmptyMessageDelayed()方法来间隔性的发送消息。 在该Activity的onCreate()中调用new LoadThread(loadHandle).start()开启线程。 2. 主界面由两部分组成：上面3个Tab、下面5个Button 需求分析 切换Tab时，中间数据变化，底部button不动。 实现方法 利用1个TabHost组件和1个LinearLayout组件来完成布局，其中LinearLayout组件中包含5个Button组件。 &amp;#8230; &lt;a href=&quot;http://vc4j.com/archives/24.html&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387138/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387138/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>4J App</category><pubDate>Fri, 11 Mar 2011 16:36:57 +0800</pubDate><author>Vincent 4J</author><comments>http://vc4j.com/archives/24.html#comments</comments><guid isPermaLink="false">http://vc4j.com/archives/24.html</guid><dc:creator>Vincent 4J</dc:creator><fs:srclink>http://vc4j.com/archives/24.html</fs:srclink><fs:srcfeed>http://vc4j.com/feed/</fs:srcfeed><fs:itemid>feedsky/vincent4j/~8496348/571387138/6511196</fs:itemid></item><item><title>利用迅雷快速下载官方Android SDK</title><link>http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387139/6511196/1/item.html</link><content:encoded>&lt;h2&gt;&lt;strong&gt;一、Android SDK一般的安装方法&lt;/strong&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;1. 下载Adding SDK Components&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;访问网址&lt;a href=&quot;http://developer.android.com/sdk&quot; target=&quot;_blank&quot;&gt;developer.android.com/sdk&lt;/a&gt;（当然得通过特殊途径才能正常访问），下载Adding SDK Components，该路径有完整地址，可以直接通过迅雷进行快速下载；如下图所示：&lt;br /&gt;
&lt;img src=&quot;http://img.vc4j.com/2011/02/21-sdkcomponent-download.png&quot;/&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;2. 通过Adding SDK Components自动下载并安装Android SDK&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;该步骤所涉及的内容均为傻瓜操作，就不再罗嗦，截张图于下：&lt;span id=&quot;more-21&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;img src=&quot;http://img.vc4j.com/2011/02/21-sdkcomponent-setup.png&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;二、总结: Adding SDK Components为何能自动下载Android SDK&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;所涉及到如下两个网址：&lt;br /&gt;
网址一：&lt;a href=&quot;https://dl-ssl.google.com/android/repository/repository.xml&quot; target=&quot;_blank&quot;&gt;https://dl-ssl.google.com/android/repository/repository.xml&lt;/a&gt;&lt;br /&gt;
网址二：http://dl.google.com/android/repository/&lt;/p&gt;
&lt;p&gt;网址一对应的页面中以XML的形式展示Android SDK各个版本对应的版本号、名称、数据大小等信息；Adding SDK Components访问网址一，并将可用的SDK一并罗列出来；然后再根据对应的文件名，与网址二拼接得到SDK的完整地址，并将其下载到名为“temp”的文件夹之中，然后再进行安装。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;三、迅雷快速下载Android SDK&lt;/strong&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;1. 下载Adding SDK Components（与一中1完全相同）&lt;/strong&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;2. 利用迅雷下载Android SDK&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;在浏览器中打开二中的网址一，我个人习惯的做法是：在Chrome中打开网址（将会出现未经过排版的一大堆杂乱无章的文字），然后右击页面，选择“审查元素”菜单，将出现如下所示内容：&lt;br /&gt;
&lt;img src=&quot;http://img.vc4j.com/2011/02/21-find-sdkname.png&quot;/&gt;&lt;br /&gt;
假定用户需要下载Android SDK 2.2，找到该SDK对应的文件名“android-2.2_r02-windows.zip”，然后拼接到二中的网址二之上，即为：&lt;br /&gt;
&lt;a href=&quot;http://dl.google.com/android/repository/android-2.2_r02-windows.zip&quot; target=&quot;_blank&quot;&gt;http://dl.google.com/android/repository/android-2.2_r02-windows.zip&lt;/a&gt;&lt;br /&gt;
接着在迅雷中直接输入该URL进行快速下载。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;3. 利用Adding SDK Components进行SDK自动安装&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;在Adding SDK Components解压缩的根目录下，即与“SDK Manager.exe”文件同级目录，新建名为“temp”的文件夹，再将2中的下载文件复制到该文件夹之下。&lt;/p&gt;
&lt;p&gt;最后，重复一中2的步骤即可。&lt;/p&gt;
&lt;p&gt;&lt;strong style=&quot;color:#F00;&quot;&gt;说明：&lt;/strong&gt;Adding SDK Components自动安装Android SDK；当“temp”文件夹里的某个压缩包安装完成之后，该组件会随之删除该包；也就是说，按方法一安装无法保存SDK的安装包。&lt;/p&gt;
&lt;p&gt;—-EOF—-&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;@ 2011-03-15 :&lt;br /&gt;
Android Developers Mirror:  &lt;a href=&quot;http://androidappdocs.appspot.com&quot; target=&quot;_blank&quot;&gt;http://androidappdocs.appspot.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;@ 2011-04-07 :&lt;br /&gt;
Android SDK Source(SDK源码) : &lt;a href=&quot;http://rgruet.free.fr/public/&quot; target=&quot;_blank&quot;&gt;http://rgruet.free.fr/public/&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;by Vincent4J from &lt;a href=&quot;http://vc4j.com&quot; target=&quot;_blank&quot;&gt;vc4j.com&lt;/a&gt; @ 2011-02-15 17:48&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387139/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387139/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://vc4j.com/archives/21.html/feed</wfw:commentRss><slash:comments>9</slash:comments><description>一、Android SDK一般的安装方法 1. 下载Adding SDK Components 访问网址developer.android.com/sdk（当然得通过特殊途径才能正常访问），下载Adding SDK Components，该路径有完整地址，可以直接通过迅雷进行快速下载；如下图所示： 2. 通过Adding SDK Components自动下载并安装Android SDK 该步骤所涉及的内容均为傻瓜操作，就不再罗嗦，截张图于下： 二、总结: Adding SDK Components为何能自动下载Android SDK 所涉及到如下两个网址： 网址一：https://dl-ssl.google.com/android/repository/repository.xml 网址二：http://dl.google.com/android/repository/ 网址一对应的页面中以XML的形式展示Android SDK各个版本对应的版本号、名称、数据大小等信息；Adding SDK Components访问网址一，并将可用的SDK一并罗列出来；然后再根据对应的文件名，与网址二拼接得到SDK的完整地址，并将其下载到名为“temp”的文件夹之中，然后再进行安装。 三、迅雷快速下载Android SDK 1. 下载Adding SDK Components（与一中1完全相同） 2. 利用迅雷下载Android SDK 在浏览器中打开二中的网址一，我个人习惯的做法是：在Chrome中打开网址（将会出现未经过排版的一大堆杂乱无章的文字），然后右击页面，选择“审查元素”菜单，将出现如下所示内容： 假定用户需要下载Android SDK 2.2，找到该SDK对应的文件名“android-2.2_r02-windows.zip”，然后拼接到二中的网址二之上，即为： &amp;#8230; &lt;a href=&quot;http://vc4j.com/archives/21.html&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387139/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387139/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>Android</category><pubDate>Tue, 15 Feb 2011 17:53:20 +0800</pubDate><author>Vincent 4J</author><comments>http://vc4j.com/archives/21.html#comments</comments><guid isPermaLink="false">http://vc4j.com/archives/21.html</guid><dc:creator>Vincent 4J</dc:creator><fs:srclink>http://vc4j.com/archives/21.html</fs:srclink><fs:srcfeed>http://vc4j.com/feed/</fs:srcfeed><fs:itemid>feedsky/vincent4j/~8496348/571387139/6511196</fs:itemid></item><item><title>教程：HomeZZ之自助更换机房</title><link>http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387140/6511196/1/item.html</link><content:encoded>&lt;p&gt;很早就对&lt;a href=&quot;http://homezz.com&quot; target=&quot;_blank&quot;&gt;HomeZZ&lt;/a&gt;的“自助更换机房”感兴趣，想尝试一把，今天终于把它给做了。刚好今天又收到&lt;a href=&quot;http://www.storyday.com&quot; target=&quot;_blank&quot;&gt;cosbeta&lt;/a&gt;的群发邮件，他提及到：现在homezz可以自助更换机房，您可以到后台去查看并操作，但是请注意，我们的自助更换只是删除您原来的主机，同时给您在指定的机房创建新的主机，所以数据需要自己备份，搬家需要自己完成，我们稍后会有详细的搬家教程！e，我不是刚搬完家嘛，不如我来写写，为HomeZZ出点微薄之力。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;一、自助更换机房的实质&lt;/strong&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;1. &lt;a href=&quot;http://vc4j.com&quot; target=&quot;_blank&quot;&gt;4J&lt;/a&gt;的空想主义&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;我最开始对这功能很感兴趣，可能是由于给它YY出一套自认为完美的流程：用户新建主机 &amp;#8211;&gt; 系统自动将数据库和程序从旧主机移植到新主机之上 &amp;#8211;&gt; 系统自动删除旧主机 &amp;#8211;&gt; 用户手动修改A和CName记录&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;2. HomeZZ的实际流程&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;用户手动备份数据库和程序 &amp;#8211;&gt; 用户驱使系统删除旧主机 &amp;#8211;&gt; 用户新建主机 &amp;#8211;&gt; 用户手动移植数据库和程序与新主机之上 &amp;#8211;&gt; 用户手动修改A和CName记录&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;3. 对&lt;a href=&quot;http://vc4j.com&quot; target=&quot;_blank&quot;&gt;4J&lt;/a&gt;空想主义的自我批斗&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;我的想法太过于天真，这样实现起来难度太大，流程也太过于复杂&lt;span id=&quot;more-20&quot;&gt;&lt;/span&gt;，移植过程中可能会出现不可预见的疑难杂症。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;二、自助更换机房前的那点事儿&lt;/strong&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;1. 备份数据库&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;首先，进入菜单：cPanel &amp;#8211;&gt; 数据库 &amp;#8211;&gt; MySQL数据库，记录下待删除数据库名、数据库用户名和用户对应密码，例如：&lt;br /&gt;
数据库：vcfoujco_dbnwp&lt;br /&gt;
用户名：vcfoujco_dbavc4j&lt;br /&gt;
密码：123456&lt;/p&gt;
&lt;p&gt;其次，进入菜单：cPanel &amp;#8211;&gt; 数据库 &amp;#8211;&gt; phpMy管理，手动备份数据库中表结构和数据，具体操作如下：&lt;br /&gt;
&lt;img src=&quot;http://img.vc4j.com/2011/01/20-db-bak-selectall.png&quot;/&gt;&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/01/20-db-bak-export.png&quot;/&gt;&lt;br/&gt;&lt;strong style=&quot;color:#F00;&quot;&gt;注意&lt;/strong&gt;：名为“information_schema”的数据库为默认数据库，应该不予理睬；备份其他所有由用户自行创建的数据库；例如，上文提到的vcfoujco_dbnwp。&lt;/p&gt;
&lt;p&gt;执行完上面的5步操作之后，会下载一个包含数据库表结构和数据的sql文件到本地；这样就完成数据库备份。&lt;/p&gt;
&lt;p&gt;&lt;strong style=&quot;color:#F00;&quot;&gt;解释&lt;/strong&gt;：按上述规则进行数据备份之后，在以后执行该SQL Script进行数据还原时，将按如下步骤进行（以一张名为t的数据表为例进行阐述）：&lt;br /&gt;
a. 判断当前数据库中表t是否存在；如果存在，就先Drop该表；如果不存在，不做操作。&lt;br /&gt;
b. 判断当前数据库中表t是否存在；如果不存在，就先Create表t；如果存在，不做操作。&lt;br /&gt;
c. insert数据到表t中。&lt;/p&gt;
&lt;p&gt;勾选“添加 DROP TABLE / VIEW / PROCEDURE / FUNCTION”的作用就是上述的a。如果不勾选的话，就会有隐患：一开始就进行步骤b，表t不存在倒一切正常；但如果表t已经存在，并且数据结构与原来备份时不一致，例如较之前缺少名为columndel的一列，那进行步骤c时就会出现错误，因为对应columndel字段数据无法写入当前的表t中。&lt;/p&gt;
&lt;p&gt;勾选“添加 IF NOT EXISTS”的作用就是上述的b。如果不勾选的话，一上来，不管三七二十一，直接CREATE TABLE t，但如果表t已经存在，将会报错；而勾选的话，将会执行CREATE TABLE IF NOT EXISTS t。&lt;/p&gt;
&lt;p&gt;&lt;strong style=&quot;color:#F00;&quot;&gt;所以较保险之法就是同时勾选上述两项&lt;/strong&gt;，当然碰到具体问题还得具体分析。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;2. 备份程序&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;进入菜单：cPanel &amp;#8211;&gt; 文件 &amp;#8211;&gt; 文件管理器，将需要备份的文件夹先压缩，然后再通过页面客户端或ftp客户端下载到本地。&lt;strong style=&quot;color:#F00;&quot;&gt;切忌&lt;/strong&gt;：一定不要通过ftp客户端直接下载文件夹，因为它里面包含太多单个文件，ftp客户端会去one-by-one的进行下载，你可就惨啦。压缩示意图如下：&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/01/20-php-bak-compress.png&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;三、自助更换机房进行时&lt;/strong&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;1. 删除当前主机&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;进入菜单：HomeZZ &amp;#8211;&gt; 我的主机 &amp;#8211;&gt; 详细信息 &amp;#8211;&gt; 改变机房，一步步走下去就完事儿；有一点需要注意一下，就是&lt;strong style=&quot;color:#F00;&quot;&gt;确认删除之前一定得仔细阅读注意事项&lt;/strong&gt;，千万不要养成无视说明性文字，见到next按钮就一个劲往下点的坏习惯。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;2. 新建主机&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;这个操作挺容易，不做过多的解释；但有一点小技巧：在选主机之前，将候选列表中的所有主机都ping一遍，哪个最快就选哪个；当然啦，不同地域访问同一主机的速度可能不一，但对于像我这样的平庸者来说，访问自己域名最频繁的当然应该是自己本人。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;3. 还原数据库&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;首先，在新主机对应的cPanel上，新建数据库、数据库用户，当然都应与原主机数据库数据一致。其次，进入到菜单：cPanel &amp;#8211;&gt; 数据库 &amp;#8211;&gt; phpMy管理，选择待还原数据库，可以采用以下两种方法进行还原：&lt;br/&gt;a. “SQL”菜单，具体步骤如下：&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/01/20-db-restore-sql.png&quot;/&gt;&lt;br/&gt;b. “导入”菜单，具体步骤如下：&lt;br/&gt;&lt;img src=&quot;http://img.vc4j.com/2011/01/20-db-restore-import.png&quot;/&gt;&lt;br/&gt;这样数据库就还原成功，接下来就是还原程序。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;4. 还原程序&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;这个步骤与备份程序恰好相反，即先上传压缩文件于主机的public_html目录，然后利用cPanel在线解压，这样就o啦。&lt;strong style=&quot;color:#F00;&quot;&gt;同样切忌&lt;/strong&gt;：使用ftp客户端上传文件夹是一个不明智的选择。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;四、自助更换机房后的那点事儿&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;登录域名的管理界面，例如&lt;a href=&quot;http://vc4j.com&quot; target=&quot;_blank&quot;&gt;vc4j.com&lt;/a&gt;域名管理界面godaddy.com，将@的A记录和www的CName记录对应的IP修改成当前主机IP即可。&lt;/p&gt;
&lt;p&gt;&amp;#8212;-EOF&amp;#8212;-&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;by Vincent4J from &lt;a href=&quot;http://vc4j.com&quot; target=&quot;_blank&quot;&gt;vc4j.com&lt;/a&gt; @ 2011-01-20 23:02&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387140/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387140/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://vc4j.com/archives/20.html/feed</wfw:commentRss><slash:comments>5</slash:comments><description>很早就对HomeZZ的“自助更换机房”感兴趣，想尝试一把，今天终于把它给做了。刚好今天又收到cosbeta的群发邮件，他提及到：现在homezz可以自助更换机房，您可以到后台去查看并操作，但是请注意，我们的自助更换只是删除您原来的主机，同时给您在指定的机房创建新的主机，所以数据需要自己备份，搬家需要自己完成，我们稍后会有详细的搬家教程！e，我不是刚搬完家嘛，不如我来写写，为HomeZZ出点微薄之力。 一、自助更换机房的实质 1. 4J的空想主义 我最开始对这功能很感兴趣，可能是由于给它YY出一套自认为完美的流程：用户新建主机 &amp;#8211;&gt; 系统自动将数据库和程序从旧主机移植到新主机之上 &amp;#8211;&gt; 系统自动删除旧主机 &amp;#8211;&gt; 用户手动修改A和CName记录 2. HomeZZ的实际流程 用户手动备份数据库和程序 &amp;#8211;&gt; 用户驱使系统删除旧主机 &amp;#8211;&gt; 用户新建主机 &amp;#8211;&gt; 用户手动移植数据库和程序与新主机之上 &amp;#8211;&gt; 用户手动修改A和CName记录 3. 对4J空想主义的自我批斗 我的想法太过于天真，这样实现起来难度太大，流程也太过于复杂，移植过程中可能会出现不可预见的疑难杂症。 二、自助更换机房前的那点事儿 1. 备份数据库 首先，进入菜单：cPanel &amp;#8211;&gt; 数据库 &amp;#8211;&gt; MySQL数据库，记录下待删除数据库名、数据库用户名和用户对应密码，例如： 数据库：vcfoujco_dbnwp 用户名：vcfoujco_dbavc4j 密码：123456 其次，进入菜单：cPanel &amp;#8211;&gt; 数据库 &amp;#8211;&gt; &amp;#8230; &lt;a href=&quot;http://vc4j.com/archives/20.html&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387140/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387140/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>Uncategorized</category><pubDate>Thu, 20 Jan 2011 22:24:25 +0800</pubDate><author>Vincent 4J</author><comments>http://vc4j.com/archives/20.html#comments</comments><guid isPermaLink="false">http://vc4j.com/archives/20.html</guid><dc:creator>Vincent 4J</dc:creator><fs:srclink>http://vc4j.com/archives/20.html</fs:srclink><fs:srcfeed>http://vc4j.com/feed/</fs:srcfeed><fs:itemid>feedsky/vincent4j/~8496348/571387140/6511196</fs:itemid></item><item><title>个人认为较靠谱的转载格式</title><link>http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387141/6511196/1/item.html</link><content:encoded>&lt;p&gt;4J个人不太习惯转载，别人辛辛苦苦撰下的劳动果实——就我个人针对一篇日志而言，单单从开始撰写到成功发表大概就得花费2个来小时，就更不用说选材方面的耗时——就让我给“一键转载”掉，感觉有点掠夺他人果实之意；还有另一个原因，随着转载的数量增加，原创的比例也将会随之下降，而我却恰恰是一根筋——“坚持原创，内容为王”。&lt;/p&gt;
&lt;p&gt;但基于近段时间的接触，我觉得以前的观点太过于死板，转载其实也不失是一种很管用的推广策略，双方可能都能从中获利；就拿我所接触到的来说，正是由于&lt;a href=&quot;http://www.xjp.cc&quot;&gt;XJP&lt;/a&gt;的文章呈现于月光博客之上（我至今还依旧对“转载”和“供稿”两概率范晕），我才能发现又一个值得订阅的原创站点；当然啦，对转载的看法，仁者见仁、智者见智；而我现在的观点是，即不打压也不鼓励，当然我也没能力去打压别人，但我一般是不会轻易去转载；遇到好文章我习惯用notebook@google或gmail进行全文收藏。&lt;/p&gt;
&lt;p&gt;当今中国互联网现zhuang，没有对网络版权的官方说明，感觉也不太可能有；而博主们一般只会做一些简单的转载声明：“转载请注明原文出处”；而一篇文章被转载，与原创仅仅只有一点不同，那就是在文章最后吝啬滴贴上一句：“文章转载于&amp;#8230;（当然附带原文链接）”，好像目前大多数都是这么干的，最具代表的&lt;span id=&quot;more-19&quot;&gt;&lt;/span&gt;xxBeta，进而促使千鸟的“&lt;a href=&quot;http://blog.rexsong.com/?p=11805&quot;&gt;严禁转载&lt;/a&gt;”。&lt;/p&gt;
&lt;p&gt;就如前面所说，我个人觉得这样做太过于吝啬，但能规避掉舆论；当然也许有些可能是无意——没太注意转载版权问题，别人咋整我也咋整。我个人感觉，既然你想要转载别人文章，就必须得让读者很轻易滴知道该文章是转载并且标明原文出处；我个人总结如下：&lt;/p&gt;
&lt;p&gt;1. 必须得有转载的相关声明，并且应该位于最醒目的位置，我的建议是正文之前，而不是置于其后；至于声明的详细程度就可以因人而异。&lt;/p&gt;
&lt;p&gt;2. 必须是全文转载，而不应该是节选自己喜欢的段落，那样很可能导致最后读者从此获得的信息非原文作者本意。如果你对部分段落有异议的话，建议以评论的形式粘贴在正文之后。&lt;/p&gt;
&lt;p&gt;3. 必须关闭评论，并注明“请到原文出处评论”，原因你懂的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;====转载格式样本 &amp;#8211; 开始====&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;一、转载声明&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;1. 来源博客名称：SocialBeta&lt;br /&gt;
2. 来源博客主页：&lt;a href=&quot;http://www.socialbeta.cn&quot;&gt;http://www.socialbeta.cn&lt;/a&gt;&lt;br /&gt;
3. 日志原文出处：&lt;a href=&quot;http://www.socialbeta.cn/articles/socialbeta-shanghai2011-mico-startup.html&quot;&gt;SocialBeta分享会@上海2011#微创业#沙龙现场报道&lt;/a&gt;&lt;br /&gt;
4. 转载日期：2011-01-13&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;二、日志原文正文&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&amp;#8212;-转载正文 &amp;#8211; 开始&amp;#8212;-&lt;/p&gt;
&lt;p&gt;2011年SocialBeta分享会又开始了，一直非常给力的@Ekstasis这么迅速的组织了一次聚会，让我刚到很惭愧，我去年和他说过，会在杭州也搞一次聚会的，却一直没有去落实，而举办过的这么多次分享会，我自己一次也没有参加过，非常的遗憾。我虽然对social的东西很感兴趣，可是自己却一点都不social，希望2011年能让自己变得更加social一些，不多说，看看今天的活动情况吧：&lt;/p&gt;
&lt;p&gt;&amp;#8230;&amp;#8230;（由于仅仅是为了举例说明，所以原文全文4J就不去一一粘贴，而是选取第一段以作示例；但真正转载当中可不能怎么干，有断章取义之嫌，可能不太厚道。）&lt;/p&gt;
&lt;p&gt;&amp;#8212;-转载正文 &amp;#8211; 结束&amp;#8212;-&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;三、4J的补充内容&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;这是4J继&lt;a href=&quot;http://www.ifanr.com/28951&quot;&gt;ifanrevent@上海，开心聚会&lt;/a&gt;之后参加的第二次互联网线下活动，从中受益颇多：&lt;br /&gt;
第一个周浩，讲的没太弄明白，可能我对涉及到的知识了解的很少的缘故。&lt;br /&gt;
第二个&lt;a href=&quot;http://t.sina.com.cn/wangxujun&quot;&gt;王维托&lt;/a&gt;，这个家伙真低调和真实，完全不屑于去对自己加任何修饰。&lt;br /&gt;
第三个&lt;a href=&quot;http://t.sina.com.cn/rogerzhong&quot;&gt;钟士杰&lt;/a&gt;，虽然之前没准备，临场发挥，确实不错，最赞，讲述他和他团队的创业历程，说的我都有些许冲动，一听就知道是经历过事的人。&lt;br /&gt;
第四个&lt;a href=&quot;http://t.sina.com.cn/socialcrm&quot;&gt;夏卫&lt;/a&gt;，我也没太听懂，可能原因同第一吧。&lt;br /&gt;
第五个，大牌，&lt;a href=&quot;http://t.sina.com.cn/ellison&quot;&gt;开心农场&lt;/a&gt;，这么年轻就家喻户晓，N人。&lt;br /&gt;
第六个庄明浩，id：&lt;a href=&quot;http://t.sina.com.cn/rosicky311&quot;&gt;@rosicky311&lt;/a&gt;，这id我比较熟，M2论坛版主。&lt;br /&gt;
感谢SocialBeta和&lt;a href=&quot;http://t.sina.com.cn/ekstasis&quot;&gt;@Ekstasis&lt;/a&gt;等人的组织，谢谢以上数人的分享，谢过了。还有，期待下一次的分享会。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;四、评论说明&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;出于珍惜劳动人民果实的初衷，该日志在本博客中的评论被关闭，如果你有感而发，请猛击“转载声明”中的原文链接，谢谢。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;====转载格式样本 &amp;#8211; 结束====&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8212;-EOF&amp;#8212;-&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;by Vincent4J from &lt;a href=&quot;http://vc4j.com&quot;&gt;vc4j.com&lt;/a&gt; @ 2011-01-13 13:01&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387141/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387141/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://vc4j.com/archives/19.html/feed</wfw:commentRss><slash:comments>7</slash:comments><description>4J个人不太习惯转载，别人辛辛苦苦撰下的劳动果实——就我个人针对一篇日志而言，单单从开始撰写到成功发表大概就得花费2个来小时，就更不用说选材方面的耗时——就让我给“一键转载”掉，感觉有点掠夺他人果实之意；还有另一个原因，随着转载的数量增加，原创的比例也将会随之下降，而我却恰恰是一根筋——“坚持原创，内容为王”。 但基于近段时间的接触，我觉得以前的观点太过于死板，转载其实也不失是一种很管用的推广策略，双方可能都能从中获利；就拿我所接触到的来说，正是由于XJP的文章呈现于月光博客之上（我至今还依旧对“转载”和“供稿”两概率范晕），我才能发现又一个值得订阅的原创站点；当然啦，对转载的看法，仁者见仁、智者见智；而我现在的观点是，即不打压也不鼓励，当然我也没能力去打压别人，但我一般是不会轻易去转载；遇到好文章我习惯用notebook@google或gmail进行全文收藏。 当今中国互联网现zhuang，没有对网络版权的官方说明，感觉也不太可能有；而博主们一般只会做一些简单的转载声明：“转载请注明原文出处”；而一篇文章被转载，与原创仅仅只有一点不同，那就是在文章最后吝啬滴贴上一句：“文章转载于&amp;#8230;（当然附带原文链接）”，好像目前大多数都是这么干的，最具代表的xxBeta，进而促使千鸟的“严禁转载”。 就如前面所说，我个人觉得这样做太过于吝啬，但能规避掉舆论；当然也许有些可能是无意——没太注意转载版权问题，别人咋整我也咋整。我个人感觉，既然你想要转载别人文章，就必须得让读者很轻易滴知道该文章是转载并且标明原文出处；我个人总结如下： 1. 必须得有转载的相关声明，并且应该位于最醒目的位置，我的建议是正文之前，而不是置于其后；至于声明的详细程度就可以因人而异。 2. 必须是全文转载，而不应该是节选自己喜欢的段落，那样很可能导致最后读者从此获得的信息非原文作者本意。如果你对部分段落有异议的话，建议以评论的形式粘贴在正文之后。 3. 必须关闭评论，并注明“请到原文出处评论”，原因你懂的。 ====转载格式样本 &amp;#8211; 开始==== 一、转载声明 1. 来源博客名称：SocialBeta 2. 来源博客主页：http://www.socialbeta.cn 3. 日志原文出处：SocialBeta分享会@上海2011#微创业#沙龙现场报道 4. 转载日期：2011-01-13 二、日志原文正文 &amp;#8212;-转载正文 &amp;#8211; 开始&amp;#8212;- 2011年SocialBeta分享会又开始了，一直非常给力的@Ekstasis这么迅速的组织了一次聚会，让我刚到很惭愧，我去年和他说过，会在杭州也搞一次聚会的，却一直没有去落实，而举办过的这么多次分享会，我自己一次也没有参加过，非常的遗憾。我虽然对social的东西很感兴趣，可是自己却一点都不social，希望2011年能让自己变得更加social一些，不多说，看看今天的活动情况吧： &amp;#8230;&amp;#8230;（由于仅仅是为了举例说明，所以原文全文4J就不去一一粘贴，而是选取第一段以作示例；但真正转载当中可不能怎么干，有断章取义之嫌，可能不太厚道。） &amp;#8212;-转载正文 &amp;#8211; 结束&amp;#8212;- 三、4J的补充内容 这是4J继ifanrevent@上海，开心聚会之后参加的第二次互联网线下活动，从中受益颇多： 第一个周浩，讲的没太弄明白，可能我对涉及到的知识了解的很少的缘故。 第二个王维托，这个家伙真低调和真实，完全不屑于去对自己加任何修饰。 第三个钟士杰，虽然之前没准备，临场发挥，确实不错，最赞，讲述他和他团队的创业历程，说的我都有些许冲动，一听就知道是经历过事的人。 第四个夏卫，我也没太听懂，可能原因同第一吧。 第五个，大牌，开心农场，这么年轻就家喻户晓，N人。 第六个庄明浩，id：@rosicky311，这id我比较熟，M2论坛版主。 感谢SocialBeta和@Ekstasis等人的组织，谢谢以上数人的分享，谢过了。还有，期待下一次的分享会。 &amp;#8230; &lt;a href=&quot;http://vc4j.com/archives/19.html&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387141/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387141/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>Uncategorized</category><pubDate>Thu, 13 Jan 2011 12:42:39 +0800</pubDate><author>Vincent 4J</author><comments>http://vc4j.com/archives/19.html#comments</comments><guid isPermaLink="false">http://vc4j.com/archives/19.html</guid><dc:creator>Vincent 4J</dc:creator><fs:srclink>http://vc4j.com/archives/19.html</fs:srclink><fs:srcfeed>http://vc4j.com/feed/</fs:srcfeed><fs:itemid>feedsky/vincent4j/~8496348/571387141/6511196</fs:itemid></item><item><title>QQ帐号绑定Email的意义</title><link>http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387142/6511196/1/item.html</link><content:encoded>&lt;p&gt;温情提示：这是一篇很浅显的文章，没有任何新意，如果你一看标题就明白是怎么一回事的话，就完全没有必要继续阅读下去，那样即浪费你宝贵的时间，同时Vincent 4J也可能被骂：这都写的些神马狗P东东啊，有神马意义啊！&lt;/p&gt;
&lt;p&gt;QQ帐号支持绑定Email，并可将该Email设定为主显帐号的功能推出很久很久，但正真使用到该项功能的用户很少。随着QQ用户数量的不断增加，QQ帐号的长度也随之加长，目前已经提升到10位，也自然而然的加大用户记忆帐号的难度；而如果你将QQ与Email绑定，就更本不用伤脑细胞了；这应该就是腾讯推出该功能最大的初衷。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;一、QQ帐号绑定Email的利&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;首当其冲的就应属便捷。当然这点对老用户来说，并不是那么重要；因为自己的QQ帐号已经深入脑海，忘掉QQ帐号的几率应该小小于忘掉银行卡密码的几率，毕竟QQ是每天必须使用到的（我是这样的）。但如果试想一个新手，刚申请到一个10位的帐号，接下来的第一件事应当就是将帐号保存到自己的手机通讯簿，或是保留在自己的Email里；应该不会想到用纸质做媒介吧，那样你就太out。&lt;/p&gt;
&lt;p&gt;有了绑定Email这一功能之后，就根本不用花心思去记忆，自动的被记录下来了。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;二、QQ帐号绑定Email的弊&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;在继续下面的内容之前有必要对“什么是主显帐号”进行相关阐述，下面是来自腾讯官方的一段解释：&lt;br /&gt;
&lt;span id=&quot;more-18&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;img src=&quot;http://img.vc4j.com/2011/01/18-qq-main-account.png&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Email的绑定同时就意味着Email被完全暴露，当然如果你对垃圾邮件不在意的话，那一点问题都没；我曾经天真的将Email完整地址不加任何修饰的粘贴在互联网上，最终导致的就是更换Email，不过还算好，那个Email我原本也没怎么使用，它的牺牲换来我对互联网的恍然，也算值当。&lt;/p&gt;
&lt;p&gt;当然，将Email显示给QQ好友，这倒没有隐患；只是在群里时，不是我想的太多，是网络环境太过于复杂，我也被复杂化了。在QQ群聊时，完完全全将Email展示出来，聊天内容截图如下：&lt;br /&gt;
&lt;img src=&quot;http://img.vc4j.com/2011/01/18-qq-show-email.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;三、几种常见的情况&lt;/strong&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;1. 不绑定Email&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;利：不用担心将Email暴露&lt;br /&gt;
弊：需要记住QQ号码&lt;br /&gt;
个人看法：适用于QQ老用户，QQ号码早就被记的死死的，没必要用Email代替。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;2. 绑定普通Email地址，且QQ号码为主显帐号&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;利：不用记忆QQ号码&lt;br /&gt;
弊：Email可能被暴露&lt;br /&gt;
个人看法：适用于QQ新用户，QQ号码过长，记的实在是头疼。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;3. 绑定普通Email地址，且Email为主显帐号&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;利：不用记忆QQ号码，可以对Email进行推广&lt;br /&gt;
弊：Email完全被暴露&lt;br /&gt;
个人看法：适用于不大担心垃圾邮件的用户；如果你还想推广你的Email，那这种方法再合适不过（有些人就有这个需求）。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;4. 绑定个性Email地址，且Email为主显帐号&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;利：不用记忆QQ号码，个性Email地址可以起到推广网站的效果&lt;br /&gt;
弊：Email完全被暴露（这点对我影响不大，因为这个Email不是我的主要Email）&lt;br /&gt;
个人看法：适合于像我这种爱折腾的人之用，我主要是为了推广个人独立博客vc4j.com。&lt;/p&gt;
&lt;p&gt;&amp;#8212;-EOF&amp;#8212;-&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;by Vincent4J from &lt;a href=&quot;http://vc4j.com&quot;&gt;vc4j.com&lt;/a&gt; @ 2011-01-06 17:12&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/571387142/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387142/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://vc4j.com/archives/18.html/feed</wfw:commentRss><slash:comments>16</slash:comments><description>温情提示：这是一篇很浅显的文章，没有任何新意，如果你一看标题就明白是怎么一回事的话，就完全没有必要继续阅读下去，那样即浪费你宝贵的时间，同时Vincent 4J也可能被骂：这都写的些神马狗P东东啊，有神马意义啊！ QQ帐号支持绑定Email，并可将该Email设定为主显帐号的功能推出很久很久，但正真使用到该项功能的用户很少。随着QQ用户数量的不断增加，QQ帐号的长度也随之加长，目前已经提升到10位，也自然而然的加大用户记忆帐号的难度；而如果你将QQ与Email绑定，就更本不用伤脑细胞了；这应该就是腾讯推出该功能最大的初衷。 一、QQ帐号绑定Email的利 首当其冲的就应属便捷。当然这点对老用户来说，并不是那么重要；因为自己的QQ帐号已经深入脑海，忘掉QQ帐号的几率应该小小于忘掉银行卡密码的几率，毕竟QQ是每天必须使用到的（我是这样的）。但如果试想一个新手，刚申请到一个10位的帐号，接下来的第一件事应当就是将帐号保存到自己的手机通讯簿，或是保留在自己的Email里；应该不会想到用纸质做媒介吧，那样你就太out。 有了绑定Email这一功能之后，就根本不用花心思去记忆，自动的被记录下来了。 二、QQ帐号绑定Email的弊 在继续下面的内容之前有必要对“什么是主显帐号”进行相关阐述，下面是来自腾讯官方的一段解释： Email的绑定同时就意味着Email被完全暴露，当然如果你对垃圾邮件不在意的话，那一点问题都没；我曾经天真的将Email完整地址不加任何修饰的粘贴在互联网上，最终导致的就是更换Email，不过还算好，那个Email我原本也没怎么使用，它的牺牲换来我对互联网的恍然，也算值当。 当然，将Email显示给QQ好友，这倒没有隐患；只是在群里时，不是我想的太多，是网络环境太过于复杂，我也被复杂化了。在QQ群聊时，完完全全将Email展示出来，聊天内容截图如下： 三、几种常见的情况 1. 不绑定Email 利：不用担心将Email暴露 弊：需要记住QQ号码 个人看法：适用于QQ老用户，QQ号码早就被记的死死的，没必要用Email代替。 2. 绑定普通Email地址，且QQ号码为主显帐号 利：不用记忆QQ号码 弊：Email可能被暴露 个人看法：适用于QQ新用户，QQ号码过长，记的实在是头疼。 3. 绑定普通Email地址，且Email为主显帐号 利：不用记忆QQ号码，可以对Email进行推广 弊：Email完全被暴露 个人看法：适用于不大担心垃圾邮件的用户；如果你还想推广你的Email，那这种方法再合适不过（有些人就有这个需求）。 4. 绑定个性Email地址，且Email为主显帐号 利：不用记忆QQ号码，个性Email地址可以起到推广网站的效果 弊：Email完全被暴露（这点对我影响不大，因为这个Email不是我的主要Email） 个人看法：适合于像我这种爱折腾的人之用，我主要是为了推广个人独立博客vc4j.com。 &amp;#8212;-EOF&amp;#8212;- by Vincent4J from vc4j.com @ 2011-01-06 17:12&lt;img src=&quot;http://www1.feedsky.com/t1/571387142/vincent4j/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/vincent4j/~8496348/571387142/6511196/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>Uncategorized</category><pubDate>Thu, 06 Jan 2011 17:04:28 +0800</pubDate><author>Vincent 4J</author><comments>http://vc4j.com/archives/18.html#comments</comments><guid isPermaLink="false">http://vc4j.com/archives/18.html</guid><dc:creator>Vincent 4J</dc:creator><fs:srclink>http://vc4j.com/archives/18.html</fs:srclink><fs:srcfeed>http://vc4j.com/feed/</fs:srcfeed><fs:itemid>feedsky/vincent4j/~8496348/571387142/6511196</fs:itemid></item></channel></rss>
