<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java &#38; Game</title>
	<atom:link href="http://www.javagg.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.javagg.com</link>
	<description>java&#38;j2me</description>
	<lastBuildDate>Sat, 02 Jul 2011 08:59:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>android UI 优化之 AbsListView之深度优化</title>
		<link>http://www.javagg.com/archives/868</link>
		<comments>http://www.javagg.com/archives/868#comments</comments>
		<pubDate>Sat, 02 Jul 2011 08:54:45 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=868</guid>
		<description><![CDATA[android 提供的很多List控件如 listview、gridview 默认都会显示一个fadingedge的东西，它在View的top和bottom处各显示一个渐变半透的阴影以达到更好的视觉效果，但是这个带来的副作用就是导致在性能不是那么强劲的机器上，一些listview，gridview的拖动会显得很不流畅，因为我们知道绘制带Alpha的图片是最耗时的。
我们的优化思路就是对这个fadingedge做一些修改，当view处于滚动状态时，通过接口setVerticalFadingEdgeEnabled(false)让其不显示fadingedge，当view处于静止状态时，通过接口setVerticalFadingEdgeEnabled(true)恢复显示fadingedge。以上的listview和gridview等控件都是继承与AbsListView，所以我们直接修改framework中的AbsListView.java文件，就可以达到系统级的改动效果了。
具体修改如下：



&#160;


@Override


public boolean onTouchEvent&#40;MotionEvent ev&#41; &#123;


if &#40;!isEnabled&#40;&#41;&#41; &#123;


// A disabled view that is clickable still consumes the touch


// events, it just doesn&#8217;t respond to them.


return isClickable&#40;&#41; &#124;&#124; isLongClickable&#40;&#41;;


&#125;


if &#40;mFastScroller != null&#41; &#123;


boolean intercepted = mFastScroller.onTouchEvent&#40;ev&#41;;


if &#40;intercepted&#41; &#123;


return true;


&#125;


&#125;


final int action = ev.getAction&#40;&#41;;


View v;


int deltaY;


if &#40;mVelocityTracker == null&#41; &#123;


mVelocityTracker = VelocityTracker.obtain&#40;&#41;;


&#125;


mVelocityTracker.addMovement&#40;ev&#41;;


switch &#40;action &#38;amp; MotionEvent.ACTION_MASK&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>android 提供的很多List控件如 listview、gridview 默认都会显示一个fadingedge的东西，它在View的top和bottom处各显示一个渐变半透的阴影以达到更好的视觉效果，但是这个带来的副作用就是导致在性能不是那么强劲的机器上，一些listview，gridview的拖动会显得很不流畅，因为我们知道绘制带Alpha的图片是最耗时的。<span id="more-868"></span></p>
<p>我们的优化思路就是对这个fadingedge做一些修改，当view处于滚动状态时，通过接口setVerticalFadingEdgeEnabled(false)让其不显示fadingedge，当view处于静止状态时，通过接口setVerticalFadingEdgeEnabled(true)恢复显示fadingedge。以上的listview和gridview等控件都是继承与AbsListView，所以我们直接修改framework中的AbsListView.java文件，就可以达到系统级的改动效果了。</p>
<p>具体修改如下：</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">@Override</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw4">boolean</span> onTouchEvent<span class="br0">&#40;</span>MotionEvent ev<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>!isEnabled<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// A disabled view that is clickable still consumes the touch</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// events, it just doesn&#8217;t respond to them.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">return</span> isClickable<span class="br0">&#40;</span><span class="br0">&#41;</span> || isLongClickable<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mFastScroller != <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">boolean</span> intercepted = mFastScroller.<span class="me1">onTouchEvent</span><span class="br0">&#40;</span>ev<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>intercepted<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">final</span> <span class="kw4">int</span> action = ev.<span class="me1">getAction</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AView+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">View</span></a> v;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> deltaY;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mVelocityTracker == <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">mVelocityTracker = VelocityTracker.<span class="me1">obtain</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">mVelocityTracker.<span class="me1">addMovement</span><span class="br0">&#40;</span>ev<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">switch</span> <span class="br0">&#40;</span>action &amp;amp; MotionEvent.<span class="me1">ACTION_MASK</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_DOWN</span>: <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">setVerticalFadingEdgeEnabled<span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">mActivePointerId = ev.<span class="me1">getPointerId</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <span class="kw4">int</span> x = <span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> ev.<span class="me1">getX</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <span class="kw4">int</span> y = <span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> ev.<span class="me1">getY</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> motionPosition = pointToPosition<span class="br0">&#40;</span>x, y<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>!mDataChanged<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>mTouchMode != TOUCH_MODE_FLING<span class="br0">&#41;</span> &amp;amp;&amp;amp; <span class="br0">&#40;</span>motionPosition &gt;= <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&amp;amp;&amp;amp; <span class="br0">&#40;</span>getAdapter<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">isEnabled</span><span class="br0">&#40;</span>motionPosition<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// User clicked on an actual view (and was not stopping a fling). It might be a</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// click or a scroll. Assume it is a click until proven otherwise</span></div>
</li>
<li class="li1">
<div class="de1">mTouchMode = TOUCH_MODE_DOWN;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// FIXME Debounce</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mPendingCheckForTap == <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">mPendingCheckForTap = <span class="kw2">new</span> CheckForTap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">postDelayed<span class="br0">&#40;</span>mPendingCheckForTap, ViewConfiguration.<span class="me1">getTapTimeout</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>ev.<span class="me1">getEdgeFlags</span><span class="br0">&#40;</span><span class="br0">&#41;</span> != <span class="nu0">0</span> &amp;amp;&amp;amp; motionPosition &lt; <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// If we couldn&#8217;t find a view to click on, but the down event was touching</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// the edge, we will bail out and try again. This allows the edge correcting</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// code in ViewRoot to try to find a nearby view to select</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mTouchMode == TOUCH_MODE_FLING<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Stopped a fling. It is a scroll.</span></div>
</li>
<li class="li1">
<div class="de1">createScrollingCache<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">mTouchMode = TOUCH_MODE_SCROLL;</div>
</li>
<li class="li1">
<div class="de1">mMotionCorrection = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">motionPosition = findMotionRow<span class="br0">&#40;</span>y<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">reportScrollStateChange<span class="br0">&#40;</span>OnScrollListener.<span class="me1">SCROLL_STATE_TOUCH_SCROLL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>motionPosition &gt;= <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Remember where the motion event started</span></div>
</li>
<li class="li1">
<div class="de1">v = getChildAt<span class="br0">&#40;</span>motionPosition &#8211; mFirstPosition<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">mMotionViewOriginalTop = v.<span class="me1">getTop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">mMotionX = x;</div>
</li>
<li class="li1">
<div class="de1">mMotionY = y;</div>
</li>
<li class="li1">
<div class="de1">mMotionPosition = motionPosition;</div>
</li>
<li class="li2">
<div class="de2">mLastY = <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">MIN_VALUE</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_MOVE</span>: <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <span class="kw4">int</span> pointerIndex = ev.<span class="me1">findPointerIndex</span><span class="br0">&#40;</span>mActivePointerId<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">final</span> <span class="kw4">int</span> y = <span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> ev.<span class="me1">getY</span><span class="br0">&#40;</span>pointerIndex<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">deltaY = y &#8211; mMotionY;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">switch</span> <span class="br0">&#40;</span>mTouchMode<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">case</span> TOUCH_MODE_DOWN:</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">case</span> TOUCH_MODE_TAP:</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">case</span> TOUCH_MODE_DONE_WAITING:</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Check if we have moved far enough that it looks more like a</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// scroll than a tap</span></div>
</li>
<li class="li1">
<div class="de1">startScrollIfNeeded<span class="br0">&#40;</span>deltaY<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">break</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">case</span> TOUCH_MODE_SCROLL:</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>PROFILE_SCROLLING<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>!mScrollProfilingStarted<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">Debug.<span class="me1">startMethodTracing</span><span class="br0">&#40;</span><span class="st0">&quot;AbsListViewScroll&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mScrollProfilingStarted = <span class="kw2">true</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>y != mLastY<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">deltaY -= mMotionCorrection;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> incrementalDeltaY = mLastY != <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">MIN_VALUE</span> ? y &#8211; mLastY : deltaY;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// No need to do all this work if we&#8217;re not going to move anyway</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">boolean</span> atEdge = <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>incrementalDeltaY != <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">atEdge = trackMotionScroll<span class="br0">&#40;</span>deltaY, incrementalDeltaY<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Check to see if we have bumped into the scroll limit</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>atEdge &amp;amp;&amp;amp; getChildCount<span class="br0">&#40;</span><span class="br0">&#41;</span> &gt; <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Treat this like we&#8217;re starting a new scroll from the current</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// position. This will let the user start scrolling back into</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// content immediately rather than needing to scroll back to the</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// point where they hit the limit first.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> motionPosition = findMotionRow<span class="br0">&#40;</span>y<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>motionPosition &gt;= <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AView+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">View</span></a> motionView = getChildAt<span class="br0">&#40;</span>motionPosition &#8211; mFirstPosition<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">mMotionViewOriginalTop = motionView.<span class="me1">getTop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">mMotionY = y;</div>
</li>
<li class="li1">
<div class="de1">mMotionPosition = motionPosition;</div>
</li>
<li class="li1">
<div class="de1">invalidate<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">mLastY = y;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_UP</span>: <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">switch</span> <span class="br0">&#40;</span>mTouchMode<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">case</span> TOUCH_MODE_DOWN:</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">case</span> TOUCH_MODE_TAP:</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">case</span> TOUCH_MODE_DONE_WAITING:</div>
</li>
<li class="li1">
<div class="de1">setVerticalFadingEdgeEnabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <span class="kw4">int</span> motionPosition = mMotionPosition;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AView+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">View</span></a> child = getChildAt<span class="br0">&#40;</span>motionPosition &#8211; mFirstPosition<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span>child != <span class="kw2">null</span> &amp;amp;&amp;amp; !child.<span class="me1">hasFocusable</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mTouchMode != TOUCH_MODE_DOWN<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">child.<span class="me1">setPressed</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mPerformClick == <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">mPerformClick = <span class="kw2">new</span> PerformClick<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> AbsListView.<span class="me1">PerformClick</span> performClick = mPerformClick;</div>
</li>
<li class="li1">
<div class="de1">performClick.<span class="me1">mChild</span> = child;</div>
</li>
<li class="li1">
<div class="de1">performClick.<span class="me1">mClickMotionPosition</span> = motionPosition;</div>
</li>
<li class="li2">
<div class="de2">performClick.<span class="me1">rememberWindowAttachCount</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mResurrectToPosition = motionPosition;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mTouchMode == TOUCH_MODE_DOWN || mTouchMode == TOUCH_MODE_TAP<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> Handler handler = getHandler<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>handler != <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">handler.<span class="me1">removeCallbacks</span><span class="br0">&#40;</span>mTouchMode == TOUCH_MODE_DOWN ?</div>
</li>
<li class="li1">
<div class="de1">mPendingCheckForTap : mPendingCheckForLongPress<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">mLayoutMode = LAYOUT_NORMAL;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>!mDataChanged &amp;amp;&amp;amp; mAdapter.<span class="me1">isEnabled</span><span class="br0">&#40;</span>motionPosition<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">mTouchMode = TOUCH_MODE_TAP;</div>
</li>
<li class="li1">
<div class="de1">setSelectedPositionInt<span class="br0">&#40;</span>mMotionPosition<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">layoutChildren<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">child.<span class="me1">setPressed</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">positionSelector<span class="br0">&#40;</span>child<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">setPressed<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mSelector != <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">Drawable d = mSelector.<span class="me1">getCurrent</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>d != <span class="kw2">null</span> &amp;amp;&amp;amp; d <span class="kw2">instanceof</span> TransitionDrawable<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="br0">&#40;</span>TransitionDrawable<span class="br0">&#41;</span> d<span class="br0">&#41;</span>.<span class="me1">resetTransition</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">postDelayed<span class="br0">&#40;</span><span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ARunnable+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Runnable</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw4">void</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">child.<span class="me1">setPressed</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">setPressed<span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>!mDataChanged<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">post<span class="br0">&#40;</span>performClick<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">mTouchMode = TOUCH_MODE_REST;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>, ViewConfiguration.<span class="me1">getPressedStateDuration</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">mTouchMode = TOUCH_MODE_REST;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>!mDataChanged &amp;amp;&amp;amp; mAdapter.<span class="me1">isEnabled</span><span class="br0">&#40;</span>motionPosition<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">post<span class="br0">&#40;</span>performClick<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">mTouchMode = TOUCH_MODE_REST;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">case</span> TOUCH_MODE_SCROLL:</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <span class="kw4">int</span> childCount = getChildCount<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>childCount &gt; <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span>mFirstPosition == <span class="nu0">0</span> &amp;amp;&amp;amp; getChildAt<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>.<span class="me1">getTop</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &gt;= mListPadding.<span class="me1">top</span> &amp;amp;&amp;amp;</div>
</li>
<li class="li1">
<div class="de1">mFirstPosition + childCount &lt; mItemCount &amp;amp;&amp;amp;</div>
</li>
<li class="li1">
<div class="de1">getChildAt<span class="br0">&#40;</span>childCount &#8211; <span class="nu0">1</span><span class="br0">&#41;</span>.<span class="me1">getBottom</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &lt;=</div>
</li>
<li class="li1">
<div class="de1">getHeight<span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; mListPadding.<span class="me1">bottom</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">mTouchMode = TOUCH_MODE_REST;</div>
</li>
<li class="li2">
<div class="de2">reportScrollStateChange<span class="br0">&#40;</span>OnScrollListener.<span class="me1">SCROLL_STATE_IDLE</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">setVerticalFadingEdgeEnabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> VelocityTracker velocityTracker = mVelocityTracker;</div>
</li>
<li class="li1">
<div class="de1">velocityTracker.<span class="me1">computeCurrentVelocity</span><span class="br0">&#40;</span><span class="nu0">1000</span>, mMaximumVelocity<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">final</span> <span class="kw4">int</span> initialVelocity = <span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> velocityTracker.<span class="me1">getYVelocity</span><span class="br0">&#40;</span>mActivePointerId<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AMath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">abs</span><span class="br0">&#40;</span>initialVelocity<span class="br0">&#41;</span> &gt; mMinimumVelocity<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mFlingRunnable == <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">mFlingRunnable = <span class="kw2">new</span> FlingRunnable<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">reportScrollStateChange<span class="br0">&#40;</span>OnScrollListener.<span class="me1">SCROLL_STATE_FLING</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">mFlingRunnable.<span class="me1">start</span><span class="br0">&#40;</span>-initialVelocity<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">mTouchMode = TOUCH_MODE_REST;</div>
</li>
<li class="li1">
<div class="de1">reportScrollStateChange<span class="br0">&#40;</span>OnScrollListener.<span class="me1">SCROLL_STATE_IDLE</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">setVerticalFadingEdgeEnabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">mTouchMode = TOUCH_MODE_REST;</div>
</li>
<li class="li1">
<div class="de1">reportScrollStateChange<span class="br0">&#40;</span>OnScrollListener.<span class="me1">SCROLL_STATE_IDLE</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">setVerticalFadingEdgeEnabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">setPressed<span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Need to redraw since we probably aren&#8217;t drawing the selector anymore</span></div>
</li>
<li class="li1">
<div class="de1">invalidate<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">final</span> Handler handler = getHandler<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>handler != <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">handler.<span class="me1">removeCallbacks</span><span class="br0">&#40;</span>mPendingCheckForLongPress<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mVelocityTracker != <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">mVelocityTracker.<span class="me1">recycle</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mVelocityTracker = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">mActivePointerId = INVALID_POINTER;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span>PROFILE_SCROLLING<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mScrollProfilingStarted<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">Debug.<span class="me1">stopMethodTracing</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mScrollProfilingStarted = <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_CANCEL</span>: <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">mTouchMode = TOUCH_MODE_REST;</div>
</li>
<li class="li2">
<div class="de2">setPressed<span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AView+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">View</span></a> motionView = <span class="kw2">this</span>.<span class="me1">getChildAt</span><span class="br0">&#40;</span>mMotionPosition &#8211; mFirstPosition<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>motionView != <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">motionView.<span class="me1">setPressed</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">clearScrollingCache<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> Handler handler = getHandler<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>handler != <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">handler.<span class="me1">removeCallbacks</span><span class="br0">&#40;</span>mPendingCheckForLongPress<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span>mVelocityTracker != <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">mVelocityTracker.<span class="me1">recycle</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mVelocityTracker = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">mActivePointerId = INVALID_POINTER;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_POINTER_UP</span>: <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">onSecondaryPointerUp<span class="br0">&#40;</span>ev<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <span class="kw4">int</span> x = mMotionX;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <span class="kw4">int</span> y = mMotionY;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <span class="kw4">int</span> motionPosition = pointToPosition<span class="br0">&#40;</span>x, y<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>motionPosition &gt;= <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Remember where the motion event started</span></div>
</li>
<li class="li1">
<div class="de1">v = getChildAt<span class="br0">&#40;</span>motionPosition &#8211; mFirstPosition<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mMotionViewOriginalTop = v.<span class="me1">getTop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mMotionPosition = motionPosition;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">mLastY = y;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">========================================================================</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw2">class</span> FlingRunnable <span class="kw2">implements</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ARunnable+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Runnable</span></a> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw2">final</span> Scroller mScroller;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw4">int</span> mLastFlingY;</div>
</li>
<li class="li1">
<div class="de1">FlingRunnable<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">mScroller = <span class="kw2">new</span> Scroller<span class="br0">&#40;</span>getContext<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">void</span> start<span class="br0">&#40;</span><span class="kw4">int</span> initialVelocity<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> initialY = initialVelocity &lt; <span class="nu0">0</span> ? <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">MAX_VALUE</span> : <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">mLastFlingY = initialY;</div>
</li>
<li class="li1">
<div class="de1">mScroller.<span class="me1">fling</span><span class="br0">&#40;</span><span class="nu0">0</span>, initialY, <span class="nu0">0</span>, initialVelocity,</div>
</li>
<li class="li1">
<div class="de1"><span class="nu0">0</span>, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">MAX_VALUE</span>, <span class="nu0">0</span>, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">MAX_VALUE</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">mTouchMode = TOUCH_MODE_FLING;</div>
</li>
<li class="li1">
<div class="de1">post<span class="br0">&#40;</span><span class="kw2">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>PROFILE_FLINGING<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>!mFlingProfilingStarted<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">Debug.<span class="me1">startMethodTracing</span><span class="br0">&#40;</span><span class="st0">&quot;AbsListViewFling&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">mFlingProfilingStarted = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> startScroll<span class="br0">&#40;</span><span class="kw4">int</span> distance, <span class="kw4">int</span> duration<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">int</span> initialY = distance &lt; <span class="nu0">0</span> ? <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">MAX_VALUE</span> : <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">mLastFlingY = initialY;</div>
</li>
<li class="li1">
<div class="de1">mScroller.<span class="me1">startScroll</span><span class="br0">&#40;</span><span class="nu0">0</span>, initialY, <span class="nu0">0</span>, distance, duration<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mTouchMode = TOUCH_MODE_FLING;</div>
</li>
<li class="li1">
<div class="de1">post<span class="br0">&#40;</span><span class="kw2">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw4">void</span> endFling<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">mTouchMode = TOUCH_MODE_REST;</div>
</li>
<li class="li1">
<div class="de1">reportScrollStateChange<span class="br0">&#40;</span>OnScrollListener.<span class="me1">SCROLL_STATE_IDLE</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">clearScrollingCache<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">removeCallbacks<span class="br0">&#40;</span><span class="kw2">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mPositionScroller != <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">removeCallbacks<span class="br0">&#40;</span>mPositionScroller<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">public</span> <span class="kw4">void</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">switch</span> <span class="br0">&#40;</span>mTouchMode<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">default</span>:</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">return</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">case</span> TOUCH_MODE_FLING: <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mItemCount == <span class="nu0">0</span> || getChildCount<span class="br0">&#40;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">endFling<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">return</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">final</span> Scroller scroller = mScroller;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">boolean</span> more = scroller.<span class="me1">computeScrollOffset</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <span class="kw4">int</span> y = scroller.<span class="me1">getCurrY</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Flip sign to convert finger direction to list items direction</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// (e.g. finger moving down means list is moving towards the top)</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">int</span> delta = mLastFlingY &#8211; y;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Pretend that each frame of a fling scroll is a touch scroll</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>delta &gt; <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// List is moving towards the top. Use first view as mMotionPosition</span></div>
</li>
<li class="li1">
<div class="de1">mMotionPosition = mFirstPosition;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AView+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">View</span></a> firstView = getChildAt<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mMotionViewOriginalTop = firstView.<span class="me1">getTop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Don&#8217;t fling more than 1 screen</span></div>
</li>
<li class="li1">
<div class="de1">delta = <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AMath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">min</span><span class="br0">&#40;</span>getHeight<span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; mPaddingBottom &#8211; mPaddingTop &#8211; <span class="nu0">1</span>, delta<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// List is moving towards the bottom. Use last view as mMotionPosition</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> offsetToLast = getChildCount<span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">mMotionPosition = mFirstPosition + offsetToLast;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AView+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">View</span></a> lastView = getChildAt<span class="br0">&#40;</span>offsetToLast<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mMotionViewOriginalTop = lastView.<span class="me1">getTop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Don&#8217;t fling more than 1 screen</span></div>
</li>
<li class="li1">
<div class="de1">delta = <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AMath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">max</span><span class="br0">&#40;</span>-<span class="br0">&#40;</span>getHeight<span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; mPaddingBottom &#8211; mPaddingTop &#8211; <span class="nu0">1</span><span class="br0">&#41;</span>, delta<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">final</span> <span class="kw4">boolean</span> atEnd = trackMotionScroll<span class="br0">&#40;</span>delta, delta<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>more &amp;amp;&amp;amp; !atEnd<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">invalidate<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mLastFlingY = y;</div>
</li>
<li class="li1">
<div class="de1">post<span class="br0">&#40;</span><span class="kw2">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">endFling<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">AbsListView.<span class="kw2">this</span>.<span class="me1">setVerticalFadingEdgeEnabled</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>PROFILE_FLINGING<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>mFlingProfilingStarted<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">Debug.<span class="me1">stopMethodTracing</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">mFlingProfilingStarted = <span class="kw2">false</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>修改后重新编译，在性能稍差的机器上运行，滚动一下listview或者gridview，你就可以看到比较明显的效果了！</p>
<p>转自：<a href="http://blog.sina.com.cn/s/blog_4a6c59d60100pjqc.html">http://blog.sina.com.cn/s/blog_4a6c59d60100pjqc.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/868/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>android ListView的美化涉及到的一些属性</title>
		<link>http://www.javagg.com/archives/865</link>
		<comments>http://www.javagg.com/archives/865#comments</comments>
		<pubDate>Thu, 30 Jun 2011 07:19:48 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=865</guid>
		<description><![CDATA[用心的朋友应该会发现，listview中在设置了背景之后。会有些问题。
1.、listview在拖动的时候背景图片消失变成黑色背景。等到拖动完毕我们自己的背景图片才显示出来。
2 、listview的上边和下边有黑色的阴影。
3、lsitview的每一项之间需要设置一个图片做为间隔。
针对以上问题 在listview的xml文件中设置一下语句。
问题1 有如下代码结解决 android:scrollingCache=&#8221;false&#8221;
问题2 用如下代码解决：android:fadingEdge=&#8221;none&#8221;
问题3  用如下代码解决：  android:divider=&#8221;@drawable/list_driver&#8221;  其中  @drawable/list_driver 是一个图片资源
总体如下

&#60;ListView
 android:id=&#8221;@+id/myListView01&#8243;
 android:layout_width=&#8221;fill_parent&#8221;
 android:layout_height=&#8221;287dip&#8221;
 android:fadingEdge=&#8221;none&#8221;
 android:divider=&#8221;@drawable/list_driver&#8221;
 android:scrollingCache=&#8221;false&#8221;
 android:background=&#8221;@drawable/list&#8221;&#62;
 &#60;/ListView&#62;

4. 自定义listview的时候，当你不使用android:cacheColorHint=“#00000000”会出现下面选中一个空间黑色底色的情况，破坏整体美观度：
5. 当你不使用android:listSelector属性，默认会显示选中的item为橙黄底色，有时候我们需要去掉这种效果：
]]></description>
			<content:encoded><![CDATA[<p>用心的朋友应该会发现，listview中在设置了背景之后。会有些问题。</p>
<p>1.、listview在拖动的时候背景图片消失变成黑色背景。等到拖动完毕我们自己的背景图片才显示出来。</p>
<p>2 、listview的上边和下边有黑色的阴影。</p>
<p>3、lsitview的每一项之间需要设置一个图片做为间隔。<span id="more-865"></span></p>
<p>针对以上问题 在listview的xml文件中设置一下语句。</p>
<p>问题1 有如下代码结解决 android:scrollingCache=&#8221;false&#8221;</p>
<p>问题2 用如下代码解决：android:fadingEdge=&#8221;none&#8221;<br />
问题3  用如下代码解决：  android:divider=&#8221;@drawable/list_driver&#8221;  其中  @drawable/list_driver 是一个图片资源</p>
<p>总体如下</p>
<ol>
<li>&lt;ListView</li>
<li> android:id=&#8221;@+id/myListView01&#8243;</li>
<li> android:layout_width=&#8221;fill_parent&#8221;</li>
<li> android:layout_height=&#8221;287dip&#8221;</li>
<li> android:fadingEdge=&#8221;none&#8221;</li>
<li> android:divider=&#8221;@drawable/list_driver&#8221;</li>
<li> android:scrollingCache=&#8221;false&#8221;</li>
<li> android:background=&#8221;@drawable/list&#8221;&gt;</li>
<li> &lt;/ListView&gt;</li>
</ol>
<p>4. 自定义listview的时候，当你不使用android:cacheColorHint=“#00000000”会出现下面选中一个空间黑色底色的情况，破坏整体美观度：</p>
<p>5. 当你不使用android:listSelector属性，默认会显示选中的item为橙黄底色，有时候我们需要去掉这种效果：</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/865/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>活用Android的RelativeLayout</title>
		<link>http://www.javagg.com/archives/863</link>
		<comments>http://www.javagg.com/archives/863#comments</comments>
		<pubDate>Thu, 30 Jun 2011 01:50:35 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=863</guid>
		<description><![CDATA[一、效果图
格子布局效果：
（图一）
居中正在加载的效果：
（图二）
二、实现代码
2.1　　实现 图一 效果代码
&#60;RelativeLayout android:id=&#8221;@id/rlDigest&#8221;
android:background=&#8221;@drawable/panel_bg&#8221;  android:layout_width=&#8221;fill_parent&#8221;
android:layout_height=&#8221;100.0dip&#8221;  android:layout_margin=&#8221;10.0dip&#8221;&#62;
&#60;TextView  android:textSize=&#8221;16.0sp&#8221; android:textColor=&#8221;#ff7d899d&#8221;
android:gravity=&#8221;center_vertical&#8221;  android:id=&#8221;@id/tvAddress&#8221;
android:layout_width=&#8221;wrap_content&#8221;  android:layout_height=&#8221;wrap_content&#8221;
android:layout_marginLeft=&#8221;5.0dip&#8221;  android:layout_marginTop=&#8221;10.0dip&#8221;
android:text=&#8221;@string/userinfo_address&#8221;
android:layout_alignParentLeft=&#8221;true&#8221;
android:layout_alignParentTop=&#8221;true&#8221; /&#62;
&#60;TextView  android:textSize=&#8221;16.0sp&#8221; android:textColor=&#8221;#ff373737&#8243;
android:id=&#8221;@id/tvAddress_content&#8221;  android:layout_width=&#8221;wrap_content&#8221;
android:layout_height=&#8221;wrap_content&#8221;  android:layout_marginLeft=&#8221;10.0dip&#8221;
android:layout_toRightOf=&#8221;@id/tvAddress&#8221; android:layout_alignTop=&#8221;@id/tvAddress&#8221;  /&#62;
&#60;View android:id=&#8221;@id/vHDivider&#8221;  android:background=&#8221;@drawable/horizontal_separation_line_repeat&#8221;
android:layout_width=&#8221;fill_parent&#8221;  android:layout_height=&#8221;1.0dip&#8221;
android:layout_centerVertical=&#8221;true&#8221; /&#62;
&#60;TextView  android:textSize=&#8221;16.0sp&#8221; android:textColor=&#8221;#ff7d899d&#8221;
android:gravity=&#8221;center_vertical&#8221;  android:id=&#8221;@id/tvAccount_info&#8221;
android:layout_width=&#8221;wrap_content&#8221;  android:layout_height=&#8221;wrap_content&#8221;
android:text=&#8221;@string/account_info&#8221;  android:layout_below=&#8221;@id/vHDivider&#8221;
android:layout_alignLeft=&#8221;@id/tvAddress&#8221;
android:layout_alignParentBottom=&#8221;true&#8221; /&#62;
&#60;TextView  android:textSize=&#8221;16.0sp&#8221; android:textColor=&#8221;#ff373737&#8243;
android:gravity=&#8221;center_vertical&#8221;  android:id=&#8221;@id/tvAccount_info_content&#8221;
android:layout_width=&#8221;wrap_content&#8221;  android:layout_height=&#8221;wrap_content&#8221;
android:layout_marginLeft=&#8221;10.0dip&#8221;  android:layout_marginBottom=&#8221;12.0dip&#8221;
android:singleLine=&#8221;true&#8221;  android:layout_toRightOf=&#8221;@id/tvAccount_info&#8221;
android:layout_alignBottom=&#8221;@id/tvAccount_info&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>一、效果图</p>
<p>格子布局效果：</p>
<p><img src="http://hiphotos.baidu.com/lvqiyong/pic/item/fb99c3487f6a857e08f7ef8e.jpg" alt="" width="320" height="480" />（图一）</p>
<p>居中正在加载的效果：</p>
<div><img src="http://hiphotos.baidu.com/lvqiyong/pic/item/6ea20a1a04b419e94bedbc8e.jpg" border="0" alt="" />（图二）<span id="more-863"></span></div>
<p>二、实现代码</p>
<p>2.1　　实现 图一 效果代码</p>
<p>&lt;RelativeLayout android:id=&#8221;@id/rlDigest&#8221;<br />
android:background=&#8221;@drawable/panel_bg&#8221;  android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;100.0dip&#8221;  android:layout_margin=&#8221;10.0dip&#8221;&gt;<br />
&lt;TextView  android:textSize=&#8221;16.0sp&#8221; android:textColor=&#8221;#ff7d899d&#8221;<br />
android:gravity=&#8221;center_vertical&#8221;  android:id=&#8221;@id/tvAddress&#8221;<br />
android:layout_width=&#8221;wrap_content&#8221;  android:layout_height=&#8221;wrap_content&#8221;<br />
android:layout_marginLeft=&#8221;5.0dip&#8221;  android:layout_marginTop=&#8221;10.0dip&#8221;<br />
android:text=&#8221;@string/userinfo_address&#8221;<br />
android:layout_alignParentLeft=&#8221;true&#8221;<br />
android:layout_alignParentTop=&#8221;true&#8221; /&gt;<br />
&lt;TextView  android:textSize=&#8221;16.0sp&#8221; android:textColor=&#8221;#ff373737&#8243;<br />
android:id=&#8221;@id/tvAddress_content&#8221;  android:layout_width=&#8221;wrap_content&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;  android:layout_marginLeft=&#8221;10.0dip&#8221;<br />
android:layout_toRightOf=&#8221;@id/tvAddress&#8221; android:layout_alignTop=&#8221;@id/tvAddress&#8221;  /&gt;<br />
&lt;View android:id=&#8221;@id/vHDivider&#8221;  android:background=&#8221;@drawable/horizontal_separation_line_repeat&#8221;<br />
android:layout_width=&#8221;fill_parent&#8221;  android:layout_height=&#8221;1.0dip&#8221;<br />
android:layout_centerVertical=&#8221;true&#8221; /&gt;<br />
&lt;TextView  android:textSize=&#8221;16.0sp&#8221; android:textColor=&#8221;#ff7d899d&#8221;<br />
android:gravity=&#8221;center_vertical&#8221;  android:id=&#8221;@id/tvAccount_info&#8221;<br />
android:layout_width=&#8221;wrap_content&#8221;  android:layout_height=&#8221;wrap_content&#8221;<br />
android:text=&#8221;@string/account_info&#8221;  android:layout_below=&#8221;@id/vHDivider&#8221;<br />
android:layout_alignLeft=&#8221;@id/tvAddress&#8221;<br />
android:layout_alignParentBottom=&#8221;true&#8221; /&gt;<br />
&lt;TextView  android:textSize=&#8221;16.0sp&#8221; android:textColor=&#8221;#ff373737&#8243;<br />
android:gravity=&#8221;center_vertical&#8221;  android:id=&#8221;@id/tvAccount_info_content&#8221;<br />
android:layout_width=&#8221;wrap_content&#8221;  android:layout_height=&#8221;wrap_content&#8221;<br />
android:layout_marginLeft=&#8221;10.0dip&#8221;  android:layout_marginBottom=&#8221;12.0dip&#8221;<br />
android:singleLine=&#8221;true&#8221;  android:layout_toRightOf=&#8221;@id/tvAccount_info&#8221;<br />
android:layout_alignBottom=&#8221;@id/tvAccount_info&#8221; /&gt;<br />
&lt;/RelativeLayout&gt;<br />
&lt;RelativeLayout  android:background=&#8221;@drawable/panel_bg&#8221;<br />
android:layout_width=&#8221;fill_parent&#8221;  android:layout_height=&#8221;130.0dip&#8221;<br />
android:layout_margin=&#8221;10.0dip&#8221;&gt;<br />
&lt;View  android:id=&#8221;@id/vVDivider1&#8243;  android:background=&#8221;@drawable/vertical_separation_line_repeat&#8221;<br />
android:layout_width=&#8221;1.0dip&#8221;  android:layout_height=&#8221;fill_parent&#8221;<br />
android:layout_centerHorizontal=&#8221;true&#8221; /&gt;<br />
&lt;View  android:id=&#8221;@id/vHDivider2&#8243;  android:background=&#8221;@drawable/horizontal_separation_line_repeat&#8221;<br />
android:layout_width=&#8221;fill_parent&#8221;  android:layout_height=&#8221;1.0dip&#8221;<br />
android:layout_centerVertical=&#8221;true&#8221; /&gt;<br />
&lt;RelativeLayout  android:id=&#8221;@id/llAttention&#8221;<br />
android:background=&#8221;@drawable/bg_panel_above_left&#8221;<br />
android:clickable=&#8221;true&#8221;  android:layout_width=&#8221;wrap_content&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;  android:layout_toLeftOf=&#8221;@id/vVDivider1&#8243;<br />
android:layout_above=&#8221;@id/vHDivider2&#8243;<br />
android:layout_alignParentLeft=&#8221;true&#8221;<br />
android:layout_alignParentTop=&#8221;true&#8221;&gt;<br />
&lt;TextView  android:gravity=&#8221;center&#8221;  android:id=&#8221;@id/tvAttention_count&#8221;<br />
android:layout_width=&#8221;fill_parent&#8221;  android:layout_height=&#8221;wrap_content&#8221;<br />
android:layout_marginTop=&#8221;10.0dip&#8221; android:text=&#8221;0&#8243;<br />
android:layout_centerHorizontal=&#8221;true&#8221;<br />
style=&#8221;@style/userinfo_panel_textview_count&#8221; /&gt;<br />
&lt;TextView android:gravity=&#8221;center&#8221;  android:id=&#8221;@id/tvAttention&#8221;<br />
android:layout_width=&#8221;fill_parent&#8221;  android:layout_height=&#8221;wrap_content&#8221;<br />
android:text=&#8221;@string/attention&#8221;  android:layout_below=&#8221;@id/tvAttention_count&#8221;<br />
android:layout_centerHorizontal=&#8221;true&#8221;<br />
style=&#8221;@style/userinfo_panel_textview_title&#8221; /&gt;<br />
&lt;/RelativeLayout&gt;<br />
&lt;LinearLayout  android:orientation=&#8221;vertical&#8221;<br />
android:id=&#8221;@id/rlWeibo&#8221;  android:background=&#8221;@drawable/bg_panel_above_right&#8221;<br />
android:clickable=&#8221;true&#8221;  android:layout_width=&#8221;wrap_content&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;  android:layout_toRightOf=&#8221;@id/vVDivider1&#8243;<br />
android:layout_above=&#8221;@id/vHDivider2&#8243;<br />
android:layout_alignParentTop=&#8221;true&#8221;<br />
android:layout_alignParentRight=&#8221;true&#8221;&gt;<br />
&lt;TextView  android:gravity=&#8221;center&#8221;  android:layout_gravity=&#8221;center_horizontal&#8221;<br />
android:id=&#8221;@id/tvWeibo_count&#8221;  android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;  android:layout_marginTop=&#8221;10.0dip&#8221;<br />
android:text=&#8221;0&#8243;  style=&#8221;@style/userinfo_panel_textview_count&#8221; /&gt;<br />
&lt;TextView android:gravity=&#8221;center&#8221;  android:layout_gravity=&#8221;center_horizontal&#8221;<br />
android:id=&#8221;@id/tvTopic&#8221;  android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;  android:text=&#8221;@string/radio_button_topic&#8221;<br />
style=&#8221;@style/userinfo_panel_textview_title&#8221; /&gt;<br />
&lt;/LinearLayout&gt;<br />
&lt;LinearLayout  android:orientation=&#8221;vertical&#8221;<br />
android:id=&#8221;@id/llFans&#8221;  android:background=&#8221;@drawable/bg_panel_below_left&#8221;<br />
android:clickable=&#8221;true&#8221;  android:layout_width=&#8221;wrap_content&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;  android:layout_toLeftOf=&#8221;@id/vVDivider1&#8243;<br />
android:layout_below=&#8221;@id/vHDivider2&#8243;<br />
android:layout_alignParentLeft=&#8221;true&#8221;<br />
android:layout_alignParentBottom=&#8221;true&#8221;&gt;<br />
&lt;TextView  android:gravity=&#8221;center&#8221;  android:layout_gravity=&#8221;center_horizontal&#8221;<br />
android:id=&#8221;@id/tvFans_count&#8221;  android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;  android:layout_marginTop=&#8221;10.0dip&#8221;<br />
android:text=&#8221;0&#8243;  style=&#8221;@style/userinfo_panel_textview_count&#8221; /&gt;<br />
&lt;TextView android:gravity=&#8221;center&#8221;  android:layout_gravity=&#8221;center_horizontal&#8221;<br />
android:id=&#8221;@id/tvFans&#8221;  android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;  android:text=&#8221;@string/fans&#8221;<br />
style=&#8221;@style/userinfo_panel_textview_title&#8221; /&gt;<br />
&lt;/LinearLayout&gt;<br />
&lt;LinearLayout  android:orientation=&#8221;vertical&#8221;<br />
android:id=&#8221;@id/llTopic&#8221;  android:background=&#8221;@drawable/bg_panel_below_right&#8221;<br />
android:clickable=&#8221;true&#8221;  android:layout_width=&#8221;wrap_content&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;  android:layout_toRightOf=&#8221;@id/vVDivider1&#8243;<br />
android:layout_below=&#8221;@id/vHDivider2&#8243;<br />
android:layout_alignParentRight=&#8221;true&#8221;<br />
android:layout_alignParentBottom=&#8221;true&#8221;&gt;<br />
&lt;TextView  android:gravity=&#8221;center&#8221;  android:layout_gravity=&#8221;center_horizontal&#8221;<br />
android:id=&#8221;@id/tvTopic_count&#8221;  android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;  android:layout_marginTop=&#8221;10.0dip&#8221;<br />
android:text=&#8221;0&#8243;  style=&#8221;@style/userinfo_panel_textview_count&#8221; /&gt;<br />
&lt;TextView android:gravity=&#8221;center&#8221;  android:layout_gravity=&#8221;center_horizontal&#8221;<br />
android:id=&#8221;@id/tvTopic&#8221;  android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;  android:text=&#8221;@string/his_topics&#8221;<br />
style=&#8221;@style/userinfo_panel_textview_title&#8221; /&gt;<br />
&lt;/LinearLayout&gt;<br />
&lt;/RelativeLayout&gt;<br />
代码说明：</p>
<p>2.1.1　　第一个RelativeLayout为图一上的实现代码。注意使用了一个View，也就是一条横线，令其居中布局；&#8221;地址：&#8221;的TextView通过layout_alignParentLeft和layout_alignParentTop令其在整个RelativeLayout顶左顶上；&#8221;账号信息：&#8221;的TextView通过layout_below令其位于横线下方，layout_alignLeft令其与&#8221;地址：&#8221;的TextView左边对齐，然后用layout_alignParentBottom让其居于容器底部。</p>
<p>2.1.2　　第二个RelativeLayout为图一下的实现代码。关键是vVDivider1和vVDivider2，与3.1.1类似，画出了一个十字架的布局，然后分别用居左、居上、居下、居右等方式实现了该布局效果。</p>
<p>2.2　　实现 图二 效果代码</p>
<p>&lt;RelativeLayout android:id=&#8221;@+id/rlpb&#8221;<br />
android:layout_width=&#8221;fill_parent&#8221; android:background=&#8221;#ffeff0f4&#8243;<br />
android:visibility=&#8221;gone&#8221; android:layout_height=&#8221;fill_parent&#8221;<br />
android:layout_weight=&#8221;1.0&#8243;&gt;<br />
&lt;LinearLayout  android:layout_centerInParent=&#8221;true&#8221;<br />
android:layout_width=&#8221;wrap_content&#8221;  android:layout_height=&#8221;wrap_content&#8221;&gt;<br />
&lt;ProgressBar  android:id=&#8221;@+id/prb&#8221;<br />
style=&#8221;?android:attr/progressBarStyleSmallTitle&#8221;<br />
android:layout_width=&#8221;wrap_content&#8221; android:layout_height=&#8221;wrap_content&#8221;  /&gt;<br />
&lt;TextView  android:text=&#8221;@string/loadinfo&#8221;<br />
android:layout_width=&#8221;wrap_content&#8221; android:layout_height=&#8221;wrap_content&#8221;  /&gt;<br />
&lt;/LinearLayout&gt;<br />
&lt;/RelativeLayout&gt;<br />
代码说明：</p>
<p>主要是layout_centerInParent属性的应用，令其居于RelativeLayout的中间。使用的时候领ListView先隐藏，然后让这个布局显示并填充，用完在设置Visible为GONE即可。</p>
<p>三、总结</p>
<p>熟练掌握以下重要属性，并灵活运用：</p>
<p>android:layout_centerInParent　　　居中布局<br />
android:layout_centerVertical　　　  水平居中布局<br />
android:layout_centerHorizontal　　垂直居中布局</p>
<p>android:layout_alignParentTop　　　　居于容器内顶部<br />
android:layout_alignParentBottom　　居于容器内底部<br />
android:layout_alignParentLeft　　　　居于容器内左边<br />
android:layout_alignParentRight　　　  居于容器内右边</p>
<p>android:layout_above　　　　　　　居于指定View的上方<br />
android:layout_below　　　　　　　居于指定View的下方</p>
<p>android:layout_toRightOf　　　　　　在指定View的右边<br />
android:layout_toLeftOf　　　　　　   在指定View的左边</p>
<p>android:layout_alignTop　　　　　　与指定View的Top一致<br />
为了方便大家测试效果，文章末尾提供了资源下载，不足的资源请自行在APK中提取。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/863/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android四种Activity的加载模式</title>
		<link>http://www.javagg.com/archives/861</link>
		<comments>http://www.javagg.com/archives/861#comments</comments>
		<pubDate>Tue, 28 Jun 2011 08:20:22 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=861</guid>
		<description><![CDATA[应用程序组件都有一个生命周期，从响应Intent的Android实例开始到这个实例被销毁。在这期间，他们或许有效或许无效，有效时或许对用户可见或许不可见。下面我们就来讨论四个基本组件的生命周期，包括在生命周期内的各种状态，以及状态之间的转换。这几种状态可能的结果是：进程让他们停止， 然后实例被销毁。
AD：
建议首先阅读下面两篇文章，这样才可以更好的理解Activity的加载模式：
Android的进程，线程模型：
http://www.cnblogs.com/ghj1976/archive/2011/04/28/2031586.html 其中对“Android的单线程模型”的描述，明白Activity的一些注意事项。
Android Application Task Activities的关系
http://www.cnblogs.com/ghj1976/archive/2011/04/29/2032412.html  尤其要明白 Task 是啥。
一个Activty的生命周期
Activty的生命周期的也就是它所在进程的生命周期。
每一个活动（ Activity ）都处于某一个状态，对于开发者来说，是无法控制其应用程序处于某一个状态的，这些均由系统来完成。
但是当一个活动的状态发生改变的时候，开发者可以通过调用 onXX() 的方法获取到相关的通知信息。
在实现 Activity 类的时候，通过覆盖（ override ）这些方法即可在你需要处理的时候来调用。
onCreate ：当活动第一次启动的时候，触发该方法，可以在此时完成活动的初始化工作。
onCreate 方法有一个参数，该参数可以为空（ null ），也可以是之前调用 onSaveInstanceState （）方法保存的状态信息。
onStart ：该方法的触发表示所属活动将被展现给用户。
onResume ：当一个活动和用户发生交互的时候，触发该方法。
onPause ：当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候，触发该方法。这时候需要将活动的状态持久化，比如正在编辑的数据库记录等。
onStop ：当一个活动不再需要展示给用户的时候，触发该方法。如果内存紧张，系统会直接结束这个活动，而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做，而不是onStop时做。活动如果没有在前台运行，都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说，在设计应用程序的时候，必须时刻牢记这一原则。在一些情况下，onPause方法或许是活动触发的最后的方法，因此开发者需要在这个时候保存需要保存的信息。
onRestart ：当处于停止状态的活动需要再次展现给用户的时候，触发该方法。
onDestroy ：当活动销毁的时候，触发该方法。和 onStop 方法一样，如果内存紧张，系统会直接结束这个活动而不会触发该方法。
onSaveInstanceState ：系统调用该方法，允许活动保存之前的状态，比如说在一串字符串中的光标所处的位置等。
通常情况下，开发者不需要重写覆盖该方法，在默认的实现中，已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。 
Activity栈
上面提到开发者是无法控制Activity的状态的，那Activity的状态又是按照何种逻辑来运作的呢？这就要知道 Activity 栈。
每个Activity的状态是由它在Activity栈（是一个后进先出LIFO，包含所有正在运行Activity的队列）中的位置决定的。
当一个新的Activity启动时，当前的活动的Activity将会移到Activity栈的顶部。
如果用户使用后退按钮返回的话，或者前台的Activity结束，在栈上的Activity将会移上来并变为活动状态。如下图所示：
一个应用程序的优先级是受最高优先级的Activity影响的。当决定某个应用程序是否要终结去释放资源，Android内存管理使用栈来决定基于Activity的应用程序的优先级。
Activity状态 一般认为Activity有以下四种状态：
活动的：当一个Activity在栈顶，它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态，杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活，这个将会被暂停。
暂停：在很多情况下，你的Activity可视但是它没有焦点，换句话说它被暂停了。有可能原因是一个透明或者非全屏的Activity被激活。
当被暂停，一个Activity仍会当成活动状态，只不过是不可以接受用户输入。在极特殊的情况下，Android将会杀死一个暂停的Activity来为活动的Activity提供充足的资源。当一个Activity变为完全隐藏，它将会变成停止。
停止：当一个Activity不是可视的，它“停止”了。这个Activity将仍然在内存中保存它所有的状态和会员信息。尽管如此，当其它地方需要内存时，它将是最有可能被释放资源的。当一个Activity停止后，一个很重要的步骤是要保存数据和当前UI状态。一旦一个Activity退出或关闭了，它将变为待用状态。
待用： 在一个Activity被杀死后和被装在前，它是待用状态的。待用Acitivity被移除Activity栈，并且需要在显示和可用之前重新启动它。
activity的四种加载模式
在android的多activity开发中，activity之间的跳转可能需要有多种方式，有时是普通的生成一个新实例，有时希望跳转到原来某个activity实例，而不是生成大量的重复的activity。加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。
在android里，有4种activity的启动模式，分别为：
standard: 标准模式，一调用startActivity()方法就会产生一个新的实例。
singleTop: 如果已经有一个实例位于Activity栈的顶部时，就不产生新的实例，而只是调用Activity中的newInstance()方法。如果不位于栈顶，会产生一个新的实例。
singleTask: 会在一个新的task中产生这个实例，以后每次调用都会使用这个，不会去产生新的实例了。
singleInstance: 这个跟singleTask基本上是一样，只有一个区别：在这个模式下的Activity实例所处的task中，只能有这个activity实例，不能有其他的实例。
这些启动模式可以在功能清单文件AndroidManifest.xml中进行设置，中的launchMode属性。
相关的代码中也有一些标志可以使用,比如我们想只启用一个实例,则可以使用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 标志，这个标志表示：如果这个activity已经启动了，就不产生新的activity，而只是把这个activity实例加到栈顶来就可以了。
Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
Activity的加载模式受启动Activity的Intent对象中设置的Flag和manifest文件中Activity的元素的特性值交互控制。
下面是影响加载模式的一些特性
核心的Intent Flag有：
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP
核心的特性有：
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
四种加载模式的区别
所属task的区别
一般情况下，“standard”和”singleTop”的activity的目标task，和收到的Intent的发送者在同一个task内，就相当于谁调用它，它就跟谁在同一个Task中。
除非Intent包括参数FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK参数，会启动到别的task里。
“singleTask”和”singleInstance” 总是把要启动的activity作为一个task的根元素，他们不会被启动到一个其他task里。
是否允许多个实例
“standard”和”singleTop”可以被实例化多次，并且是可以存在于不同的task中；这种实例化时一个task可以包括一个activity的多个实例；
“singleTask”和”singleInstance”则限制只生成一个实例，并且是task的根元素。
singleTop 要求如果创建intent的时候栈顶已经有要创建的Activity的实例，则将intent发送给该实例，而不创建新的实例。
是否允许其它activity存在于本task内
“singleInstance”独占一个task，其它activity不能存在那个task里；
如果它启动了一个新的activity，不管新的activity的launch [...]]]></description>
			<content:encoded><![CDATA[<p>应用程序组件都有一个生命周期，从响应Intent的Android实例开始到这个实例被销毁。在这期间，他们或许有效或许无效，有效时或许对用户可见或许不可见。下面我们就来讨论四个基本组件的生命周期，包括在生命周期内的各种状态，以及状态之间的转换。这几种状态可能的结果是：进程让他们停止， 然后实例被销毁。<br />
AD：<br />
建议首先阅读下面两篇文章，这样才可以更好的理解Activity的加载模式：<span id="more-861"></span></p>
<p>Android的进程，线程模型：</p>
<p>http://www.cnblogs.com/ghj1976/archive/2011/04/28/2031586.html 其中对“Android的单线程模型”的描述，明白Activity的一些注意事项。</p>
<p>Android Application Task Activities的关系</p>
<p>http://www.cnblogs.com/ghj1976/archive/2011/04/29/2032412.html  尤其要明白 Task 是啥。</p>
<p>一个Activty的生命周期</p>
<p>Activty的生命周期的也就是它所在进程的生命周期。</p>
<p>每一个活动（ Activity ）都处于某一个状态，对于开发者来说，是无法控制其应用程序处于某一个状态的，这些均由系统来完成。</p>
<p>但是当一个活动的状态发生改变的时候，开发者可以通过调用 onXX() 的方法获取到相关的通知信息。</p>
<p>在实现 Activity 类的时候，通过覆盖（ override ）这些方法即可在你需要处理的时候来调用。</p>
<p>onCreate ：当活动第一次启动的时候，触发该方法，可以在此时完成活动的初始化工作。</p>
<p>onCreate 方法有一个参数，该参数可以为空（ null ），也可以是之前调用 onSaveInstanceState （）方法保存的状态信息。</p>
<p>onStart ：该方法的触发表示所属活动将被展现给用户。</p>
<p>onResume ：当一个活动和用户发生交互的时候，触发该方法。</p>
<p>onPause ：当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候，触发该方法。这时候需要将活动的状态持久化，比如正在编辑的数据库记录等。</p>
<p>onStop ：当一个活动不再需要展示给用户的时候，触发该方法。如果内存紧张，系统会直接结束这个活动，而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做，而不是onStop时做。活动如果没有在前台运行，都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说，在设计应用程序的时候，必须时刻牢记这一原则。在一些情况下，onPause方法或许是活动触发的最后的方法，因此开发者需要在这个时候保存需要保存的信息。</p>
<p>onRestart ：当处于停止状态的活动需要再次展现给用户的时候，触发该方法。</p>
<p>onDestroy ：当活动销毁的时候，触发该方法。和 onStop 方法一样，如果内存紧张，系统会直接结束这个活动而不会触发该方法。</p>
<p>onSaveInstanceState ：系统调用该方法，允许活动保存之前的状态，比如说在一串字符串中的光标所处的位置等。</p>
<p>通常情况下，开发者不需要重写覆盖该方法，在默认的实现中，已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。 </p>
<p>Activity栈</p>
<p>上面提到开发者是无法控制Activity的状态的，那Activity的状态又是按照何种逻辑来运作的呢？这就要知道 Activity 栈。</p>
<p>每个Activity的状态是由它在Activity栈（是一个后进先出LIFO，包含所有正在运行Activity的队列）中的位置决定的。</p>
<p>当一个新的Activity启动时，当前的活动的Activity将会移到Activity栈的顶部。</p>
<p>如果用户使用后退按钮返回的话，或者前台的Activity结束，在栈上的Activity将会移上来并变为活动状态。如下图所示：</p>
<p>一个应用程序的优先级是受最高优先级的Activity影响的。当决定某个应用程序是否要终结去释放资源，Android内存管理使用栈来决定基于Activity的应用程序的优先级。</p>
<p>Activity状态 一般认为Activity有以下四种状态：</p>
<p>活动的：当一个Activity在栈顶，它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态，杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活，这个将会被暂停。</p>
<p>暂停：在很多情况下，你的Activity可视但是它没有焦点，换句话说它被暂停了。有可能原因是一个透明或者非全屏的Activity被激活。</p>
<p>当被暂停，一个Activity仍会当成活动状态，只不过是不可以接受用户输入。在极特殊的情况下，Android将会杀死一个暂停的Activity来为活动的Activity提供充足的资源。当一个Activity变为完全隐藏，它将会变成停止。</p>
<p>停止：当一个Activity不是可视的，它“停止”了。这个Activity将仍然在内存中保存它所有的状态和会员信息。尽管如此，当其它地方需要内存时，它将是最有可能被释放资源的。当一个Activity停止后，一个很重要的步骤是要保存数据和当前UI状态。一旦一个Activity退出或关闭了，它将变为待用状态。</p>
<p>待用： 在一个Activity被杀死后和被装在前，它是待用状态的。待用Acitivity被移除Activity栈，并且需要在显示和可用之前重新启动它。</p>
<p>activity的四种加载模式</p>
<p>在android的多activity开发中，activity之间的跳转可能需要有多种方式，有时是普通的生成一个新实例，有时希望跳转到原来某个activity实例，而不是生成大量的重复的activity。加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。</p>
<p>在android里，有4种activity的启动模式，分别为：</p>
<p>standard: 标准模式，一调用startActivity()方法就会产生一个新的实例。</p>
<p>singleTop: 如果已经有一个实例位于Activity栈的顶部时，就不产生新的实例，而只是调用Activity中的newInstance()方法。如果不位于栈顶，会产生一个新的实例。</p>
<p>singleTask: 会在一个新的task中产生这个实例，以后每次调用都会使用这个，不会去产生新的实例了。</p>
<p>singleInstance: 这个跟singleTask基本上是一样，只有一个区别：在这个模式下的Activity实例所处的task中，只能有这个activity实例，不能有其他的实例。</p>
<p>这些启动模式可以在功能清单文件AndroidManifest.xml中进行设置，中的launchMode属性。</p>
<p>相关的代码中也有一些标志可以使用,比如我们想只启用一个实例,则可以使用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 标志，这个标志表示：如果这个activity已经启动了，就不产生新的activity，而只是把这个activity实例加到栈顶来就可以了。</p>
<p>Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);<br />
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);<br />
startActivity(intent);<br />
Activity的加载模式受启动Activity的Intent对象中设置的Flag和manifest文件中Activity的元素的特性值交互控制。</p>
<p>下面是影响加载模式的一些特性</p>
<p>核心的Intent Flag有：</p>
<p>FLAG_ACTIVITY_NEW_TASK<br />
FLAG_ACTIVITY_CLEAR_TOP<br />
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED<br />
FLAG_ACTIVITY_SINGLE_TOP<br />
核心的特性有：<br />
taskAffinity<br />
launchMode<br />
allowTaskReparenting<br />
clearTaskOnLaunch<br />
alwaysRetainTaskState<br />
finishOnTaskLaunch</p>
<p>四种加载模式的区别</p>
<p>所属task的区别</p>
<p>一般情况下，“standard”和”singleTop”的activity的目标task，和收到的Intent的发送者在同一个task内，就相当于谁调用它，它就跟谁在同一个Task中。</p>
<p>除非Intent包括参数FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK参数，会启动到别的task里。</p>
<p>“singleTask”和”singleInstance” 总是把要启动的activity作为一个task的根元素，他们不会被启动到一个其他task里。</p>
<p>是否允许多个实例</p>
<p>“standard”和”singleTop”可以被实例化多次，并且是可以存在于不同的task中；这种实例化时一个task可以包括一个activity的多个实例；</p>
<p>“singleTask”和”singleInstance”则限制只生成一个实例，并且是task的根元素。</p>
<p>singleTop 要求如果创建intent的时候栈顶已经有要创建的Activity的实例，则将intent发送给该实例，而不创建新的实例。</p>
<p>是否允许其它activity存在于本task内</p>
<p>“singleInstance”独占一个task，其它activity不能存在那个task里；</p>
<p>如果它启动了一个新的activity，不管新的activity的launch mode 如何，新的activity都将会到别的task里运行（如同加了FLAG_ACTIVITY_NEW_TASK参数）。</p>
<p>而另外三种模式，则可以和其它activity共存。</p>
<p>是否每次都生成新实例</p>
<p>“standard”对于每一个启动Intent都会生成一个activity的新实例；</p>
<p>“singleTop”的activity如果在task的栈顶的话，则不生成新的该activity的实例，直接使用栈顶的实例，否则，生成该activity的实例。</p>
<p>比如：</p>
<p>现在task栈元素为A-B-C-D（D在栈顶），这时候给D发一个启动intent，如果D是 “standard”的，则生成D的一个新实例，栈变为A－B－C－D－D。</p>
<p>如果D是singleTop的话，则不会生产D的新实例，栈状态仍为A-B-C-D</p>
<p>如果这时候给B发Intent的话，不管B的launchmode是”standard” 还是 “singleTop” ，都会生成B的新实例，栈状态变为A-B-C-D-B。</p>
<p>“singleInstance”是其所在栈的唯一activity，它会每次都被重用。</p>
<p>“singleTask”  如果在栈顶，则接受intent，否则，该intent会被丢弃，但是该task仍会回到前台。 当已经存在的activity实例处理新的intent时候，会调用onNewIntent()方法，如果收到intent生成一个activity实例，那么用户可以通过back键回到上一个状态；如果是已经存在的一个activity来处理这个intent的话，用户不能通过按back键返回到这之前的状态。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/861/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android绘图性能的各种优化方法！</title>
		<link>http://www.javagg.com/archives/859</link>
		<comments>http://www.javagg.com/archives/859#comments</comments>
		<pubDate>Wed, 22 Jun 2011 09:01:37 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=859</guid>
		<description><![CDATA[图片质量对Android绘图速度影响很大，一般对于非透明图片要使用RGB565彩色模式，透明图片尽可能使用RGBA4444彩色模式，RGBA8888及以上色彩模式图片非极端必要不要使用（同样大小的图片，你找10张设成RGBA8888，十张设成RGB565自己看看FPS差异）。另外Android中做过一些通用的缓存设置，非必要的话不要开启（比如setBackgroundDrawable无特殊需要建议设为null,setAlwaysDrawnWithCacheEnabled、setDrawingCacheEnabled、setWillNotCacheDrawing之类参数不需要就全设成关闭）。
]]></description>
			<content:encoded><![CDATA[<p>图片质量对Android绘图速度影响很大，一般对于非透明图片要使用RGB565彩色模式，透明图片尽可能使用RGBA4444彩色模式，RGBA8888及以上色彩模式图片非极端必要不要使用（同样大小的图片，你找10张设成RGBA8888，十张设成RGB565自己看看FPS差异）。另外Android中做过一些通用的缓存设置，非必要的话不要开启（比如setBackgroundDrawable无特殊需要建议设为null,setAlwaysDrawnWithCacheEnabled、setDrawingCacheEnabled、setWillNotCacheDrawing之类参数不需要就全设成关闭）。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/859/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash游戏引擎清单</title>
		<link>http://www.javagg.com/archives/856</link>
		<comments>http://www.javagg.com/archives/856#comments</comments>
		<pubDate>Thu, 16 Jun 2011 06:12:55 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[as]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=856</guid>
		<description><![CDATA[最近关于创建Flash游戏的流言四起,尤其是社区游戏.像由Zynga, Playfish, Playdom,WonderHill提供的Flash游戏都需要你付款。查看了他们的网页和作品集后获取到关于社区游戏的大量图片。
我会一直更新这个清单以帮助你开始构造Flash游戏或了解最新的发展,它主要包括了一些库和引擎.
•2D Engines
•ISO Engines
•Physics Engines
•3D Engines
•Social Gaming Platforms
•Useful AS3 Libs
我们同时也开通了Flash Platform Game Technology Center,对于每一个开发者，它肯定是一个非常不错的资源.
这些库我个人认为对开发游戏是非常有用的.其中一些仅仅是作为游戏的组件.我不打算对每个引擎写太多篇幅，它们的各种功能都很相似,比如碰撞检测、物理引擎、瓦片地图、优化渲染、层、音乐/音量、游戏状态、积分等等。其中一些甚至支持多人游戏.最好试玩一下游戏demo并在操作中查看这些的功能.
2D引擎
Flixel
面向2D bitmap平台游戏开发者的功能全面的游戏引擎.查看功能列表.
你可能已经知著名的游戏Canabalt，它就是由这款引擎构建的.
FlashPunk
另一款很不错且速度相当快的2D bitmap游戏引擎.
PushButton Engine
集成Box2D物理引擎和支持多人网络的很不错的游戏引擎.可以在facebook上尝试一下YouTopia.
ISO engines
AS3 ISO LIB
As3isolib包含了工具、原型和视图。As3isolib开发起来很简单、快速，所以使开发者能集中在实际的应用中，而不是去学习复杂的API.
TheoWorlds
“TheoSDK是一套基于我们的original Theo Isometric Engine的引擎,它让你快速创建自己的基于地图的游戏。”
物理引擎
JigLib &#8211; 3D 物理引擎
Box2D &#8211; 2D 物理引擎
APE (ActionScript物理引擎) - 2D 物理引擎
WOW Engine - 3D 物理引擎
3D engines (相关的)
Alternativa3D, Away3D, Papervision3D, Five3D, Sandy 3D
TankiOnline &#8211; 流行的Flash 3D游戏,使用Alternativa3D引擎.
发布你的游戏：社区游戏平台
Platogo
构建游戏并发布到Platogo便可以赚到钱-社区平台为游戏提供了ActionScript 3 API (积分，等级，排名，多玩家等).
Geewa.com这个社区站点支持多玩家.获取SDK.
Facebook无疑facebook是你游戏最好的平台.获取 Facebook ActionScript API.
在Devnet上查看flash中怎么开发Fackbook应用程序.
http://www.adobe.com/devnet/facebook
其它一些有用的ActionScript类库
BaseUI
设计很像Flex,但是主要是用于Flash(纯AS3,非Flex).
vancura-AS3-libs
提供纯AS3组件的皮肤和样式的集合。支持Scale9Bitmap.
BrowserCanvas
提供容易的方式动态修改Flash尺寸大小.
FreeSpin3D
Flash CS4和CS3的插件,支持实时交互，动画,在Flash  Professional的舞台上正确的编码.
从现在起加油吧，向你自己的游戏看齐!
顺便提一下:尝试一下 SmallWorlds
]]></description>
			<content:encoded><![CDATA[<p>最近关于创建Flash游戏的流言四起,尤其是社区游戏.像由<a href="http://www.zynga.com/" target="_blank">Zynga</a>, <a href="http://www.playfish.com/" target="_blank">Playfish</a>, <a href="http://www.playdom.com/" target="_blank">Playdom</a>,<a href="http://www.wonderhill.com/" target="_blank">WonderHill</a>提供的Flash游戏都需要你付款。查看了他们的网页和作品集后获取到关于社区游戏的大量图片。<span id="more-856"></span></p>
<p>我会一直更新这个清单以帮助你开始构造Flash游戏或了解最新的发展,它主要包括了一些库和引擎.<br />
•<a href="http://www.flashrealtime.com/flash-game-library-engine-list/#2D" target="_blank">2D Engines</a><br />
•<a href="http://www.flashrealtime.com/flash-game-library-engine-list/#ISO" target="_blank">ISO Engines</a><br />
•<a href="http://www.flashrealtime.com/flash-game-library-engine-list/#ISO" target="_blank">Physics Engines</a><br />
•<a href="http://www.flashrealtime.com/flash-game-library-engine-list/#3D" target="_blank">3D Engines</a><br />
•<a href="http://www.flashrealtime.com/flash-game-library-engine-list/#Social" target="_blank">Social Gaming Platforms</a><br />
•<a href="http://www.flashrealtime.com/flash-game-library-engine-list/#other" target="_blank">Useful AS3 Libs</a></p>
<p>我们同时也开通了<a href="http://www.adobe.com/devnet/games/" target="_blank">Flash Platform Game Technology Center</a>,对于每一个开发者，它肯定是一个非常不错的资源.</p>
<p>这些库我个人认为对开发游戏是非常有用的.其中一些仅仅是作为游戏的组件.我不打算对每个引擎写太多篇幅，它们的各种功能都很相似,比如碰撞检测、物理引擎、瓦片地图、优化渲染、层、音乐/音量、游戏状态、积分等等。其中一些甚至支持多人游戏.最好试玩一下游戏demo并在操作中查看这些的功能.<br />
<span style="font-size: x-large;">2D引擎</span><br />
<a href="http://flixel.org/" target="_blank">Flixel</a><br />
面向2D bitmap平台游戏开发者的功能全面的游戏引擎.查看<a href="http://wiki.github.com/AdamAtomic/flixel/what-is-flixel" target="_blank">功能列表</a>.</p>
<p>你可能已经知著名的游戏<a href="http://www.adamatomic.com/canabalt/" target="_blank">Canabalt</a>，它就是由这款引擎构建的.</p>
<p><a href="http://flashpunk.net/" target="_blank">FlashPunk</a><br />
另一款很不错且速度相当快的2D bitmap游戏引擎.</p>
<p><a href="http://pushbuttonengine.com/" target="_blank">PushButton Engine</a><br />
集成Box2D物理引擎和支持多人网络的很不错的游戏引擎.可以在facebook上尝试一下<a href="http://apps.facebook.com/you-topia/" target="_blank">YouTopia</a>.</p>
<p><span style="font-size: x-large;">ISO engines</span><br />
<a href="http://code.google.com/p/as3isolib/" target="_blank">AS3 ISO LIB</a><br />
As3isolib包含了工具、原型和视图。As3isolib开发起来很简单、快速，所以使开发者能集中在实际的应用中，而不是去学习复杂的API.</p>
<p><a href="http://www.theoworlds.com/" target="_blank">TheoWorlds</a><br />
“TheoSDK是一套基于我们的original Theo Isometric Engine的引擎,它让你快速创建自己的基于地图的游戏。”</p>
<p><span style="font-size: x-large;">物理引擎</span><br />
<a href="http://www.jiglibflash.com/blog/" target="_blank">JigLib</a> &#8211; 3D 物理引擎<br />
<a href="http://box2dflash.sourceforge.net/" target="_blank">Box2D</a> &#8211; 2D 物理引擎<br />
<a href="http://www.cove.org/ape/" target="_blank">APE (ActionScript物理引擎) </a>- 2D 物理引擎<br />
<a href="http://code.google.com/p/wow-engine/" target="_blank">WOW Engine </a>- 3D 物理引擎</p>
<p><span style="font-size: x-large;">3D engines (相关的)</span><br />
<a href="http://alternativaplatform.com/en/" target="_blank">Alternativa3D</a>, <a href="http://www.away3d.com/" target="_blank">Away3D</a>,<a href="http://blog.papervision3d.org/" target="_blank"> Papervision3D</a>,<a href="http://five3d.mathieu-badimon.com/" target="_blank"> Five3D</a>, <a href="http://www.flashsandy.org/" target="_blank">Sandy 3D</a></p>
<p><a href="http://tankionline.com/" target="_blank">TankiOnline</a> &#8211; 流行的Flash 3D游戏,使用Alternativa3D引擎.</p>
<p><span style="font-size: x-large;">发布你的游戏：社区游戏平台</span><br />
<a href="http://platogo.com/" target="_blank">Platogo</a><br />
构建游戏并发布到Platogo便可以赚到钱-社区平台为游戏提供了ActionScript 3 API (积分，等级，排名，多玩家等).</p>
<p><a href="http://geewa.com/" target="_blank">Geewa.com</a>这个社区站点支持多玩家.获取<a href="http://developer.geewa.com/game-sdk/flash/" target="_blank">SDK</a>.</p>
<p><a href="http://facebook.com/" target="_blank">Facebook</a>无疑facebook是你游戏最好的平台.获取<a href="http://code.google.com/p/facebook-actionscript-api/" target="_blank"> Facebook ActionScript API</a>.<br />
在Devnet上查看flash中怎么开发Fackbook应用程序.<br />
<a href="http://www.adobe.com/devnet/facebook" target="_blank">http://www.adobe.com/devnet/facebook</a></p>
<p><span style="font-size: x-large;">其它一些有用的ActionScript类库</span><br />
<a href="http://www.soundstep.com/blog/downloads/baseui/" target="_blank">BaseUI</a><br />
设计很像Flex,但是主要是用于Flash(纯AS3,非Flex).<br />
<a href="http://github.com/vancura/vancura-as3-libs" target="_blank">vancura-AS3-libs</a><br />
提供纯AS3组件的皮肤和样式的集合。支持Scale9Bitmap.<br />
<a href="http://www.dncompute.com/blog/2008/06/23/browsercanvas-the-worlds-easiest-way-to-dynamically-resize-flash.html" target="_blank">BrowserCanvas</a><br />
提供容易的方式动态修改Flash尺寸大小.<br />
<a href="http://freespin3d.com/" target="_blank">FreeSpin3D</a><br />
Flash CS4和CS3的插件,支持实时交互，动画,在Flash  Professional的舞台上正确的编码.</p>
<p>从现在起加油吧，向你自己的游戏看齐!<br />
顺便提一下:尝试一下 <a href="http://smallworlds.com/" target="_blank">SmallWorlds</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/856/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>android1.5~2.1相关API升级变化对比 转</title>
		<link>http://www.javagg.com/archives/854</link>
		<comments>http://www.javagg.com/archives/854#comments</comments>
		<pubDate>Wed, 25 May 2011 11:33:04 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=854</guid>
		<description><![CDATA[Android 2.1 API变更概要:
Live Wallpapers 动态桌面
以下增加的API可以提供你开发动态的桌面:
· 新android.service.wallpaper 包.
· 新WallpaperInfo 类.
· 升级的WallpaperManager.
附加说明, 如果你的应用相提供Live Wallpapers的功能, 你必须记得增加一个  元素到你的应用manifest里面. 宣布这个属性android:name=&#8221;android.software.live_wallpaper&#8221;. 举例:
电话
· 新的SignalStrength 类提供当前网络信号的一些信息这些信息可以从onSignalStrengthsChanged(SignalStrength) 回调.
· 新的onDataConnectionStateChanged(int, int) 回调.
Views
· 新的View 方法isOpaque() 和onDrawScrollBars(Canvas).
· 新的RemoteViews 方法addView(int, RemoteViews) 和removeAllViews(int).
· 新的ViewGroup 方法isChildrenDrawingOrderEnabled() 和setChildrenDrawingOrderEnabled(boolean).
WebKit
· 新的WebStorage 方法操作网页数据缓存.
· 新的GeolocationPermissions 方法获取 Geolocation permissions 的出处, 把他们设置到 WebView上.
· 新的WebSettings 方法管理软件缓存, 网页缓存 和屏幕的缩放.
· 新的WebChromeClient 方法处理视频, 历史记录, 自定义view, 软件缓存限制还有其他
Android 2.0.1 API变更概要:
· 新的快速联系人标记风格(quickContactBadgeStyle)* 属性,让应用的QuickContactBadge [...]]]></description>
			<content:encoded><![CDATA[<p>Android 2.1 API变更概要:<br />
Live Wallpapers 动态桌面<br />
以下增加的API可以提供你开发动态的桌面:<br />
· 新android.service.wallpaper 包.<br />
· 新WallpaperInfo 类.<br />
· 升级的WallpaperManager.</p>
<p>附加说明, 如果你的应用相提供Live Wallpapers的功能, 你必须记得增加一个 <uses-feature> 元素到你的应用manifest里面. 宣布这个属性android:name=&#8221;android.software.live_wallpaper&#8221;. 举例:<uses-feature android:name="android.software.live_wallpaper" /><span id="more-854"></span></p>
<p>电话</p>
<p>· 新的SignalStrength 类提供当前网络信号的一些信息这些信息可以从onSignalStrengthsChanged(SignalStrength) 回调.</p>
<p>· 新的onDataConnectionStateChanged(int, int) 回调.<br />
Views<br />
· 新的View 方法isOpaque() 和onDrawScrollBars(Canvas).<br />
· 新的RemoteViews 方法addView(int, RemoteViews) 和removeAllViews(int).</p>
<p>· 新的ViewGroup 方法isChildrenDrawingOrderEnabled() 和setChildrenDrawingOrderEnabled(boolean).</p>
<p>WebKit<br />
· 新的WebStorage 方法操作网页数据缓存.<br />
· 新的GeolocationPermissions 方法获取 Geolocation permissions 的出处, 把他们设置到 WebView上.<br />
· 新的WebSettings 方法管理软件缓存, 网页缓存 和屏幕的缩放.<br />
· 新的WebChromeClient 方法处理视频, 历史记录, 自定义view, 软件缓存限制还有其他</p>
<p>Android 2.0.1 API变更概要:<br />
· 新的快速联系人标记风格(quickContactBadgeStyle)* 属性,让应用的QuickContactBadge 组件接收必要的风格.<br />
· 当在manifest里面宣布了filter,取消了支持 ACTION_CONFIGURATION_CHANGED 广播 ,如果想要去接收这个广播, 这个应用必须注册 registerReceiver(BroadcastReceiver, IntentFilter).<br />
性能上的改变:<br />
Bluetooth<br />
改变了 ACTION_REQUEST_ENABLE 和ACTION_REQUEST_DISCOVERABLE的返回值<br />
· ACTION_REQUEST_ENABLE 如果蓝牙是成功开启的,现在返回RESULT_OK .如果使用者拒绝开启蓝牙的请求,则会返回RESULT_CANCELED .<br />
· ACTION_REQUEST_DISCOVERABLE 如果使用者拒绝启动蓝牙或者蓝牙的可发现功能,则返回 RESULT_CANCELED .<br />
通讯<br />
The ACTION_INSERT Intent returns RESULT_CANCELED in cases where the contact was not persisted (例如剪切保存到一个空的操作里面).<br />
修复错误:<br />
资源<br />
现在framework可以正选择应用资源的根据API等级划分的文件夹(drawable-v4是API level4版本用的资源).现在的版本这个功能不能正常工作的问题已经修复.<br />
Contacts<br />
The ACTION_INSERT Intent now returns the appropriate kind of URI when the request is made using the (now deprecated) Contacts APIs.<br />
Other Framework fixes<br />
· getCallingPackage() 现在正确的报告包名, 而不是进程名.</p>
<p>Android 2.0 API变更概要:<br />
Bluetooth<br />
· 开启关闭蓝牙<br />
· 设备和服务发现<br />
· 使用 RFCOMM连接一个可插拔的设备收发数据<br />
· 公布RFCOMM 服务和监听接收 RFCOMM 连接<br />
Sync adapters<br />
· 新的APIs, 同步桥接器连接任何backend<br />
Account Manager<br />
· 集中的帐户管理器 API ,安全的储存和使用可信的tokens/passwords<br />
Contacts<br />
· 新的通信APIs 允许获取多个账户的数据.<br />
· 新的快速通信framework APIs 允许开发者在他们的应用中创建通信标记, 一键点击标记打开一个新的窗口展示一个如何联系当前人的列表.<br />
WebView<br />
· 不赞成使用的类: UrlInterceptHandler, Plugin, PluginData, PluginList, UrlInterceptRegistry.<br />
Camera<br />
· 颜色模式, 场景模式 闪光模式, 焦点模式, 白平衡 旋转和其他设置的新的特征.<br />
· 当缩放级别改变的时候,会回调新的缩放回调接口.<br />
Media<br />
· MediaScanner现在为所有图片生成缩微图when they are inserted into MediaStore.<br />
· 新的缩微图 API : 检索需要的图片和视频的缩微图.<br />
Other Framework<br />
· android.R.style 中新的系统主题,能够更加简单的显示当前acitivities的系统壁纸或者保持之前的activity在后台.新的壁纸管理器API 取代并且增加了wallpaper APIs ,我们可以允许我们的应用要求设置系统壁纸.<br />
· 新的Service APIs帮助应用准确的处理Service 生命周期 ,在指定的低内存状态下service将会被关闭.<br />
o Service.setForeground() 不推荐使用,并且现在这个方法并没有实际执行. .他被一个新的API所取代, startForeground(), that helps (and requires) associating an ongoing notification with the foreground state.<br />
· MotionEvent 如果设备允许的话,MotionEvent 会返回多点触摸信息.最多可同时获取3点<br />
· KeyEvent 现在有了新的按键发送 APIs,去帮助实现 action-on-up 和长按键行为, 一个新的机制取消按键 (虚拟按键).<br />
· WindowManager.LayoutParams 现在有了新的常量允许窗口能够在被锁或者其他的状况中唤醒屏幕,这个允许程序能够让例如闹钟等的应用实现唤醒设备.<br />
· New Intent APIs 广播设备的对接状态,当这个设备放在桌面或者停车场,允许程序启动特殊的activity.<br />
Key events executed on key-up<br />
Android 2.0能够使用虚拟按键HOME, MENU, BACK和SEARCH,而非物理按键,为了让用户在他们的设备中获得最好的用户体验,android平台现在把这些按键执行加入到了key-up,做了 key-down/key-up 配对,而非只有key-down.,这有助于防止意外按钮事件，并让使用者按下按钮区域，然后拖动而不生成一个事件出来。<br />
这种改变只会影响你的应用程序一点,如果它是拦截按钮事件，最好用key-down，而不是key-up.。特例,如果您的应用程序拦截BACK 键，你应该确保你的应用妥善处理按键事件。<br />
Android 1.6 API变更概要:<br />
UI framework<br />
· 新的类 android.view.animation 控制动画行为:<br />
o AnticipateInterpolator<br />
o AnticipateOvershootInterpolator<br />
o BounceInterpolator<br />
o OvershootInterpolator<br />
· 新的XML 属性android:onClick ,从一个layout文件描述一个view的 View.OnClickListener.<br />
· 对不同分辨率的屏幕的新的支持. 对于Bitmap和Canvas会执行有针对性的缩放行为.该框架会根据屏幕分辨率和其他内容自动缩放bitmap等.<br />
要在你的应用中使用Android 1.6包含的API的话你必须要设置 &#8220;4&#8243;属性在manifest的<uses-sdk> 元素中<br />
Search framework<br />
· 应用程序现在可以公开的有关内容，作为建议放入快速搜索框，新的设备范围内的搜索功能，是可从主屏幕搜索。为了支持这一点，搜索框架增加了新的属性，可搜索的元数据文件。有关完整的信息，请参阅SearchManager<br />
文档。<br />
Accessibility framework<br />
· New android.accessibility package that includes classes for capturing accessibility events and forwarding them to an AccessibilityService handler.<br />
· New AccessibilityService package that lets your application track user events and provide visual, audible, or haptic feedback to the user.<br />
Gesture Input<br />
· 新的gesture API :创建,识别,读取,保存手势.<br />
Text-to-speech<br />
· 新的android.speech.tts 包提供了TTS文本朗读功能,从一个文本生成一个声音文件的回放.<br />
Graphics<br />
·<br />
android.graphics 中的类,现在支持为不同的屏幕尺寸进行缩放.<br />
Telephony<br />
· 新的SmsManager 发送和接受短信.<br />
Utilities<br />
· 新的DisplayMetrics 字段决定当前设备屏幕的密度.<br />
Android Manifest elements<br />
o 新的<uses-feature> 元素<br />
o 新的<supports-screens> 标签<br />
o glEsVersion: 指定最小openGL ES的版本<br />
·<br />
<uses-sdk> 元素的新的属性:<br />
o 目标SDK版本: 应用程序能够指定目标版本. 它能够运行在旧版本（低至minSdkVersion）, 他是按照应用程序的指定版本开发的. Specifying this version allows the platform to disable compatibility code that is not required or enable newer features that are not available to older applications.<br />
o maxSdkVersion: 指定设计这个程序运行的最高版本 重要: 当使用 <uses-sdk> 这些属性前请认真阅读文档.<br />
New Permissions<br />
· CHANGE_WIFI_MULTICAST_STATE: 允许应用进入Wi-Fi 多点传送模式.<br />
· GLOBAL_SEARCH: 允许全局搜索系统,以便精确确定 content provider.<br />
· INSTALL_LOCATION_PROVIDER: 允许应用在Location Manager.安装一个location provider.<br />
· READ_HISTORY_BOOKMARKS: 允许应用读取(并不能写) 用户的浏览记录和书签<br />
· WRITE_HISTORY_BOOKMARKS: 允许应用写入 (并不能读) 用户的浏览记录和书签<br />
· WRITE_EXTERNAL_STORAGE: 允许程序写入外部存储器.应用程序使用API级别3下将默认授予此权限 (这对用户可见的); 应用程序使用API level4 或者更高的,必须要明确的宣告此权限.</p>
<p>Android 1.5 API变更概要:<br />
UI framework<br />
· Framework for easier background/UI thread interaction<br />
· 新SlidingDrawer 组件<br />
· 新HorizontalScrollview 组件<br />
AppWidget framework<br />
· 一些关于创建桌面AppWidget 的API.<br />
· 提供根据自定义的内容创建LiveFolders的API<br />
Media framework<br />
· 原声录音和回放 APIs<br />
· 交互式的MIDI 回放引擎<br />
· 开发者使用的视频录像API (3GP format).<br />
· 视频相片分享 Intents<br />
· 媒体搜索Intent<br />
Input Method framework<br />
· 输入法服务framework<br />
· 文本预测引擎<br />
· 提供具有下载能力的IME给使用者<br />
Application-defined hardware requirements<br />
应用可定义硬件需求,应用程序可以定义 <uses- configuration> 说明此程序需要什么硬件需求.比如是否需要物理键盘或者轨迹球.<br />
Speech recognition framework<br />
· 支持语音识别库.<br />
Miscellaneous API additions<br />
· LocationManager -应用可以接收到位置改变的信息.<br />
· WebView &#8211; 触摸start/end/move/cancel  DOM 事件的支持<br />
· 重建Sensor Manager APIs<br />
· GLSurfaceView &#8211; 创建OpenGL 应用更加方便的framework .<br />
· 软件升级安装成功的Broadcast Intent &#8211; 更加平和优秀的软件升级体验 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/854/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android uses-permission大全</title>
		<link>http://www.javagg.com/archives/852</link>
		<comments>http://www.javagg.com/archives/852#comments</comments>
		<pubDate>Fri, 20 May 2011 01:43:44 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=852</guid>
		<description><![CDATA[android.permission.ACCESS_CHECKIN_PROPERTIES
允许读写访问”properties”表在checkin数据库中，改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded)
android.permission.ACCESS_COARSE_LOCATION
允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location)
android.permission.ACCESS_FINE_LOCATION
允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location)
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands)
android.permission.ACCESS_MOCK_LOCATION
允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing)
android.permission.ACCESS_NETWORK_STATE
允许程序访问有关GSM网络信息(Allows applications to [...]]]></description>
			<content:encoded><![CDATA[<p>android.permission.ACCESS_CHECKIN_PROPERTIES<br />
允许读写访问”properties”表在checkin数据库中，改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded)</p>
<p>android.permission.ACCESS_COARSE_LOCATION<br />
允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location)<span id="more-852"></span></p>
<p>android.permission.ACCESS_FINE_LOCATION<br />
允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location)</p>
<p>android.permission.ACCESS_LOCATION_EXTRA_COMMANDS<br />
允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands)</p>
<p>android.permission.ACCESS_MOCK_LOCATION<br />
允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing)</p>
<p>android.permission.ACCESS_NETWORK_STATE<br />
允许程序访问有关GSM网络信息(Allows applications to access information about networks)</p>
<p>android.permission.ACCESS_SURFACE_FLINGER<br />
允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceFlinger’s low level features)</p>
<p>android.permission.ACCESS_WIFI_STATE<br />
允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks)</p>
<p>android.permission.ADD_SYSTEM_SERVICE<br />
允许程序发布系统级服务(Allows an application to publish system-level services).</p>
<p>android.permission.BATTERY_STATS<br />
允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics)</p>
<p>android.permission.BLUETOOTH<br />
允许程序连接到已配对的蓝牙设备(Allows applications to connect to paired bluetooth devices)</p>
<p>android.permission.BLUETOOTH_ADMIN<br />
允许程序发现和配对蓝牙设备(Allows applications to discover and pair bluetooth devices)</p>
<p>android.permission.BRICK<br />
请求能够禁用设备(非常危险)(Required to be able to disable the device (very *erous!).)</p>
<p>android.permission.BROADCAST_PACKAGE_REMOVED<br />
允许程序广播一个提示消息在一个应用程序包已经移除后(Allows an application to broadcast a notification that an application</p>
<p>package has been removed)</p>
<p>android.permission.BROADCAST_STICKY<br />
允许一个程序广播常用intents(Allows an application to broadcast sticky intents)</p>
<p>android.permission.CALL_PHONE<br />
允许一个程序初始化一个电话拨号不需通过拨号用户界面需要用户确认(Allows an application to initiate a phone call without going through the Dialer user interface for the user to confirm the call being placed.)</p>
<p>android.permission.CALL_PRIVILEGED<br />
允许一个程序拨打任何号码，包含紧急号码无需通过拨号用户界面需要用户确认(Allows an application to call any phone number, including emergency numbers, without going through the Dialer user interface for the user to confirm the call being placed)</p>
<p>android.permission.CAMERA<br />
请求访问使用照相设备(Required to be able to access the camera device. )</p>
<p>android.permission.CHANGE_COMPONENT_ENABLED_STATE<br />
允许一个程序是否改变一个组件或其他的启用或禁用(Allows an application to change whether an application component (other than its own) is enabled or not. )</p>
<p>android.permission.CHANGE_CONFIGURATION<br />
允许一个程序修改当前设置，如本地化(Allows an application to modify the current configuration, such as locale. )</p>
<p>android.permission.CHANGE_NETWORK_STATE<br />
允许程序改变网络连接状态(Allows applications to change network connectivity state)</p>
<p>android.permission.CHANGE_WIFI_STATE<br />
允许程序改变Wi-Fi连接状态(Allows applications to change Wi-Fi connectivity state)</p>
<p>android.permission.CLEAR_APP_CACHE<br />
允许一个程序清楚缓存从所有安装的程序在设备中(Allows an application to clear the caches of all installed applications on the device. )</p>
<p>android.permission.CLEAR_APP_USER_DATA<br />
允许一个程序清除用户设置(Allows an application to clear user data)</p>
<p>android.permission.CONTROL_LOCATION_UPDATES<br />
允许启用禁止位置更新提示从无线模块(Allows enabling/disabling location update notifications from the radio. )</p>
<p>android.permission.DELETE_CACHE_FILES<br />
允许程序删除缓存文件(Allows an application to delete cache files)</p>
<p>android.permission.DELETE_PACKAGES<br />
允许一个程序删除包(Allows an application to delete packages)</p>
<p>android.permission.DEVICE_POWER<br />
允许访问底层电源管理(Allows low-level access to power management)</p>
<p>android.permission.DIAGNOSTIC<br />
允许程序RW诊断资源(Allows applications to RW to diagnostic resources. )</p>
<p>android.permission.DISABLE_KEYGUARD<br />
允许程序禁用键盘锁(Allows applications to disable the keyguard )</p>
<p>android.permission.DUMP<br />
允许程序返回状态抓取信息从系统服务(Allows an application to retrieve state dump information from system services.)</p>
<p>android.permission.EXPAND_STATUS_BAR<br />
允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序(Allows an application to expand or collapse the status bar. )</p>
<p>android.permission.FACTORY_TEST<br />
作为一个工厂测试程序，运行在root用户(Run as a manufacturer test application, running as the root user. )</p>
<p>android.permission.FLASHLIGHT<br />
访问闪光灯,android开发网提示HTC Dream不包含闪光灯(Allows access to the flashlight )</p>
<p>android.permission.FORCE_BACK<br />
允许程序强行一个后退操作是否在顶层activities(Allows an application to force a BACK operation on whatever is the top activity. )</p>
<p>android.permission.FOTA_UPDATE<br />
暂时不了解这是做什么使用的，android开发网分析可能是一个预留权限.</p>
<p>android.permission.GET_ACCOUNTS<br />
访问一个帐户列表在Accounts Service中(Allows access to the list of accounts in the Accounts Service)</p>
<p>android.permission.GET_PACKAGE_SIZE<br />
允许一个程序获取任何package占用空间容量(Allows an application to find out the space used by any package. )</p>
<p>android.permission.GET_TASKS<br />
允许一个程序获取信息有关当前或最近运行的任务，一个缩略的任务状态，是否活动等等(Allows an application to get information about the currently or recently running tasks: a thumbnail representation of the tasks, what activities are running in it, etc.)</p>
<p>android.permission.HARDWARE_TEST<br />
允许访问硬件(Allows access to hardware peripherals. )</p>
<p>android.permission.INJECT_EVENTS<br />
允许一个程序截获用户事件如按键、触摸、轨迹球等等到一个时间流，android 开发网提醒算是hook技术吧(Allows an application to inject user events (keys, touch, trackball) into the event stream and deliver them to ANY window.)</p>
<p>android.permission.INSTALL_PACKAGES<br />
允许一个程序安装packages(Allows an application to install packages. )</p>
<p>android.permission.INTERNAL_SYSTEM_WINDOW<br />
允许打开窗口使用系统用户界面(Allows an application to open windows that are for use by parts of the system user interface. )</p>
<p>android.permission.INTERNET<br />
允许程序打开网络套接字(Allows applications to open network sockets)</p>
<p>android.permission.MANAGE_APP_TOKENS<br />
允许程序管理(创建、催后、 z- order默认向z轴推移)程序引用在窗口管理器中(Allows an application to manage (create, destroy, Z-order) application tokens in the window manager. )</p>
<p>android.permission.MASTER_CLEAR</p>
<p>目前还没有明确的解释，android开发网分析可能是清除一切数据，类似硬格机</p>
<p>android.permission.MODIFY_AUDIO_SETTINGS<br />
允许程序修改全局音频设置(Allows an application to modify global audio settings)</p>
<p>android.permission.MODIFY_PHONE_STATE<br />
允许修改话机状态，如电源，人机接口等(Allows modification of the telephony state – power on, mmi, etc. )</p>
<p>android.permission.MOUNT_UNMOUNT_FILESYSTEMS<br />
允许挂载和反挂载文件系统可移动存储(Allows mounting and unmounting file systems for removable storage. )</p>
<p>android.permission.PERSISTENT_ACTIVITY<br />
允许一个程序设置他的activities显示(Allow an application to make its activities persistent. )</p>
<p>android.permission.PROCESS_OUTGOING_CALLS<br />
允许程序监视、修改有关播出电话(Allows an application to monitor, modify, or abort outgoing calls)</p>
<p>android.permission.READ_CALENDAR<br />
允许程序读取用户日历数据(Allows an application to read the user’s calendar data.)</p>
<p>android.permission.READ_CONTACTS<br />
允许程序读取用户联系人数据(Allows an application to read the user’s contacts data.)</p>
<p>android.permission.READ_FRAME_BUFFER<br />
允许程序屏幕波或和更多常规的访问帧缓冲数据(Allows an application to take screen shots and more generally get access to the frame buffer data)</p>
<p>android.permission.READ_INPUT_STATE<br />
允许程序返回当前按键状态(Allows an application to retrieve the current state of keys and switches. )</p>
<p>android.permission.READ_LOGS<br />
允许程序读取底层系统日志文件(Allows an application to read the low-level system log files. )</p>
<p>android.permission.READ_OWNER_DATA<br />
允许程序读取所有者数据(Allows an application to read the owner’s data)</p>
<p>android.permission.READ_SMS<br />
允许程序读取短信息(Allows an application to read SMS messages.)</p>
<p>android.permission.READ_SYNC_SETTINGS<br />
允许程序读取同步设置(Allows applications to read the sync settings)</p>
<p>android.permission.READ_SYNC_STATS<br />
允许程序读取同步状态(Allows applications to read the sync stats)</p>
<p>android.permission.REBOOT<br />
请求能够重新启动设备(Required to be able to reboot the device. )</p>
<p>android.permission.RECEIVE_BOOT_COMPLETED<br />
允许一个程序接收到 ACTION_BOOT_COMPLETED广播在系统完成启动(Allows an application to receive the ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. )</p>
<p>android.permission.RECEIVE_MMS<br />
允许一个程序监控将收到MMS彩信,记录或处理(Allows an application to monitor incoming MMS messages, to record or perform processing on them. )</p>
<p>android.permission.RECEIVE_SMS<br />
允许程序监控一个将收到短信息，记录或处理(Allows an application to monitor incoming SMS messages, to record or perform processing on them.)</p>
<p>android.permission.RECEIVE_WAP_PUSH<br />
允许程序监控将收到WAP PUSH信息(Allows an application to monitor incoming WAP push messages. )</p>
<p>android.permission.RECORD_AUDIO<br />
允许程序录制音频(Allows an application to record audio)</p>
<p>android.permission.REORDER_TASKS<br />
允许程序改变Z轴排列任务(Allows an application to change the Z-order of tasks)</p>
<p>android.permission.RESTART_PACKAGES<br />
允许程序重新启动其他程序(Allows an application to restart other applications)</p>
<p>android.permission.SEND_SMS<br />
允许程序发送SMS短信(Allows an application to send SMS messages)</p>
<p>android.permission.SET_ACTIVITY_WATCHER<br />
允许程序监控或控制activities已经启动全局系统中(Allows an application to watch and control how activities are started globally in the system.)</p>
<p>android.permission.SET_ALWAYS_FINISH<br />
允许程序控制是否活动间接完成在处于后台时(Allows an application to control whether activities are immediately finished when put in the background.)</p>
<p>android.permission.SET_ANIMATION_SCALE<br />
修改全局信息比例(Modify the global animation scaling factor.)</p>
<p>android.permission.SET_DEBUG_APP<br />
配置一个程序用于调试(Configure an application for debugging.)</p>
<p>android.permission.SET_ORIENTATION<br />
允许底层访问设置屏幕方向和实际旋转(Allows low-level access to setting the orientation (actually rotation) of the screen.)</p>
<p>android.permission.SET_PREFERRED_APPLICATIONS<br />
允许一个程序修改列表参数PackageManager.addPackageToPreferred()和PackageManager.removePackageFromPreferred()方法(Allows an application to modify the list of preferred applications with the PackageManager.addPackageToPreferred() and PackageManager.removePackageFromPreferred() methods.)</p>
<p>android.permission.SET_PROCESS_FOREGROUND<br />
允许程序当前运行程序强行到前台(Allows an application to force any currently running process to be in the foreground.)</p>
<p>android.permission.SET_PROCESS_LIMIT<br />
允许设置最大的运行进程数量(Allows an application to set the maximum number of (not needed) application processes that can be running. )</p>
<p>android.permission.SET_TIME_ZONE<br />
允许程序设置时间区域(Allows applications to set the system time zone)</p>
<p>android.permission.SET_WALLPAPER<br />
允许程序设置壁纸(Allows applications to set the wallpaper )</p>
<p>android.permission.SET_WALLPAPER_HINTS<br />
允许程序设置壁纸hits(Allows applications to set the wallpaper hints)</p>
<p>android.permission.SIGNAL_PERSISTENT_PROCESSES<br />
允许程序请求发送信号到所有显示的进程中(Allow an application to request that a signal be sent to all persistent processes)</p>
<p>android.permission.STATUS_BAR<br />
允许程序打开、关闭或禁用状态栏及图标Allows an application to open, close, or disable the status bar and its icons.</p>
<p>android.permission.SUBSCRIBED_FEEDS_READ<br />
允许一个程序访问订阅RSS Feed内容提供(Allows an application to allow access the subscribed feeds ContentProvider. )</p>
<p>android.permission.SUBSCRIBED_FEEDS_WRITE<br />
系统暂时保留改设置,android开发网认为未来版本会加入该功能。</p>
<p>android.permission.SYSTEM_ALERT_WINDOW<br />
允许一个程序打开窗口使用 TYPE_SYSTEM_ALERT，显示在其他所有程序的顶层(Allows an application to open windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. )</p>
<p>android.permission.VIBRATE<br />
允许访问振动设备(Allows access to the vibrator)</p>
<p>android.permission.WAKE_LOCK<br />
允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失( Allows using PowerManager WakeLocks to keep</p>
<p>processor from sleeping or screen from dimming)</p>
<p>android.permission.WRITE_APN_SETTINGS<br />
允许程序写入API设置(Allows applications to write the apn settings)</p>
<p>android.permission.WRITE_CALENDAR<br />
允许一个程序写入但不读取用户日历数据(Allows an application to write (but not read) the user’s calendar data. )</p>
<p>android.permission.WRITE_CONTACTS<br />
允许程序写入但不读取用户联系人数据(Allows an application to write (but not read) the user’s contacts data. )</p>
<p>android.permission.WRITE_GSERVICES<br />
允许程序修改Google服务地图(Allows an application to modify the Google service map. )</p>
<p>android.permission.WRITE_OWNER_DATA<br />
允许一个程序写入但不读取所有者数据(Allows an application to write (but not read) the owner’s data.)</p>
<p>android.permission.WRITE_SETTINGS<br />
允许程序读取或写入系统设置(Allows an application to read or write the system settings. )</p>
<p>android.permission.WRITE_SMS<br />
允许程序写短信(Allows an application to write SMS messages)</p>
<p>android.permission.WRITE_SYNC_SETTINGS<br />
允许程序写入同步设置(Allows applications to write the sync settings)</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/weiqingli190949353/archive/2011/03/24/6274098.aspx</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/852/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>关于android SurfaceView的问题</title>
		<link>http://www.javagg.com/archives/850</link>
		<comments>http://www.javagg.com/archives/850#comments</comments>
		<pubDate>Thu, 19 May 2011 08:21:51 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[SurfaceView]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=850</guid>
		<description><![CDATA[用SurfaceView写游戏的时候，遇见一个奇怪的问题。
程序运行->按HOME键
Activity调用的顺序是onPause->onStop
SurfaceView调用了surfaceDestroyed方法
然后再切回程序
Activity调用的顺序是onRestart->onStart->onResume
SurfaceView调用了surfaceChanged->surfaceCreated方法
切回后程序运行良好。
可按挂断键或锁定屏幕
Activity只调用onPause方法
解锁后Activity调用onResume方法
SurfaceView什么方法都不调用
但是不能更新屏幕。该问题只存在于真机上（在G2上测试），模拟器运行良好。
怀疑是不是SurfaceHolder不能获得Canvas，经过联机DEBUG，程序运行正常，还是不能更新屏幕，不知道是不是SurfaceView的bug。感觉SurfaceView不可见后，必须重新surfaceCreated才能正常工作。
解决办法
在onResume中调用setContentView( view )，SurfaceView会调用surfaceChanged->surfaceCreated方法。
]]></description>
			<content:encoded><![CDATA[<p>用SurfaceView写游戏的时候，遇见一个奇怪的问题。<br />
程序运行->按HOME键<br />
Activity调用的顺序是onPause->onStop<br />
SurfaceView调用了surfaceDestroyed方法<br />
然后再切回程序<br />
Activity调用的顺序是onRestart->onStart->onResume<br />
SurfaceView调用了surfaceChanged->surfaceCreated方法<br />
切回后程序运行良好。<span id="more-850"></span></p>
<p>可按挂断键或锁定屏幕<br />
Activity只调用onPause方法<br />
解锁后Activity调用onResume方法<br />
SurfaceView什么方法都不调用</p>
<p>但是不能更新屏幕。该问题只存在于真机上（在G2上测试），模拟器运行良好。<br />
怀疑是不是SurfaceHolder不能获得Canvas，经过联机DEBUG，程序运行正常，还是不能更新屏幕，不知道是不是SurfaceView的bug。感觉SurfaceView不可见后，必须重新surfaceCreated才能正常工作。</p>
<p>解决办法<br />
在onResume中调用setContentView( view )，SurfaceView会调用surfaceChanged->surfaceCreated方法。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/850/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android布局</title>
		<link>http://www.javagg.com/archives/848</link>
		<comments>http://www.javagg.com/archives/848#comments</comments>
		<pubDate>Mon, 16 May 2011 01:35:35 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[layout]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=848</guid>
		<description><![CDATA[Android布局是应用界面开发的重要一环，在Android中，共有五种布局方式，分别是：FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局).
一、FrameLayout
这个布局可以看成是墙脚堆东西，有一个四方的矩形的左上角墙脚，我们放了第一个东西，要再放一个，那就在放在原来放的位置的上面，这样依次的放，会盖住原来的东西。这个布局比较简单，也只能放一点比较简单的东西。
二、LinearLayout
线性布局，这个东西，从外框上可以理解为一个div，他首先是一个一个从上往下罗列在屏幕上。每一个LinearLayout里面又可分为垂直布局（android rientation=&#8221;vertical&#8221;）和水平布局（androidrientation=&#8221;horizontal&#8221; ）。当垂直布局时，每一行就只有一个元素，多个元素依次垂直往下；水平布局时，只有一行，每一个元素依次向右排列。
linearLayout中有一个重要的属性 android:layout_weight=&#8221;1&#8243;，这个weight在垂直布局时，代表行距；水平的时候代表列宽；weight值越大就越大。
三、AbsoluteLayout
绝对布局犹如div指定了absolute属性，用X,Y坐标来指定元素的位置android:layout_x=&#8221;20px&#8221; android:layout_y=&#8221;12px&#8221; 这种布局方式也比较简单，但是在垂直随便切换时，往往会出问题，而且多个元素的时候，计算比较麻烦。
四、RelativeLayout
相对布局可以理解为某一个元素为参照物，来定位的布局方式。主要属性有：
相对于某一个元素
android:layout_below=&#8221;@id/aaa&#8221; 该元素在 id为aaa的下面
android:layout_toLeftOf=&#8221;@id/bbb&#8221; 改元素的左边是bbb
相对于父元素的地方
android:layout_alignParentLeft=&#8221;true&#8221;  在父元素左对齐
android:layout_alignParentRight=&#8221;true&#8221; 在父元素右对齐
还可以指定边距等，具体详见API
五.TableLayout
表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow，TableRow里面可以具体定义每一个元素，设定他的对齐方式 androidravity=&#8221;" 。
每一个布局都有自己适合的方式，另外，这五个布局元素可以相互嵌套应用，做出美观的界面。 
]]></description>
			<content:encoded><![CDATA[<p>Android布局是应用界面开发的重要一环，在Android中，共有五种布局方式，分别是：FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局).<br />
一、FrameLayout<br />
这个布局可以看成是墙脚堆东西，有一个四方的矩形的左上角墙脚，我们放了第一个东西，要再放一个，那就在放在原来放的位置的上面，这样依次的放，会盖住原来的东西。这个布局比较简单，也只能放一点比较简单的东西。<br />
二、LinearLayout<br />
线性布局，这个东西，从外框上可以理解为一个div，他首先是一个一个从上往下罗列在屏幕上。每一个LinearLayout里面又可分为垂直布局（android rientation=&#8221;vertical&#8221;）和水平布局（androidrientation=&#8221;horizontal&#8221; ）。当垂直布局时，每一行就只有一个元素，多个元素依次垂直往下；水平布局时，只有一行，每一个元素依次向右排列。<br />
linearLayout中有一个重要的属性 android:layout_weight=&#8221;1&#8243;，这个weight在垂直布局时，代表行距；水平的时候代表列宽；weight值越大就越大。<br />
三、AbsoluteLayout<br />
绝对布局犹如div指定了absolute属性，用X,Y坐标来指定元素的位置android:layout_x=&#8221;20px&#8221; android:layout_y=&#8221;12px&#8221; 这种布局方式也比较简单，但是在垂直随便切换时，往往会出问题，而且多个元素的时候，计算比较麻烦。<br />
四、RelativeLayout<br />
相对布局可以理解为某一个元素为参照物，来定位的布局方式。主要属性有：<br />
相对于某一个元素<br />
android:layout_below=&#8221;@id/aaa&#8221; 该元素在 id为aaa的下面<br />
android:layout_toLeftOf=&#8221;@id/bbb&#8221; 改元素的左边是bbb<br />
相对于父元素的地方<br />
android:layout_alignParentLeft=&#8221;true&#8221;  在父元素左对齐<br />
android:layout_alignParentRight=&#8221;true&#8221; 在父元素右对齐<br />
还可以指定边距等，具体详见API<br />
五.TableLayout<br />
表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow，TableRow里面可以具体定义每一个元素，设定他的对齐方式 androidravity=&#8221;" 。<br />
每一个布局都有自己适合的方式，另外，这五个布局元素可以相互嵌套应用，做出美观的界面。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/848/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

