<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>郑州网建 - 手机开发</title><link>http://camnpr.com/</link><description>Good Good Study ,Day Day Up! - </description><generator>RainbowSoft Studio Z-Blog 1.8 Walle Build 100427</generator><language>zh-CN</language><copyright>豫ICP备10013645号 Copyright 2009-2022 camnpr.com</copyright><pubDate>Sun, 03 May 2026 07:48:43 +0800</pubDate><item><title>Weex 长列表的复用方案 &amp;lt;recycle-list&amp;gt;</title><author>camnpr@163.com (camnpr)</author><link>http://camnpr.com/mobile-dev/2292.html</link><pubDate>Tue, 27 Mar 2018 15:55:45 +0800</pubDate><guid>http://camnpr.com/mobile-dev/2292.html</guid><description><![CDATA[<p>&nbsp;<span data-slate-fragment="JTdCJTIyZGF0YSUyMiUzQSU3QiU3RCUyQyUyMmtpbmQlMjIlM0ElMjJkb2N1bWVudCUyMiUyQyUyMm5vZGVzJTIyJTNBJTVCJTdCJTIyZGF0YSUyMiUzQSU3QiU3RCUyQyUyMmtpbmQlMjIlM0ElMjJibG9jayUyMiUyQyUyMmlzVm9pZCUyMiUzQWZhbHNlJTJDJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMm5vZGVzJTIyJTNBJTVCJTdCJTIya2luZCUyMiUzQSUyMnRleHQlMjIlMkMlMjJyYW5nZXMlMjIlM0ElNUIlN0IlMjJraW5kJTIyJTNBJTIycmFuZ2UlMjIlMkMlMjJ0ZXh0JTIyJTNBJTIyV2VleCUyMCVFOCVBMSVBOCVFOSU5RCVBMiVFNCVCOCU4QSVFNiU5OCVBRiVFNCVCOCU4MCVFNCVCOCVBQSVFNSVBRSVBMiVFNiU4OCVCNyVFNyVBQiVBRiVFNiU4QSU4MCVFNiU5QyVBRiVFRiVCQyU4QyVFNCVCRCU4NiVFNSVBRSU5RSVFOSU5OSU4NSVFNCVCOCU4QSVFNSVBRSU4MyVFNCVCOCVCMiVFOCU4MSU5NCVFOCVCNSVCNyVFNCVCQSU4NiVFNCVCQiU4RSVFNiU5QyVBQyVFNSU5QyVCMCVFNSVCQyU4MCVFNSU4RiU5MSVFNyU4RSVBRiVFNSVBMiU4MyVFNSU4OCVCMCVFNCVCQSU5MSVFNyVBQiVBRiVFOSU4MyVBOCVFNyVCRCVCMiVFNSU5MiU4QyVFNSU4OCU4NiVFNSU4RiU5MSVFNyU5QSU4NCVFNiU5NSVCNCVFNCVCOCVBQSVFOSU5MyVCRSVFOCVCNyVBRiVFMyU4MCU4MiUyMiUyQyUyMm1hcmtzJTIyJTNBJTVCJTVEJTdEJTVEJTdEJTVEJTdEJTJDJTdCJTIyZGF0YSUyMiUzQSU3QiU3RCUyQyUyMmtpbmQlMjIlM0ElMjJibG9jayUyMiUyQyUyMmlzVm9pZCUyMiUzQWZhbHNlJTJDJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMm5vZGVzJTIyJTNBJTVCJTdCJTIya2luZCUyMiUzQSUyMnRleHQlMjIlMkMlMjJyYW5nZXMlMjIlM0ElNUIlN0IlMjJraW5kJTIyJTNBJTIycmFuZ2UlMjIlMkMlMjJ0ZXh0JTIyJTNBJTIyJUU1JUJDJTgwJUU1JThGJTkxJUU4JTgwJTg1JUU5JUE2JTk2JUU1JTg1JTg4JUU1JThGJUFGJUU0JUJCJUE1JUU1JTlDJUE4JUU2JTlDJUFDJUU1JTlDJUIwJUU1JTgzJThGJUU2JTkyJUIwJUU1JTg2JTk5JTIwd2ViJTIwJUU5JUExJUI1JUU5JTlEJUEyJUU0JUI4JTgwJUU2JUEwJUI3JUU2JTkyJUIwJUU1JTg2JTk5JUU0JUI4JTgwJUU0JUI4JUFBJTIwYXBwJTIwJUU3JTlBJTg0JUU5JUExJUI1JUU5JTlEJUEyJUVGJUJDJThDJUU3JTg0JUI2JUU1JTkwJThFJUU3JUJDJTk2JUU4JUFGJTkxJUU2JTg4JTkwJUU0JUI4JTgwJUU2JUFFJUI1JTIwSmF2YVNjcmlwdCUyMCVFNCVCQiVBMyVFNyVBMCU4MSVFRiVCQyU4QyVFNSVCRCVBMiVFNiU4OCU5MCUyMFdlZXglMjAlRTclOUElODQlRTQlQjglODAlRTQlQjglQUElMjBKUyUyMGJ1bmRsZSVFRiVCQyU5QiUyMiUyQyUyMm1hcmtzJTIyJTNBJTVCJTVEJTdEJTVEJTdEJTVEJTdEJTJDJTdCJTIyZGF0YSUyMiUzQSU3QiU3RCUyQyUyMmtpbmQlMjIlM0ElMjJibG9jayUyMiUyQyUyMmlzVm9pZCUyMiUzQWZhbHNlJTJDJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMm5vZGVzJTIyJTNBJTVCJTdCJTIya2luZCUyMiUzQSUyMnRleHQlMjIlMkMlMjJyYW5nZXMlMjIlM0ElNUIlN0IlMjJraW5kJTIyJTNBJTIycmFuZ2UlMjIlMkMlMjJ0ZXh0JTIyJTNBJTIyJUU1JTlDJUE4JUU0JUJBJTkxJUU3JUFCJUFGJUVGJUJDJThDJUU1JUJDJTgwJUU1JThGJTkxJUU4JTgwJTg1JUU1JThGJUFGJUU0JUJCJUE1JUU2JThBJThBJUU3JTk0JTlGJUU2JTg4JTkwJUU3JTlBJTg0JTIwSlMlMjBidW5kbGUlMjAlRTklODMlQTglRTclQkQlQjIlRTQlQjglOEElRTUlOEUlQkIlRUYlQkMlOEMlRTclODQlQjYlRTUlOTAlOEUlRTklODAlOUElRTglQkYlODclRTclQkQlOTElRTclQkIlOUMlRTglQUYlQjclRTYlQjElODIlRTYlODglOTYlRTklQTIlODQlRTQlQjglOEIlRTUlOEYlOTElRTclOUElODQlRTYlOTYlQjklRTUlQkMlOEYlRTQlQkMlQTAlRTklODAlOTIlRTUlODglQjAlRTclOTQlQTglRTYlODglQjclRTclOUElODQlRTclQTclQkIlRTUlOEElQTglRTUlQkElOTQlRTclOTQlQTglRTUlQUUlQTIlRTYlODglQjclRTclQUIlQUYlRUYlQkMlOUIlMjIlMkMlMjJtYXJrcyUyMiUzQSU1QiU1RCU3RCU1RCU3RCU1RCU3RCUyQyU3QiUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJraW5kJTIyJTNBJTIyYmxvY2slMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMmtpbmQlMjIlM0ElMjJ0ZXh0JTIyJTJDJTIycmFuZ2VzJTIyJTNBJTVCJTdCJTIya2luZCUyMiUzQSUyMnJhbmdlJTIyJTJDJTIydGV4dCUyMiUzQSUyMiVFNSU5QyVBOCVFNyVBNyVCQiVFNSU4QSVBOCVFNSVCQSU5NCVFNyU5NCVBOCVFNSVBRSVBMiVFNiU4OCVCNyVFNyVBQiVBRiVFOSU4NyU4QyVFRiVCQyU4Q1dlZXhTREslMjAlRTQlQkMlOUElRTUlODclODYlRTUlQTQlODclRTUlQTUlQkQlRTQlQjglODAlRTQlQjglQUElMjBKYXZhU2NyaXB0JTIwJUU1JUJDJTk1JUU2JTkzJThFJUVGJUJDJThDJUU1JUI5JUI2JUU0JUI4JTk0JUU1JTlDJUE4JUU3JTk0JUE4JUU2JTg4JUI3JUU2JTg5JTkzJUU1JUJDJTgwJUU0JUI4JTgwJUU0JUI4JUFBJTIwV2VleCUyMCVFOSVBMSVCNSVFOSU5RCVBMiVFNiU5NyVCNiVFNiU4OSVBNyVFOCVBMSU4QyVFNyU5QiVCOCVFNSVCQSU5NCVFNyU5QSU4NCUyMEpTJTIwYnVuZGxlJUVGJUJDJThDJUU1JUI5JUI2JUU1JTlDJUE4JUU2JTg5JUE3JUU4JUExJThDJUU4JUJGJTg3JUU3JUE4JThCJUU0JUI4JUFEJUU0JUJBJUE3JUU3JTk0JTlGJUU1JTkwJTg0JUU3JUE3JThEJUU1JTkxJUJEJUU0JUJCJUE0JUU1JThGJTkxJUU5JTgwJTgxJUU1JTg4JUIwJTIwbmF0aXZlJTIwJUU3JUFCJUFGJUU4JUJGJTlCJUU4JUExJThDJUU3JTlBJTg0JUU3JTk1JThDJUU5JTlEJUEyJUU2JUI4JUIyJUU2JTlGJTkzJUU2JTg4JTk2JUU2JTk1JUIwJUU2JThEJUFFJUU1JUFEJTk4JUU1JTgyJUE4JUUzJTgwJTgxJUU3JUJEJTkxJUU3JUJCJTlDJUU5JTgwJTlBJUU0JUJGJUExJUUzJTgwJTgxJUU4JUIwJTgzJUU3JTk0JUE4JUU4JUFFJUJFJUU1JUE0JTg3JUU1JThBJTlGJUU4JTgzJUJEJUUzJTgwJTgxJUU3JTk0JUE4JUU2JTg4JUI3JUU0JUJBJUE0JUU0JUJBJTkyJUU1JTkzJThEJUU1JUJBJTk0JUU3JUFEJTg5JUU3JUE3JUJCJUU1JThBJUE4JUU1JUJBJTk0JUU3JTk0JUE4JUU3JTlBJTg0JUU1JTlDJUJBJUU2JTk5JUFGJUU1JUFFJTlFJUU4JUI3JUI1JUVGJUJDJTlCJTIyJTJDJTIybWFya3MlMjIlM0ElNUIlNUQlN0QlNUQlN0QlNUQlN0QlMkMlN0IlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIya2luZCUyMiUzQSUyMmJsb2NrJTIyJTJDJTIyaXNWb2lkJTIyJTNBZmFsc2UlMkMlMjJ0eXBlJTIyJTNBJTIycGFyYWdyYXBoJTIyJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJraW5kJTIyJTNBJTIydGV4dCUyMiUyQyUyMnJhbmdlcyUyMiUzQSU1QiU3QiUyMmtpbmQlMjIlM0ElMjJyYW5nZSUyMiUyQyUyMnRleHQlMjIlM0ElMjIlRTUlOTAlOEMlRTYlOTclQjYlRUYlQkMlOEMlRTUlQTYlODIlRTYlOUUlOUMlRTclOTQlQTglRTYlODglQjclRTYlQjIlQTElRTYlOUMlODklRTUlQUUlODklRTglQTMlODUlRTclQTclQkIlRTUlOEElQTglRTUlQkElOTQlRTclOTQlQTglRUYlQkMlOEMlRTQlQkIlOTYlRTQlQkIlOEQlRTclODQlQjYlRTUlOEYlQUYlRTQlQkIlQTUlRTUlOUMlQTglRTYlQjUlOEYlRTglQTclODglRTUlOTklQTglRTklODclOEMlRTYlODklOTMlRTUlQkMlODAlRTQlQjglODAlRTQlQjglQUElRTclOUIlQjglRTUlOTAlOEMlRTclOUElODQlMjB3ZWIlMjAlRTklQTElQjUlRTklOUQlQTIlRUYlQkMlOEMlRTglQkYlOTklRTQlQjglQUElRTklQTElQjUlRTklOUQlQTIlRTYlOTglQUYlRTQlQkQlQkYlRTclOTQlQTglRTclOUIlQjglRTUlOTAlOEMlRTclOUElODQlRTklQTElQjUlRTklOUQlQTIlRTYlQkElOTAlRTQlQkIlQTMlRTclQTAlODElRUYlQkMlOEMlRTklODAlOUElRTglQkYlODclRTYlQjUlOEYlRTglQTclODglRTUlOTklQTglRTklODclOEMlRTclOUElODQlMjBKYXZhU2NyaXB0JTIwJUU1JUJDJTk1JUU2JTkzJThFJUU4JUJGJTkwJUU4JUExJThDJUU4JUI1JUI3JUU2JTlEJUE1JUU3JTlBJTg0JUUzJTgwJTgyJTIyJTJDJTIybWFya3MlMjIlM0ElNUIlNUQlN0QlNUQlN0QlNUQlN0QlNUQlN0Q=" style="box-sizing: border-box; color: rgb(51, 51, 51); font-family: Roboto, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.3px;">Weex 表面上是一个客户端技术，但实际上它串联起了从本地开发环境到云端部署和分发的整个链路。</span></p><p data-key="5027" style="box-sizing: border-box; margin: 0px 0px 10px; color: rgb(51, 51, 51); font-family: Roboto, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.3px;"><span data-key="5026" style="box-sizing: border-box;">开发者首先可以在本地像撰写 web 页面一样撰写一个 app 的页面，然后编译成一段 JavaScript 代码，形成 Weex 的一个 JS bundle；</span></p><p data-key="5029" style="box-sizing: border-box; margin: 0px 0px 10px; color: rgb(51, 51, 51); font-family: Roboto, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.3px;"><span data-key="5028" style="box-sizing: border-box;">在云端，开发者可以把生成的 JS bundle 部署上去，然后通过网络请求或预下发的方式传递到用户的移动应用客户端；</span></p><p data-key="5031" style="box-sizing: border-box; margin: 0px 0px 10px; color: rgb(51, 51, 51); font-family: Roboto, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.3px;"><span data-key="5030" style="box-sizing: border-box;">在移动应用客户端里，WeexSDK 会准备好一个 JavaScript 引擎，并且在用户打开一个 Weex 页面时执行相应的 JS bundle，并在执行过程中产生各种命令发送到 native 端进行的界面渲染或数据存储、网络通信、调用设备功能、用户交互响应等移动应用的场景实践；</span></p><p data-key="5033" style="box-sizing: border-box; margin: 0px 0px 10px; color: rgb(51, 51, 51); font-family: Roboto, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 0.3px;"><span data-key="5032" style="box-sizing: border-box;">同时，如果用户没有安装移动应用，他仍然可以在浏览器里打开一个相同的 web 页面，这个页面是使用相同的页面源代码，通过浏览器里的 JavaScript 引擎运行起来的。</span></p><h2 style="box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;;">需求背景</h2><ul style="box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">    <li style="box-sizing: border-box;">长列表（无限列表）在移动端很常见，会消耗大量渲染时间和内存，通常是性能瓶颈。</li>    <li style="box-sizing: border-box; margin-top: 0.25em;">虽然列表中的内容很长，但是结构都比较相似，只是内容有差异，很适合复用。</li>    <li style="box-sizing: border-box; margin-top: 0.25em;">长列表中有大量节点不在可视区，回收并复用这些节点可以减少内存占用和创建新节点时的开销。</li></ul><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">在列表变得特别长的时候，尤其是列表包含了大量图文视频的时候，即使做了懒加载优化了渲染效率，超长列表内存的占用量也很难优化。</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">如果能复用列表中相似的模板结构，由数据来驱动原生组件的渲染，节点离屏之后将模板回收，将会大幅优化长列表的渲染性能和内存使用量。</p><h2 style="box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;;"><a id="user-content-整体设计方案" class="anchor" aria-hidden="true" href="http://camnpr.com/upload/2018/3/201803271557501805.png" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: none;"><img src="https://github.com/Hanks10100/weex-native-directive/raw/master/images/render-process.png" alt="Render Process" style="box-sizing: content-box; border-style: none; max-width: 100%;" /></a></p><blockquote style="box-sizing: border-box; margin: 0px 0px 16px; padding: 0px 1em; color: rgb(106, 115, 125); border-left: 0.25em solid rgb(223, 226, 229); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;"><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;">图中的 JSFM 为 JS Framework 的简写。</p></blockquote><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">下面以 Vue.js 为例，详细介绍一下常规组件的渲染过程。</p><h3 style="box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; font-size: 1.25em; line-height: 1.25; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;;"><a id="user-content-创建前端组件" class="anchor" aria-hidden="true" href="http://camnpr.com/upload/2018/3/201803271558046003.png" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: none;"><img src="https://github.com/Hanks10100/weex-native-directive/raw/master/images/new-render-process.png" alt="New Render Process" style="box-sizing: content-box; border-style: none; max-width: 100%;" /></a></p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">如上图所示，前端框架中的&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">Template</code>&nbsp;不再需要数据，而是直接展开成一种纯静态的模板结构，结构中包含了模板渲染逻辑，格式仍然是&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">VNode</code>。然后经过 JS Framework 转换成 Weex 支持的&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">Element</code>，其中也包含了模板的原生渲染指令。客户端解析出可复用的模板结构，由数据驱动模板渲染，这个模板结构和前端组件中的定义是一致的。</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">这个过程除了要把模板发给客户端，还得带上模板的渲染逻辑，告诉客户端如何根据数据来渲染模板。为了描述这些渲染逻辑，就得设计一套面向原生渲染引擎的模板渲染指令。</p><h3 style="box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; font-size: 1.25em; line-height: 1.25; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;;"><a id="user-content-自定义原生模板指令" class="anchor" aria-hidden="true" href="http://camnpr.com/upload/2018/3/201803271558053274.png" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: none;"><img src="https://github.com/Hanks10100/weex-native-directive/raw/master/images/native-watcher.png" alt="native" style="box-sizing: content-box; border-style: none; max-width: 100%;" /></a></p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">当列表向下滚动时，回收掉上方不在屏幕内的模板，并不销毁而是将其中的数据清空。当列表下方需要渲染新的数据时，会取出回收的空模板，注入数据渲染出真实节点，然后追加到列表下方。列表向上滚动时的原理是一样的，为了保障列表滚动的流畅，也会渲染屏幕上下方扩展区域内的节点。</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">无论真实的数据有多少条，真实渲染的只有可滚动区域内的节点，这样不仅可以加快首屏的渲染速度，内存的占用量也不会随着列表长度大幅增长。</p><h3 style="box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; font-size: 1.25em; line-height: 1.25; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;;"><a id="user-content-使用-virtual-component-管理组件状态" class="anchor" aria-hidden="true" href="https://github.com/Hanks10100/weex-native-directive/blob/master/Design.md#%E4%BD%BF%E7%94%A8-virtual-component-%E7%AE%A1%E7%90%86%E7%BB%84%E4%BB%B6%E7%8A%B6%E6%80%81" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: none; float: left; padding-right: 4px; margin-left: -20px; line-height: 1;"><svg class="octicon octicon-link" viewbox="" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>使用 Virtual Component 管理组件状态</h3><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">想让客户端只根据模板和数据就能渲染出来节点，看起来只有函数式组件才可以做到，也就是要求组件必须是不含内部状态的，然而实际应用中绝大多数组件都含有内部状态的，只做到这一步是远远不够的。</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">对于包含了状态的组件，渲染过程就比较复杂了，因为组件内部状态的处理逻辑（<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">data</code>,<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">watch</code>,&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">computed</code>）都在前端中，然而模板和数据都已经发给客户端处理了，所以需要经过多个回合的通信来解决状态同步问题。详细处理过程可以参考&nbsp;<a href="https://github.com/Hanks10100/weex-native-directive/blob/master/Implementation.md#%E6%B8%B2%E6%9F%93%E8%BF%87%E7%A8%8B" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: none;">Implementation.md#渲染过程</a></p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">为了实现可复用的原生组件，在前端框架中引入了这两个概念：</p><ul style="box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">    <li style="box-sizing: border-box;"><span style="box-sizing: border-box; font-weight: 600;">Virtual Component Template</span>: 虚拟组件模板。包含了带有原生模板指令的节点，监听节点上的事件，但是不包含任何状态，不会触发更新，也没有生命周期。整个过程中只会渲染一次，目的是将模板的结构发给客户端。</li>    <li style="box-sizing: border-box; margin-top: 0.25em;"><span style="box-sizing: border-box; font-weight: 600;">Virtual Component</span>: 虚拟组件。包含内部状态和生命周期，但是并不渲染，不执行 render 函数也没有&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">VNode</code>&nbsp;节点，也不监听事件，内部状态更新时不会触发渲染而是数据改动发给客户端。</li></ul><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;"><a target="_blank" href="https://github.com/Hanks10100/weex-native-directive/blob/master/images/virtual-component.png" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: none;"><img src="https://github.com/Hanks10100/weex-native-directive/raw/master/images/virtual-component.png" alt="virtual component" style="box-sizing: content-box; border-style: none; max-width: 100%;" /></a></p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">在渲染的过程中，如果发现某个组件用在了&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">&lt;recycle-list&gt;</code>&nbsp;里，就不再走之前的处理逻辑，而是创建一个 Virtual Component Template，并且不初始化任何状态（<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">data</code>,<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">watch</code>,&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">computed</code>）、不绑定生命周期，但是会初始化自定义事件的功能。渲染组件时不执行&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">render</code>&nbsp;函数，而是执行定制的&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">@render</code>&nbsp;函数生成带有原生渲染指令的模板结构，这个结构将一次性发给客户端，后续不会再修改。</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">在创建 Virtual Component Template 时，会监听客户端原生组件的&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">create</code>&nbsp;生命周期钩子，<a href="https://github.com/Hanks10100/weex-native-directive/blob/master/Implementation.md#%E6%B8%B2%E6%9F%93%E5%AD%90%E7%BB%84%E4%BB%B6" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: none;">当客户端派发了&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">create</code>&nbsp;的时候</a>，才会真正的开始创建只含状态不含节点的 Virtual Component。虚拟组件模板只有一份，但是从同一份模板创建出的 Virtual Component 会有多个，与客户端发送的&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">create</code>&nbsp;钩子的次数有关，与数据有关。另外，由于事件是绑定在节点上的，原生 UI 捕获到的事件只会派发给 Virtual Component Template，然后再找到相应的 Virtual Component 并以其为作用域执行事件处理函数。</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">Virtual Component 内部只管理数据，即使数据有变动也不会触发渲染，而是调用特殊接口向客户端<a href="https://github.com/Hanks10100/weex-native-directive/blob/master/Implementation.md#%E6%9B%B4%E6%96%B0%E7%BB%84%E4%BB%B6%E7%9A%84%E5%86%85%E9%83%A8%E7%8A%B6%E6%80%81" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: none;">更新组件的内部状态</a>，由客户端根据新数据更新组件的 UI。在创建 Virtual Component 时，会监听客户端原生组件的&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">attach</code>&nbsp;、<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">detach</code>&nbsp;、&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">update</code>&nbsp;、&nbsp;<code style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">syncState</code>&nbsp;生命周期，生命周期的派发有客户端来控制，<a href="https://github.com/Hanks10100/weex-native-directive/blob/master/README.md#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E7%9A%84%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: none;">语义和前端框架略有差异</a>，具体细节可以参考列表的<a href="https://github.com/Hanks10100/weex-native-directive/blob/master/Implementation.md#%E6%B8%B2%E6%9F%93%E8%BF%87%E7%A8%8B" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: none;">渲染过程</a>和<a href="https://github.com/Hanks10100/weex-native-directive/blob/master/Implementation.md#%E6%9B%B4%E6%96%B0%E5%88%97%E8%A1%A8%E6%95%B0%E6%8D%AE" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: none;">更新过程</a>。</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px;">生命周期对应表如下：</p><table style="box-sizing: border-box; border-spacing: 0px; border-collapse: collapse; margin-top: 0px; display: block; width: 888px; overflow: auto; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 16px; margin-bottom: 0px !important;">    <thead style="box-sizing: border-box;">        <tr style="box-sizing: border-box; border-top: 1px solid rgb(198, 203, 209);">            <th style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">&nbsp;</th>            <th style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">Native</th>            <th style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">Vue</th>            <th style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">Rax</th>        </tr>    </thead>    <tbody style="box-sizing: border-box;">        <tr style="box-sizing: border-box; border-top: 1px solid rgb(198, 203, 209);">            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">&nbsp;</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">create</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">beforeCreate</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">constructor</td>        </tr>        <tr style="box-sizing: border-box; background-color: rgb(246, 248, 250); border-top: 1px solid rgb(198, 203, 209);">            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">*</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">create</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">created</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">-</td>        </tr>        <tr style="box-sizing: border-box; border-top: 1px solid rgb(198, 203, 209);">            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">&nbsp;</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">attach</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">beforeMount</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">componentWillMount</td>        </tr>        <tr style="box-sizing: border-box; background-color: rgb(246, 248, 250); border-top: 1px solid rgb(198, 203, 209);">            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">*</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">attach</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">mounted</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">componentDidMount</td>        </tr>        <tr style="box-sizing: border-box; border-top: 1px solid rgb(198, 203, 209);">            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">&nbsp;</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">-</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">-</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">componentWillReceiveProps</td>        </tr>        <tr style="box-sizing: border-box; background-color: rgb(246, 248, 250); border-top: 1px solid rgb(198, 203, 209);">            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">&nbsp;</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">-</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">-</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">shouldComponentUpdate</td>        </tr>        <tr style="box-sizing: border-box; border-top: 1px solid rgb(198, 203, 209);">            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">&nbsp;</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">update</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">beforeUpdate</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">componentWillUpdate</td>        </tr>        <tr style="box-sizing: border-box; background-color: rgb(246, 248, 250); border-top: 1px solid rgb(198, 203, 209);">            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">*</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">update</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">updated</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">componentDidUpdate</td>        </tr>        <tr style="box-sizing: border-box; border-top: 1px solid rgb(198, 203, 209);">            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">*</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">detach</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">beforeDestroy</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">componentWillUnmount</td>        </tr>        <tr style="box-sizing: border-box; background-color: rgb(246, 248, 250); border-top: 1px solid rgb(198, 203, 209);">            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">&nbsp;</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">detach</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">destroyed</td>            <td style="box-sizing: border-box; padding: 6px 13px; border-style: solid; border-color: rgb(223, 226, 229);">-</td>        </tr>    </tbody></table>]]></description><category>手机开发</category><comments>http://camnpr.com/mobile-dev/2292.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2292</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2292&amp;key=daa64423</trackback:ping></item><item><title>Android - Hello World示例</title><author>camnpr@163.com (camnpr)</author><link>http://camnpr.com/mobile-dev/2291.html</link><pubDate>Wed, 21 Mar 2018 16:03:09 +0800</pubDate><guid>http://camnpr.com/mobile-dev/2291.html</guid><description><![CDATA[<p>&nbsp;<font style="font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px; text-align: justify; box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">让我们开始使用Android Framework进行实际编程。</font><font style="box-sizing: border-box; vertical-align: inherit;">在开始使用Android SDK编写第一个示例之前，您必须确保您已正确设置Android开发环境，如</font></font><a href="http://camnpr.com/upload/2018/3/201803211604158623.png&quot;) right center no-repeat; box-sizing: border-box; color: rgb(49, 49, 49); text-decoration-line: none; padding-right: 22px; padding-bottom: 2px; outline: none !important;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">Android环境设置</font></font></a><font style="font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px; text-align: justify; box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">教程中所述。</font><font style="box-sizing: border-box; vertical-align: inherit;">我还假设你对Android工作室有一点工作知识。</font></font></p><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">因此，让我们继续编写一个简单的Android应用程序，它将打印&ldquo;Hello World！&rdquo;。</font></p><h2 style="box-sizing: border-box; color: rgb(18, 18, 20); font-weight: normal; letter-spacing: -1px; margin: 0.2em 0.2em 0.2em 0px; font-size: 1.7em; line-height: 1.5em; padding: 0px; text-shadow: rgb(204, 204, 204) 1px 1px 2px; position: relative; left: 0px; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif;"><font style="box-sizing: border-box; vertical-align: inherit;">创建Android应用程序</font></h2><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">第一步是使用Android Studio创建一个简单的Android应用程序。</font><font style="box-sizing: border-box; vertical-align: inherit;">当您点击Android工作室图标时，它将显示如下所示的屏幕</font></font></p><p><img src="http://camnpr.com/upload/2018/3/201803211604280153.jpg" alt="Android向导你好" style="box-sizing: border-box; vertical-align: middle; max-width: 100%; border: 0px; display: block; margin-left: auto; margin-right: auto; padding-bottom: 4px; color: rgb(49, 49, 49); font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 14px;" /></p><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">您可以通过调用开始一个新的android studio项目来开始您的应用程序开发。</font><font style="box-sizing: border-box; vertical-align: inherit;">在新的安装框架中应询问应用程序名称，包装信息和项目位置。</font></font></p><p><img src="http://camnpr.com/upload/2018/3/201803211604287013.jpg" alt="Android项目你好" style="box-sizing: border-box; vertical-align: middle; max-width: 100%; border: 0px; display: block; margin-left: auto; margin-right: auto; padding-bottom: 4px; color: rgb(49, 49, 49); font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 14px;" /></p><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">输入应用程序名称后，它将被称为选择应用程序运行的窗体因子，在这里需要指定Minimum SDK，在我们的教程中，我声明为API23：Android 6.0（Mashmallow） -</font></p><p><img src="http://camnpr.com/upload/2018/3/201803211604300611.jpg" alt="Android项目你好" style="box-sizing: border-box; vertical-align: middle; max-width: 100%; border: 0px; display: block; margin-left: auto; margin-right: auto; padding-bottom: 4px; color: rgb(49, 49, 49); font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 14px;" /></p><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">下一级安装应包含选择移动设备的活动，它指定应用程序的默认布局。</font></p><p><img src="http://camnpr.com/upload/2018/3/201803211604311302.jpg" alt="Android项目你好" style="box-sizing: border-box; vertical-align: middle; max-width: 100%; border: 0px; display: block; margin-left: auto; margin-right: auto; padding-bottom: 4px; color: rgb(49, 49, 49); font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 14px;" /></p><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">在最后阶段，它将成为编写应用程序代码的开放式开发工具。</font></p><p><img src="http://camnpr.com/upload/2018/3/201803211604342338.jpg" alt="Android项目你好" style="box-sizing: border-box; vertical-align: middle; max-width: 100%; border: 0px; display: block; margin-left: auto; margin-right: auto; padding-bottom: 4px; color: rgb(49, 49, 49); font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 14px;" /></p><h2 style="box-sizing: border-box; color: rgb(18, 18, 20); font-weight: normal; letter-spacing: -1px; margin: 0.2em 0.2em 0.2em 0px; font-size: 1.7em; line-height: 1.5em; padding: 0px; text-shadow: rgb(204, 204, 204) 1px 1px 2px; position: relative; left: 0px; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif;"><font style="box-sizing: border-box; vertical-align: inherit;">Android应用程序剖析</font></h2><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">在运行应用程序之前，您应该了解Android项目中的几个目录和文件 -</font></p><p><img src="http://camnpr.com/upload/2018/3/201803211604356813.jpg" alt="Android目录结构" style="box-sizing: border-box; vertical-align: middle; max-width: 100%; border: 0px; display: block; margin-left: auto; margin-right: auto; padding-bottom: 4px; color: rgb(49, 49, 49); font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 14px;" /></p><table class="table table-bordered" style="box-sizing: border-box; background-color: transparent; border-collapse: collapse; border-spacing: 0px; width: 604px; max-width: 100%; margin-bottom: 20px; border-style: solid; border-color: rgb(221, 221, 221); color: rgb(49, 49, 49); font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 14px;">    <tbody style="box-sizing: border-box;">        <tr style="box-sizing: border-box;">            <th style="box-sizing: border-box; text-align: center; background: rgb(238, 238, 238); padding: 8px; line-height: 1.42857; vertical-align: top; border-style: solid; border-color: rgb(221, 221, 221);"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">Sr.No.</font></font></th>            <th style="box-sizing: border-box; text-align: center; background: rgb(238, 238, 238); padding: 8px; line-height: 1.42857; vertical-align: top; border-style: solid; border-color: rgb(221, 221, 221);"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">文件夹，文件和说明</font></font></th>        </tr>        <tr style="box-sizing: border-box;">            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: middle; border-style: solid; border-color: rgb(221, 221, 221); text-align: center;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">1</font></font></td>            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: top; border-style: solid; border-color: rgb(221, 221, 221);">            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><span style="box-sizing: border-box; font-weight: 640;">Java的</span></p>            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">这包含</font><font style="box-sizing: border-box; vertical-align: inherit;">您的项目</font><font style="box-sizing: border-box; vertical-align: inherit;">的</font></font><span style="box-sizing: border-box; font-weight: 640;">.java</span><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">源文件。</font><font style="box-sizing: border-box; vertical-align: inherit;">默认情况下，它包含一个</font></font><i style="box-sizing: border-box;">MainActivity.java</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">源文件</font><font style="box-sizing: border-box; vertical-align: inherit;">，其中包含一个</font><font style="box-sizing: border-box; vertical-align: inherit;">活动类，该活动类在您的应用程序使用应用程序图标启动时运行。</font></font></p>            </td>        </tr>        <tr style="box-sizing: border-box;">        </tr>        <tr style="box-sizing: border-box;">            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: middle; border-style: solid; border-color: rgb(221, 221, 221); text-align: center;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">2</font></font></td>            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: top; border-style: solid; border-color: rgb(221, 221, 221);">            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><span style="box-sizing: border-box; font-weight: 640;">RES /抽拉-HDPI</span></p>            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">这是为高密度屏幕设计的可绘制对象的目录。</font></p>            </td>        </tr>        <tr style="box-sizing: border-box;">            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: middle; border-style: solid; border-color: rgb(221, 221, 221); text-align: center;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">3</font></font></td>            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: top; border-style: solid; border-color: rgb(221, 221, 221);">            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><span style="box-sizing: border-box; font-weight: 640;">RES /布局</span></p>            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">这是定义应用程序用户界面的文件的目录。</font></p>            </td>        </tr>        <tr style="box-sizing: border-box;">            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: middle; border-style: solid; border-color: rgb(221, 221, 221); text-align: center;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">4</font></font></td>            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: top; border-style: solid; border-color: rgb(221, 221, 221);">            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><span style="box-sizing: border-box; font-weight: 640;">RES /值</span></p>            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">这是包含资源集合（如字符串和颜色定义）的其他各种XML文件的目录。</font></p>            </td>        </tr>        <tr style="box-sizing: border-box;">            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: middle; border-style: solid; border-color: rgb(221, 221, 221); text-align: center;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">五</font></font></td>            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: top; border-style: solid; border-color: rgb(221, 221, 221);">            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><span style="box-sizing: border-box; font-weight: 640;">AndroidManifest.xml中</span></p>            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">这是清单文件，它描述了应用程序的基本特征并定义了它的每个组件。</font></p>            </td>        </tr>        <tr style="box-sizing: border-box;">            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: middle; border-style: solid; border-color: rgb(221, 221, 221); text-align: center;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">6</font></font></td>            <td style="box-sizing: border-box; padding: 8px; line-height: 1.42857; vertical-align: top; border-style: solid; border-color: rgb(221, 221, 221);">            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><span style="box-sizing: border-box; font-weight: 640;">的build.gradle</span></p>            <p style="box-sizing: border-box; color: rgb(0, 0, 0); line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">这是一个自动生成的文件，其中包含compileSdkVersion，buildToolsVersion，applicationId，minSdkVersion，targetSdkVersion，versionCode和versionName</font></p>            </td>        </tr>    </tbody></table><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">以下部分将简要介绍重要的应用程序文件。</font></p><h2 style="box-sizing: border-box; color: rgb(18, 18, 20); font-weight: normal; letter-spacing: -1px; margin: 0.2em 0.2em 0.2em 0px; font-size: 1.7em; line-height: 1.5em; padding: 0px; text-shadow: rgb(204, 204, 204) 1px 1px 2px; position: relative; left: 0px; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif;"><font style="box-sizing: border-box; vertical-align: inherit;">主要活动文件</font></h2><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">主要活动代码是一个Java文件</font><span style="box-sizing: border-box; font-weight: 640;">MainActivity.java</span><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">。</font><font style="box-sizing: border-box; vertical-align: inherit;">这是最终转换为Dalvik可执行文件并运行应用程序的实际应用程序文件。</font><font style="box-sizing: border-box; vertical-align: inherit;">以下是应用程序向导为</font></font><i style="box-sizing: border-box;">Hello World</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">生成的默认代码</font><i style="box-sizing: border-box;"><font style="box-sizing: border-box; vertical-align: inherit;">！</font></i><font style="box-sizing: border-box; vertical-align: inherit;">申请 -</font></font></p><pre class="prettyprint notranslate prettyprinted" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; padding: 5px; margin-top: 15px; margin-bottom: 10px; border-radius: 0px; width: 604px; line-height: 16px; border: 1px solid rgb(214, 214, 214); background-color: rgb(238, 238, 238); font-size: 13px; overflow: auto; color: rgb(49, 49, 49);"><span class="kwd" style="box-sizing: border-box; color: rgb(0, 0, 136);">package</span><span class="pln" style="box-sizing: border-box;"> com</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box;">example</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box;">helloworld</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box;">  </span><span class="kwd" style="box-sizing: border-box; color: rgb(0, 0, 136);">import</span><span class="pln" style="box-sizing: border-box;"> android</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box;">support</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box;">v7</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box;">app</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">.</span><span class="typ" style="box-sizing: border-box; color: rgb(127, 0, 85);">AppCompatActivity</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box;"> </span><span class="kwd" style="box-sizing: border-box; color: rgb(0, 0, 136);">import</span><span class="pln" style="box-sizing: border-box;"> android</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box;">os</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">.</span><span class="typ" style="box-sizing: border-box; color: rgb(127, 0, 85);">Bundle</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box;">  </span><span class="kwd" style="box-sizing: border-box; color: rgb(0, 0, 136);">public</span><span class="pln" style="box-sizing: border-box;"> </span><span class="kwd" style="box-sizing: border-box; color: rgb(0, 0, 136);">class</span><span class="pln" style="box-sizing: border-box;"> </span><span class="typ" style="box-sizing: border-box; color: rgb(127, 0, 85);">MainActivity</span><span class="pln" style="box-sizing: border-box;"> </span><span class="kwd" style="box-sizing: border-box; color: rgb(0, 0, 136);">extends</span><span class="pln" style="box-sizing: border-box;"> </span><span class="typ" style="box-sizing: border-box; color: rgb(127, 0, 85);">AppCompatActivity</span><span class="pln" style="box-sizing: border-box;"> </span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box;">    </span><span class="lit" style="box-sizing: border-box; color: rgb(0, 102, 102);">@Override</span><span class="pln" style="box-sizing: border-box;">    </span><span class="kwd" style="box-sizing: border-box; color: rgb(0, 0, 136);">protected</span><span class="pln" style="box-sizing: border-box;"> </span><span class="kwd" style="box-sizing: border-box; color: rgb(0, 0, 136);">void</span><span class="pln" style="box-sizing: border-box;"> onCreate</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">(</span><span class="typ" style="box-sizing: border-box; color: rgb(127, 0, 85);">Bundle</span><span class="pln" style="box-sizing: border-box;"> savedInstanceState</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">)</span><span class="pln" style="box-sizing: border-box;"> </span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box;">       </span><span class="kwd" style="box-sizing: border-box; color: rgb(0, 0, 136);">super</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box;">onCreate</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box;">savedInstanceState</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box;">       setContentView</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box;">R</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box;">layout</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box;">activity_main</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box;">    </span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box;"> </span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">}</span></pre><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">这里，</font><i style="box-sizing: border-box;">R.layout.activity_main</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">是指</font><font style="box-sizing: border-box; vertical-align: inherit;">位于</font><i style="box-sizing: border-box;"><font style="box-sizing: border-box; vertical-align: inherit;">res / layout</font></i><font style="box-sizing: border-box; vertical-align: inherit;">文件夹中</font><font style="box-sizing: border-box; vertical-align: inherit;">的</font></font><i style="box-sizing: border-box;">activity_main.xml</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">文件</font><font style="box-sizing: border-box; vertical-align: inherit;">。</font><font style="box-sizing: border-box; vertical-align: inherit;">所述</font><i style="box-sizing: border-box;"><font style="box-sizing: border-box; vertical-align: inherit;">的onCreate（）</font></i><font style="box-sizing: border-box; vertical-align: inherit;">方法是当加载一个活动被想通许多方法之一。</font></font></p><h2 style="box-sizing: border-box; color: rgb(18, 18, 20); font-weight: normal; letter-spacing: -1px; margin: 0.2em 0.2em 0.2em 0px; font-size: 1.7em; line-height: 1.5em; padding: 0px; text-shadow: rgb(204, 204, 204) 1px 1px 2px; position: relative; left: 0px; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif;"><font style="box-sizing: border-box; vertical-align: inherit;">清单文件</font></h2><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">无论您作为应用程序的一部分开发什么组件，您都必须将其所有组件声明在</font><font style="box-sizing: border-box; vertical-align: inherit;">驻留在应用程序项目目录根目录下的</font></font><i style="box-sizing: border-box;">manifest.xml</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">中。</font><font style="box-sizing: border-box; vertical-align: inherit;">这个文件作为Android OS和你的应用程序之间的接口，所以如果你没有在这个文件中声明你的组件，那么操作系统将不会考虑它。</font><font style="box-sizing: border-box; vertical-align: inherit;">例如，默认的清单文件看起来像下面的文件 -</font></font></p><pre class="prettyprint notranslate prettyprinted" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; padding: 5px; margin-top: 15px; margin-bottom: 10px; border-radius: 0px; width: 604px; line-height: 16px; border: 1px solid rgb(214, 214, 214); background-color: rgb(238, 238, 238); font-size: 13px; overflow: auto; color: rgb(49, 49, 49);"><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">&lt;?</span><span class="pln" style="box-sizing: border-box;">xml version</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="str" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;1.0&quot;</span><span class="pln" style="box-sizing: border-box;"> encoding</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="str" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;utf-8&quot;</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">?&gt;</span><span class="pln" style="box-sizing: border-box;"> </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;manifest</span><span class="pln" style="box-sizing: border-box;"> </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">xmlns:android</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="pln" style="box-sizing: border-box;">     </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">package</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;com.example.tutorialspoint7.myapplication&quot;</span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&gt;</span><span class="pln" style="box-sizing: border-box;">     </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;application</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:allowBackup</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;true&quot;</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:icon</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;@mipmap/ic_launcher&quot;</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:label</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;@string/app_name&quot;</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:supportsRtl</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;true&quot;</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:theme</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;@style/AppTheme&quot;</span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&gt;</span><span class="pln" style="box-sizing: border-box;">              </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;activity</span><span class="pln" style="box-sizing: border-box;"> </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:name</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;.MainActivity&quot;</span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&gt;</span><span class="pln" style="box-sizing: border-box;">          </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;intent-filter&gt;</span><span class="pln" style="box-sizing: border-box;">             </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;action</span><span class="pln" style="box-sizing: border-box;"> </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:name</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;android.intent.action.MAIN&quot;</span><span class="pln" style="box-sizing: border-box;"> </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">/&gt;</span><span class="pln" style="box-sizing: border-box;">             </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;category</span><span class="pln" style="box-sizing: border-box;"> </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:name</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;android.intent.category.LAUNCHER&quot;</span><span class="pln" style="box-sizing: border-box;"> </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">/&gt;</span><span class="pln" style="box-sizing: border-box;">          </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;/intent-filter&gt;</span><span class="pln" style="box-sizing: border-box;">       </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;/activity&gt;</span><span class="pln" style="box-sizing: border-box;">    </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;/application&gt;</span><span class="pln" style="box-sizing: border-box;"> </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;/manifest&gt;</span></pre><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">这里&lt;application&gt; ... &lt;/ application&gt;标签包含了与应用程序相关的组件。</font><font style="box-sizing: border-box; vertical-align: inherit;">属性</font></font><i style="box-sizing: border-box;">android：icon</i><font style="box-sizing: border-box; vertical-align: inherit;">将指向</font><i style="box-sizing: border-box;">res / drawable-hdpi</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">下的应用程序图标</font><font style="box-sizing: border-box; vertical-align: inherit;">。</font><font style="box-sizing: border-box; vertical-align: inherit;">该应用程序使用位于可绘制文件夹中的名为ic_launcher.png的图像</font></font></p><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">&lt;activity&gt;标记用于指定活动，</font><i style="box-sizing: border-box;">android：name</i><font style="box-sizing: border-box; vertical-align: inherit;">属性指定</font><i style="box-sizing: border-box;">Activity</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">子类</font><font style="box-sizing: border-box; vertical-align: inherit;">的完全限定类名，</font></font><i style="box-sizing: border-box;">android：label</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">属性指定用作活动标签的字符串。</font><font style="box-sizing: border-box; vertical-align: inherit;">您可以使用&lt;activity&gt;标签指定多个活动。</font></font></p><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">该</font><span style="box-sizing: border-box; font-weight: 640;">行动</span><font style="box-sizing: border-box; vertical-align: inherit;">的意图过滤器被命名为</font><i style="box-sizing: border-box;">android.intent.action.MAIN</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">，表明这项活动作为切入点应用。</font><font style="box-sizing: border-box; vertical-align: inherit;">意图过滤器</font><font style="box-sizing: border-box; vertical-align: inherit;">的</font></font><span style="box-sizing: border-box; font-weight: 640;">类别</span><font style="box-sizing: border-box; vertical-align: inherit;">被命名为</font><i style="box-sizing: border-box;">android.intent.category.LAUNCHER，</i><font style="box-sizing: border-box; vertical-align: inherit;">以指示应用程序可以从设备的启动器图标启动。</font></p><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">该</font><i style="box-sizing: border-box;">@string</i><font style="box-sizing: border-box; vertical-align: inherit;">指</font><i style="box-sizing: border-box;">的strings.xml</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">文件解释如下。</font><font style="box-sizing: border-box; vertical-align: inherit;">因此，</font></font><i style="box-sizing: border-box;">@ string / app_name</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">引用</font><font style="box-sizing: border-box; vertical-align: inherit;">了strings.xml文件中定义</font><font style="box-sizing: border-box; vertical-align: inherit;">的</font></font><i style="box-sizing: border-box;">app_name</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">字符串，即&ldquo;HelloWorld&rdquo;。</font><font style="box-sizing: border-box; vertical-align: inherit;">类似的方式，其他字符串会填充到应用程序中。</font></font></p><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">以下是清单文件中用于指定不同Android应用程序组件的标签列表 -</font></p><ul class="list" style="box-sizing: border-box; color: rgb(49, 49, 49); font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 14px;">    <li style="box-sizing: border-box; line-height: 24px; margin-bottom: 5px; background: url(&quot;/images/icon-bullet.png&quot;) 0px 4px no-repeat; padding: 0px 0px 0px 19px; list-style: none; color: rgb(0, 0, 0);">    <p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">活动的&lt;activity&gt;元素</font></p>    </li>    <li style="box-sizing: border-box; line-height: 24px; margin-bottom: 5px; background: url(&quot;/images/icon-bullet.png&quot;) 0px 4px no-repeat; padding: 0px 0px 0px 19px; list-style: none; color: rgb(0, 0, 0);">    <p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">服务的&lt;service&gt;元素</font></p>    </li>    <li style="box-sizing: border-box; line-height: 24px; margin-bottom: 5px; background: url(&quot;/images/icon-bullet.png&quot;) 0px 4px no-repeat; padding: 0px 0px 0px 19px; list-style: none; color: rgb(0, 0, 0);">    <p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">广播接收机的&lt;receiver&gt;元素</font></p>    </li>    <li style="box-sizing: border-box; line-height: 24px; margin-bottom: 5px; background: url(&quot;/images/icon-bullet.png&quot;) 0px 4px no-repeat; padding: 0px 0px 0px 19px; list-style: none; color: rgb(0, 0, 0);">    <p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">内容提供者的&lt;provider&gt;元素</font></p>    </li></ul><h2 style="box-sizing: border-box; color: rgb(18, 18, 20); font-weight: normal; letter-spacing: -1px; margin: 0.2em 0.2em 0.2em 0px; font-size: 1.7em; line-height: 1.5em; padding: 0px; text-shadow: rgb(204, 204, 204) 1px 1px 2px; position: relative; left: 0px; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif;"><font style="box-sizing: border-box; vertical-align: inherit;">字符串文件</font></h2><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">该</font><span style="box-sizing: border-box; font-weight: 640;">的strings.xml</span><font style="box-sizing: border-box; vertical-align: inherit;">文件位于</font><i style="box-sizing: border-box;">RES /值</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">文件夹，它包含了你的应用程序使用的所有文本。</font><font style="box-sizing: border-box; vertical-align: inherit;">例如，按钮，标签，默认文本和类似类型的字符串的名称将进入此文件。</font><font style="box-sizing: border-box; vertical-align: inherit;">该文件负责其文本内容。</font><font style="box-sizing: border-box; vertical-align: inherit;">例如，一个默认的字符串文件看起来像下面的文件 -</font></font></p><pre class="prettyprint notranslate prettyprinted" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; padding: 5px; margin-top: 15px; margin-bottom: 10px; border-radius: 0px; width: 604px; line-height: 16px; border: 1px solid rgb(214, 214, 214); background-color: rgb(238, 238, 238); font-size: 13px; overflow: auto; color: rgb(49, 49, 49);"><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;resources&gt;</span><span class="pln" style="box-sizing: border-box;">    </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;string</span><span class="pln" style="box-sizing: border-box;"> </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">name</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;app_name&quot;</span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&gt;</span><span class="pln" style="box-sizing: border-box;">HelloWorld</span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;/string&gt;</span><span class="pln" style="box-sizing: border-box;">    </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;string</span><span class="pln" style="box-sizing: border-box;"> </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">name</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;hello_world&quot;</span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&gt;</span><span class="pln" style="box-sizing: border-box;">Hello world!</span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;/string&gt;</span><span class="pln" style="box-sizing: border-box;">    </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;string</span><span class="pln" style="box-sizing: border-box;"> </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">name</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;menu_settings&quot;</span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&gt;</span><span class="pln" style="box-sizing: border-box;">Settings</span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;/string&gt;</span><span class="pln" style="box-sizing: border-box;">    </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;string</span><span class="pln" style="box-sizing: border-box;"> </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">name</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;title_activity_main&quot;</span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&gt;</span><span class="pln" style="box-sizing: border-box;">MainActivity</span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;/string&gt;</span><span class="pln" style="box-sizing: border-box;"> </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;/resources&gt;</span></pre><h2 style="box-sizing: border-box; color: rgb(18, 18, 20); font-weight: normal; letter-spacing: -1px; margin: 0.2em 0.2em 0.2em 0px; font-size: 1.7em; line-height: 1.5em; padding: 0px; text-shadow: rgb(204, 204, 204) 1px 1px 2px; position: relative; left: 0px; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif;"><font style="box-sizing: border-box; vertical-align: inherit;">布局文件</font></h2><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">该</font><span style="box-sizing: border-box; font-weight: 640;">activity_main.xml中</span><font style="box-sizing: border-box; vertical-align: inherit;">是可用布局文件</font><i style="box-sizing: border-box;">RES /布局</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">目录，由应用程序构建它的界面时引用。</font><font style="box-sizing: border-box; vertical-align: inherit;">您将经常修改该文件以更改应用程序的布局。</font><font style="box-sizing: border-box; vertical-align: inherit;">为你的&ldquo;Hello World！&rdquo;&nbsp;</font><font style="box-sizing: border-box; vertical-align: inherit;">应用程序，此文件将具有以下与默认布局相关的内容 -</font></font></p><pre class="prettyprint notranslate prettyprinted" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; padding: 5px; margin-top: 15px; margin-bottom: 10px; border-radius: 0px; width: 604px; line-height: 16px; border: 1px solid rgb(214, 214, 214); background-color: rgb(238, 238, 238); font-size: 13px; overflow: auto; color: rgb(49, 49, 49);"><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;RelativeLayout</span><span class="pln" style="box-sizing: border-box;"> </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">xmlns:android</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="pln" style="box-sizing: border-box;">    </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">xmlns:tools</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;http://schemas.android.com/tools&quot;</span><span class="pln" style="box-sizing: border-box;">    </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:layout_width</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;match_parent&quot;</span><span class="pln" style="box-sizing: border-box;">    </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:layout_height</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;match_parent&quot;</span><span class="pln" style="box-sizing: border-box;"> </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&gt;</span><span class="pln" style="box-sizing: border-box;">        </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;TextView</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:layout_width</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;wrap_content&quot;</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:layout_height</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;wrap_content&quot;</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:layout_centerHorizontal</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;true&quot;</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:layout_centerVertical</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;true&quot;</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:padding</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;@dimen/padding_medium&quot;</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">android:text</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;@string/hello_world&quot;</span><span class="pln" style="box-sizing: border-box;">       </span><span class="atn" style="box-sizing: border-box; color: rgb(127, 0, 85);">tools:context</span><span class="pun" style="box-sizing: border-box; color: rgb(102, 102, 0);">=</span><span class="atv" style="box-sizing: border-box; color: rgb(0, 136, 0);">&quot;.MainActivity&quot;</span><span class="pln" style="box-sizing: border-box;"> </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">/&gt;</span><span class="pln" style="box-sizing: border-box;">        </span><span class="tag" style="box-sizing: border-box; color: rgb(0, 0, 136);">&lt;/RelativeLayout&gt;</span></pre><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">这是一个简单的</font><i style="box-sizing: border-box;">RelativeLayout</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">的例子</font><font style="box-sizing: border-box; vertical-align: inherit;">，我们将在一个单独的章节中进行研究。</font><font style="box-sizing: border-box; vertical-align: inherit;">所述</font></font><i style="box-sizing: border-box;">的TextView</i><font style="box-sizing: border-box; vertical-align: inherit;">是用于构建图形用户界面和它具有各种属性像一个Android控制</font><i style="box-sizing: border-box;">机器人：layout_width</i><font style="box-sizing: border-box; vertical-align: inherit;">，</font><i style="box-sizing: border-box;">机器人：layout_height</i><font style="box-sizing: border-box; vertical-align: inherit;">正被用来设置其宽度和高度等等。</font><i style="box-sizing: border-box;">@string</i><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">是指位于在strings.xml档案res / values文件夹。</font><font style="box-sizing: border-box; vertical-align: inherit;">因此，@ string / hello_world指的是在strings.xml文件中定义的hello字符串，即&ldquo;Hello World！&rdquo;。</font></font></p><h2 style="box-sizing: border-box; color: rgb(18, 18, 20); font-weight: normal; letter-spacing: -1px; margin: 0.2em 0.2em 0.2em 0px; font-size: 1.7em; line-height: 1.5em; padding: 0px; text-shadow: rgb(204, 204, 204) 1px 1px 2px; position: relative; left: 0px; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif;"><font style="box-sizing: border-box; vertical-align: inherit;">运行应用程序</font></h2><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;">让我们试着运行我们的</font><span style="box-sizing: border-box; font-weight: 640;">Hello World！</span><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">我们刚创建的应用程序&nbsp;</font><font style="box-sizing: border-box; vertical-align: inherit;">我假设你在创建</font><font style="box-sizing: border-box; vertical-align: inherit;">环境时</font><font style="box-sizing: border-box; vertical-align: inherit;">已经创建了</font></font><span style="box-sizing: border-box; font-weight: 640;">AVD</span><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">。</font><font style="box-sizing: border-box; vertical-align: inherit;">要从Android Studio运行应用程序，请打开项目的一个活动文件，然后</font></font><img class="inline" src="https://www.tutorialspoint.com/android/images/eclipse_run.jpg" alt="Eclipse运行图标" style="box-sizing: border-box; vertical-align: middle; max-width: 100%; border: 0px; position: relative; top: 3px; display: block; margin-left: auto; margin-right: auto; padding-bottom: 4px;" /><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">从工具栏中</font><font style="box-sizing: border-box; vertical-align: inherit;">单击&ldquo;运行&rdquo;&nbsp;</font><font style="box-sizing: border-box; vertical-align: inherit;">图标。</font><font style="box-sizing: border-box; vertical-align: inherit;">Android工作室在您的AVD上安装应用程序并启动它，如果您的设置和应用程序一切正常，它会显示以下仿真器窗口 -</font></font></p><p><img src="http://camnpr.com/upload/2018/3/201803211604423606.jpg" alt="Android Hello World" style="box-sizing: border-box; vertical-align: middle; max-width: 100%; border: 0px; display: block; margin-left: auto; margin-right: auto; padding-bottom: 4px; color: rgb(49, 49, 49); font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 14px;" /></p><p style="box-sizing: border-box; line-height: 24px; margin: 0em 0.2em 0.6em; word-wrap: break-word; padding: 0px; text-align: justify; font-family: Verdana, Geneva, Tahoma, Arial, Helvetica, sans-serif; font-size: 15px !important;"><font style="box-sizing: border-box; vertical-align: inherit;"><font style="box-sizing: border-box; vertical-align: inherit;">恭喜！</font><font style="box-sizing: border-box; vertical-align: inherit;">您已经开发出了第一个Android应用程序，现在只需继续按照教程的其余部分逐步成为一名优秀的Android开发人员。</font><font style="box-sizing: border-box; vertical-align: inherit;">一切都很好。</font></font></p>]]></description><category>手机开发</category><comments>http://camnpr.com/mobile-dev/2291.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2291</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2291&amp;key=f221655a</trackback:ping></item><item><title>weex 入门相关知识 打包 apk</title><author>camnpr@163.com (camnpr)</author><link>http://camnpr.com/mobile-dev/2290.html</link><pubDate>Tue, 20 Mar 2018 17:48:03 +0800</pubDate><guid>http://camnpr.com/mobile-dev/2290.html</guid><description><![CDATA[<p>Weex 是一套简单易用的跨平台开发方案，能以 web 的开发体验构建高性能、可扩展的 native 应用，为了做到这些，Weex 与 Vue 合作，使用 Vue 作为上层框架，并遵循 W3C 标准实现了统一的 JSEngine 和 DOM API，这样一来，你甚至可以使用其他框架驱动 Weex，打造三端一致的 native 应用。</p><p><span style="font-size: larger;"><strong>weex工作原理</strong></span></p><p><img src="http://camnpr.com/upload/2018/3/201803201755032158.jpg" alt="weex工作原理" /></p><p><span style="font-size: larger;"><strong>weex虚拟DOM解析过程</strong></span></p><p><img src="http://camnpr.com/upload/2018/3/201803201756136542.jpg" alt="weex虚拟DOM解析过程" /></p><p>&nbsp;</p><p><span style="font-size: larger;"><strong>整体分析下拉，按照js文件的渲染过程，绘制出了下面架构图</strong></span></p><p><img src="http://camnpr.com/upload/2018/3/201803201756544573.png" alt="整体分析下拉，按照js文件的渲染过程，绘制出了下面架构图" width="670" height="390" /></p><p>&nbsp;</p><p>&nbsp;&gt; weex</p><div>&nbsp;</div><div>可以看到可用的命令。</div><div>&nbsp;</div><div>&gt; weex run android</div><div>&nbsp;</div><div>打包weex代码（vue），到：&nbsp; \platforms\android\app\src\main\assets\dist&nbsp; 目录下。</div><div>&nbsp;</div><div>&nbsp;</div><div>（注： 不能直接生成apk，也许是 操作不当。）</div><div>&nbsp;</div><div>=============================================</div><div>&nbsp;</div><div>经过上边的步骤之后。</div><div>&nbsp;</div><div>&nbsp;</div><div>用 android studio(3.0)&nbsp; 打开，这个项目 （platforms/ android）</div><div>&nbsp;</div><div>可能需要的配置：</div><div>&nbsp;</div><div>gradle-wrapper.properties 下的： distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip</div><div>&nbsp;</div><div>---------------------------</div><div>&nbsp;</div><div>&nbsp;</div><div>然后： 菜单栏上， build&gt; apk&nbsp; 即可，在项目目录下：\platforms\android\app\build\outputs\apk&nbsp; 中生成一个apk，</div><div>&nbsp;</div><div>&nbsp;</div><div>这是一个 weex playground的 app，内容，是你写的weex页面。（注意是： assets目录下的index.js入口文件。我们生成的js文件在dist下，因此，要注意拷贝一下，或者指定从 dist 目录下找---未找到配置的地方。）</div><div>&nbsp;</div><div>&nbsp;</div><div>=============================================</div><div>&nbsp;</div><div>在 android studio 3.0 中，通过模拟器查看时，显示错误： &ldquo;waiting for target device to come online&rdquo;</div><div>&nbsp;</div><div>解决：</div><div>&nbsp;</div><div>file &gt;&nbsp; Settings...&nbsp; &nbsp;&gt;&nbsp; Appearance &amp; Behavior &gt; System Settings &gt; Android SDK&nbsp; 里的&nbsp; SDK Tools 选项卡下，找到Android Emulator&nbsp; 勾选，点击 Apply&nbsp; 开始安装下载。 即可。</div><div>&nbsp;</div><div>=============================================</div><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>]]></description><category>手机开发</category><comments>http://camnpr.com/mobile-dev/2290.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2290</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2290&amp;key=14d97e11</trackback:ping></item><item><title>2015年百度全网移动设备、操作系统、浏览器、分辨率占有率（基于贴吧无线数据）</title><author>bubuol@126.com (llmaomi)</author><link>http://camnpr.com/mobile-dev/2121.html</link><pubDate>Mon, 31 Aug 2015 17:11:30 +0800</pubDate><guid>http://camnpr.com/mobile-dev/2121.html</guid><description><![CDATA[<div id="noimgcss"><p>百度全网移动设备（操作系统）、浏览器、分辨率占有率<br />注：基于贴吧无线5月22日数据</p><p>移动设备（操作系统）:</p><p><img src="http://camnpr.com/upload/2015/8/4477b211jw1e4xf1bkihqj20k50f675m.jpg" alt="移动设备（操作系统）使用情况统计" width="700" height="527" /></p><p>浏览器:</p><p><img src="http://camnpr.com/upload/2015/8/201508311706114236.jpg" alt="移动端浏览器使用情况统计" width="700" height="581" /></p><p>分辨率:</p><p><img src="http://camnpr.com/upload/2015/8/201508311707156064.jpg" alt="移动端分辨率使用情况统计" width="700" height="394" /></p></div>]]></description><category>手机开发</category><comments>http://camnpr.com/mobile-dev/2121.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2121</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2121&amp;key=cf50ce88</trackback:ping></item><item><title>解决E/AndroidRuntime(17685): without permission not exported from uid的错误方法</title><author>kuabaobao_com@163.com (kuabaobao)</author><link>http://camnpr.com/mobile-dev/2094.html</link><pubDate>Tue, 11 Aug 2015 10:24:35 +0800</pubDate><guid>http://camnpr.com/mobile-dev/2094.html</guid><description><![CDATA[<p>今天把以前的一个项目导入到工程中，调试一翻很满意之后，运行，发现报错，报错信息如下</p><pre class="brush:text">01-16 09:45:32.870: E/AndroidRuntime(17685): java.lang.RuntimeException:  <br />Unable to start activity ComponentInfo{com.bxlt.android.aims.activity/com.bxlt.android.aims.activity.LoginActivity}: <br />java.lang.SecurityException: Not allowed to start service Intent { act=InformationService } <br /> without permission not exported from uid 10154</pre><p><br />刚开始有点发懵，因为这是一个已经上线的项目，怎么会出现这种问题，然后遍寻答案，在stackflow上找到了灵感，地址</p><p><a href="http://camnpr.com/TuiJianTools/Handler/gotoUrl.ashx?url=http%3A%2F%2Fstackoverflow%7Ccom%2Fquestions%2F11410718%2Fpermission-issue-while-starting-a-service-from-android" target="_blank">http://stackoverflow.com/questions/11410718/permission-issue-while-starting-a-service-from-android</a></p><p>然后发现测试机里面有两个工程用的Service都是注册的同一个名称，所以卸载掉一个工程，问题解决</p>]]></description><category>手机开发</category><comments>http://camnpr.com/mobile-dev/2094.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2094</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2094&amp;key=75999182</trackback:ping></item><item><title>Android的 settings.db数据库中如何添加一项新的设置</title><author>camnpr@163.com (佚名)</author><link>http://camnpr.com/mobile-dev/2089.html</link><pubDate>Wed, 05 Aug 2015 10:25:35 +0800</pubDate><guid>http://camnpr.com/mobile-dev/2089.html</guid><description><![CDATA[<p>&nbsp;　　Settings数据存放在com.android.providers.settings/databases/settings.db 中</p><p>　　数据库中数据的默认数据在frameworks/base/packages/SettingsProvider/res/values/defaults.xml中定义，如果要在数据库中添加一个新的字段，则可用如下步骤：</p><p>　　1、在defaults.xml中为新加的数据定义一个默认值(当然也可在代码中直接给定)</p><p>　　2、在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java中的loadSystemSettings()方法中加入新字段的添加代码，如下：</p><p>　　loadIntegerSetting(stmt, &quot;homescreen_switch_effict&quot;,</p><p>　　R.integer.def_homescreen_switch_effict);</p><p>　　3、重新编译一个SettingsProvider.apk，再替换原来的SettingsProvider.apk</p><p>　　4、用Settings.System.putInt();Settings.System.getInt()来设置和取得设置的值</p>]]></description><category>手机开发</category><comments>http://camnpr.com/mobile-dev/2089.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2089</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2089&amp;key=38706d3b</trackback:ping></item><item><title>Android ICS下用gdb远程调试办法</title><author>camnpr@163.com (佚名)</author><link>http://camnpr.com/mobile-dev/2088.html</link><pubDate>Mon, 03 Aug 2015 09:30:02 +0800</pubDate><guid>http://camnpr.com/mobile-dev/2088.html</guid><description><![CDATA[<p>&nbsp;　　Host: ubuntu</p><p>　　Target: Android ICS</p><p>　　1. 将gdbserver和gdbclient分别放入target和host。两者都可在android源代码的prebuilt目录下找到。</p><p>　　2. 在Target上启动gdbserver，在adb shell中执行</p><p>　　$ /path/to/gdbserver :1111--attach PID</p><p>　　其中PID为想要debug程序的进程号，可以通过ps得到。1111为端口号，可以自定义。</p><p>　　3. 在Host上启动gdbclient，首先将target上的库pull到host上(如/home/jzj/debug/gdb)</p><p>　　$cd /home/jzj/debug/gdb</p><p>　　$adb pull /system/lib</p><p>　　$adb pull /system/bin/app_process</p><p>　　然后写启动脚本init.gdb(这里假设程序要用到的库放在/home/jzj/debug/gdb/下，android的symbol放在/home/jzj/debug/ics/symbols/system/lib/下，android的源码放在/home/jzj/workspace/ics下)</p><p>　　file /home/jzj/debug/gdb/app_process</p><p>　　set solib-absolute-prefix /home/jzj/debug/ics/symbols/</p><p>　　set solib-search-path /home/jzj/debug/ics/symbols/system/lib/:/home/jzj/debug/gdb</p><p>　　dir /home/jzj/workspace/ics</p><p>　　shell adb forward tcp:1111 tcp:1111</p><p>　　target remote :1111</p><p>　　最后执行</p><p>　　$ gdb -x init.gdb</p><p>　　就可以启动gdb了。一切正常的话这时候就可以用gdb的基本功能，如设断点或者查看内存了。这时有些so库的符号表可能还没载入，可以执行</p><p>　　(gdb) shared</p><p>　　载入这些符号表。</p><p>　　最后附个关于gdb设置脚本中两个变量的官方解释，一般solib-absolute-prefix先于solib-search-path查找。</p><p>　　solib-absolute-prefix ：</p><p>　　If this variable is set, path will be used as a prefix for any absolute shared library paths; many runtime loaders store the absolute paths to the shared library in the target program's memory. If you use `solib-absolute-prefix' to find shared libraries, they need to be laid out in the same way that they are on the target, with e.g. a `/usr/lib' hierarchy under path. You can set the default value of `solib-absolute-prefix' by using the configure-time `--with-sysroot' option.</p><p>　　solib-search-path ：</p><p>　　If this variable is set, path is a colon-separated list of directories to search for shared libraries. `solib-search-path' is used after `solib-absolute-prefix' fails to locate the library, or if the path to the library is relative instead of absolute. If you want to use `solib-search-path' instead of `solib-absolute-prefix', be sure to set `solib-absolute-prefix' to a nonexistant directory to prevent GDB from finding your host's libraries.</p>]]></description><category>手机开发</category><comments>http://camnpr.com/mobile-dev/2088.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2088</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2088&amp;key=e4b62738</trackback:ping></item><item><title>&amp;quot;Hello World&amp;quot;之创建我的第一个Android项目</title><author>kuabaobao_com@163.com (kuabaobao)</author><link>http://camnpr.com/mobile-dev/2069.html</link><pubDate>Mon, 20 Jul 2015 10:19:30 +0800</pubDate><guid>http://camnpr.com/mobile-dev/2069.html</guid><description><![CDATA[<div id="noimgcss"><p>&nbsp;　　随着移动互联网的迅速发展，前端的概念已发生很大的变化，已不仅仅局限在网页端。而Android系统作为智能机市场的老大，作为前端开 发工程师，非常有必要了解和学习。但面对众多学习资料，站在前端开发工程师的角色，怎样挑选出合适的路进行快速学习，而不必浪费大量时间去摸索，该系列文 章希望能帮助到小伙伴们。</p><p>　　文章会挑选几个实际的例子，贯穿在整个系列中，涉及到Java、Android、程序设计等多方面知识，力求让大家快速掌握。俗话说，工欲善其事，必先利其器，系列的第一篇就从Window系统下Android的环境搭建说起。Let&rsquo;s Go!</p><p>　　Step1：JDK的安装和Java环境变量的设置</p><p>　　JDK(Java Development Kit)是整个Java的核心，包括一系列Java开发的东西，安装完毕需要配置一下环境变量。</p><p>　　1)JAVA_HOME</p><p>　　JDK的安装路径，这个环境变量本身不存在，需要创建，创建完则可以利用%JAVA_HOME%作为统一引用路径，其值为：jdk在你电脑上的安装路径</p><center><img src="http://camnpr.com/upload/2015/7/201507132144341702.jpg" alt="创建你的第一个Android项目 郑州网建" border="1" /></center><p>　　2)PATH</p><p>　　PATH属性已存在，可直接编辑。作用是用于配置路径，简化命令的输入，其值为：%JAVA_HOME%bin</p><center><img src="http://camnpr.com/upload/2015/7/201507132144375021.jpg" alt="android_1_path" border="1" /></center><p>　　3)CLASSPATH</p><p>　　用于编译时JAVA类的路径，注意这里设置的是两个值，(.;)表示的是JVM先搜索当前目录。其值为：.;%JAVA_HOME%libtools.jar</p><center><img src="http://camnpr.com/upload/2015/7/201507132144383368.jpg" alt="android_1_classpath" border="1" /></center><p>　　配置完毕后，通过cmd运行以下命令：java -version，javac 如果出现返回信息，则设置成功</p><center><img src="http://camnpr.com/upload/2015/7/201507132144380423.jpg" alt="android_1_cmd" border="1" /></center><p>　　Step2：安装Eclipse</p><p>　　Eclipse为Java及Android开发的IDE。Eclipse不需要安装，把解压包解压后，剪切eclipse文件夹到你想安装的地方，打开时设置你的工作目录即可。</p><center><img src="http://camnpr.com/upload/2015/7/201507132144388651.jpg" alt="android_1_eclipse" border="1" /></center><p>　　Step3：安装Android SDK</p><p>　　Andorid SDK为Android管理开发包工具，提供了Android各级平台的开发包和工具。注意，因为我们是独立安装，不是一体化(集成系列工具)所以需要单独下载SDK。(如图)</p><center><img src="http://camnpr.com/upload/2015/7/201507132144393050.jpg" alt="android1_singlesdk" border="1" /></center><p>　　运行安装文件，并把安装目录下tools文件夹路径设置进PATH环境变量</p><center><img src="http://camnpr.com/upload/2015/7/201507132144397452.jpg" alt="android_1_sdksetup" border="1" /></center><center><img src="http://camnpr.com/upload/2015/7/201507132144391857.jpg" alt="android_1_sdkpath" border="1" /></center><p>　　去到安装目录运行SDK Manager，一开始什么平台和工具也没有，需要下载回来。公司内网的话需要使用代理来下载。</p><center><img src="http://camnpr.com/upload/2015/7/201507132144393754.jpg" alt="android_1_sdkmgr" border="1" /></center><p>　　到 Tools -&gt; Options&hellip; 把代理填上，点击 Close 后则会出现众多平台列表，把Android Tools 选上安装，另外建议把2.2以上的全部下载安装。</p><center><img src="http://camnpr.com/upload/2015/7/201507132144403363.jpg" alt="android_1_sdkproxy" border="1" /></center><center><img src="http://camnpr.com/upload/2015/7/201507132144401713.jpg" alt="android_1_sdkdownload" border="1" /></center><p>　　step4：安装配置ADT</p><p>　　ADT是Eclipse的插件，用于管理开发Android</p><p>　　1)安装ADT</p><p>　　启动Eclipse，点击 Help菜单 -&gt; Install New Software&hellip; ，点击 Add&hellip; ，输入地址：http://dl-ssl.google.com/android/eclipse/</p><center><img src="http://camnpr.com/upload/2015/7/201507132149416317.jpg" alt="android1_adt1" border="1" /></center><p>　　选取要安装的项，一路Next完成安装并重启。这样ADT就安装完毕了。</p><center><img src="http://camnpr.com/upload/2015/7/201507132146052424.jpg" alt="android1_adt2" border="1" /></center><p>　　2)配置ADT</p><p>　　选择 Window -&gt; Preferences ，在弹出面板中就会看到Android设置项，填上安装的SDK路径，则会出现刚才在SDK中安装的各平台包，按OK则完成配置。此时Android的环境就搭建完毕，可以进行Android项目的开发了。</p><center><img src="http://camnpr.com/upload/2015/7/201507132146056561.jpg" alt="android1_adt_finish" border="1" /></center><p>　　Step5：创建第一个Android项目</p><p>　　1)选择 File -&gt; New -&gt; Other -&gt; Android -&gt; Android Application Project</p><p>　　2)输入项目所需信息</p><p>　　Application Name (应用的名称)</p><p>　　Project Name (在Eclipse中该项目的名称)</p><p>　　Package Name (存放Java类的包名称，其实质是存放的文件夹路径，.号为文件分隔符，我们编写的Java文件都会放在项目的src目录下，如com.tencent.helloworld表示类放在src/com/tencent/helloworld文件夹中)</p><center><img src="http://camnpr.com/upload/2015/7/201507132146066365.jpg" alt="android1_create" border="1" /></center><p>　　3)一路Next直到Finish，则我们的工程创建完毕。</p><center><img src="http://camnpr.com/upload/2015/7/201507132146068108.jpg" alt="android_1_helloworld" border="1" /></center><p>　　4)由于程序是运行在模拟器上的，我们还没有创建一个模拟器，所以需创建一个，创建完点关闭则可。</p><center><img src="http://camnpr.com/upload/2015/7/201507132146065586.jpg" alt="android1_vm" border="1" /></center><p>　　5)点击 三角型 run按钮，然后选择刚才创建的模拟器，则程序开始运行。小提示：启动模拟器会比较慢，所以，当程序作出修改，需要再次运行时，不要关闭掉模拟器，直接按模拟器上的Home或返回键退出app，之后再按run，则可重新跑起。</p><center><img src="http://camnpr.com/upload/2015/7/201507132146074714.jpg" alt="android_1_simutorlate" border="1" /></center></div>]]></description><category>手机开发</category><comments>http://camnpr.com/mobile-dev/2069.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2069</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2069&amp;key=cde275f4</trackback:ping></item><item><title>Android（安卓）判断是否联网及判断SDK版本</title><author>camnpr@163.com (佚名)</author><link>http://camnpr.com/mobile-dev/2074.html</link><pubDate>Wed, 15 Jul 2015 11:39:29 +0800</pubDate><guid>http://camnpr.com/mobile-dev/2074.html</guid><description><![CDATA[<pre class="brush:java">public static int getSDKVersionNumber() {<br>		int sdkVersion;<br>		try {<br>			sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK);<br><br>		} catch (NumberFormatException e) {<br><br>			sdkVersion = 0;<br>		}<br>		return sdkVersion;<br>	}</pre><pre class="brush:java">public static boolean hasInternet(Activity activity) {<br>		ConnectivityManager manager = (ConnectivityManager) activity<br>				.getSystemService(Context.CONNECTIVITY_SERVICE);<br>		NetworkInfo info = manager.getActiveNetworkInfo();<br>		if (info == null || !info.isConnected()) {<br>			return false;<br>		}<br>		if (info.isRoaming()) {<br>			return true;<br>		}<br>		return true;<br>	}</pre>]]></description><category>手机开发</category><comments>http://camnpr.com/mobile-dev/2074.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2074</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2074&amp;key=f6ca926b</trackback:ping></item><item><title>IOS上传图片/文件的通用方法（含时间戳验证和Sign签名）</title><author>bubuol@126.com (llmaomi)</author><link>http://camnpr.com/mobile-dev/1996.html</link><pubDate>Fri, 08 May 2015 10:18:06 +0800</pubDate><guid>http://camnpr.com/mobile-dev/1996.html</guid><description><![CDATA[<pre class="brush:c">&nbsp;(NSString*)&nbsp;memberUploadavatar:(UIImage&nbsp;*)image&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*action&nbsp;=&nbsp;@&quot;action=uploadavatar&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*mainUrl&nbsp;=&nbsp;[self&nbsp;getMainUrl];<br />&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*unixTime&nbsp;=&nbsp;[NSString&nbsp;stringWithFormat:@&quot;timestamp=%ld&quot;,&nbsp;(time_t)&nbsp;[[NSDate&nbsp;date]&nbsp;timeIntervalSince1970]];<br />//&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*unixTime&nbsp;=&nbsp;@&quot;timestamp=1429629388&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;NSMutableArray&nbsp;*nameList&nbsp;=&nbsp;[[NSMutableArray&nbsp;alloc]&nbsp;init];<br />&nbsp;&nbsp;&nbsp;&nbsp;[nameList&nbsp;addObject:unixTime];<br />&nbsp;&nbsp;&nbsp;&nbsp;[nameList&nbsp;addObject:action];<br />&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*sign&nbsp;=&nbsp;[self&nbsp;generateSign:mainUrl&nbsp;nameList:nameList];<br />&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*url&nbsp;=&nbsp;[NSString&nbsp;stringWithFormat:@&quot;%@?%@&amp;%@&amp;sign=%@&quot;,&nbsp;mainUrl,&nbsp;action,&nbsp;unixTime,&nbsp;sign];<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//要上传的图片<br />//&nbsp;&nbsp;&nbsp;&nbsp;UIImage&nbsp;*image=[params&nbsp;objectForKey:@&quot;pic&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;//分界线的标识符<br />&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*TWITTERFON_FORM_BOUNDARY&nbsp;=&nbsp;@&quot;AaB03x&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;//根据url初始化request<br />&nbsp;&nbsp;&nbsp;&nbsp;NSMutableURLRequest*&nbsp;request&nbsp;=&nbsp;[NSMutableURLRequest&nbsp;requestWithURL:[NSURL&nbsp;URLWithString:url]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cachePolicy:NSURLRequestReloadIgnoringLocalCacheData<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeoutInterval:10];<br />&nbsp;&nbsp;&nbsp;&nbsp;//分界线&nbsp;--AaB03x<br />&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*MPboundary=[[NSString&nbsp;alloc]initWithFormat:@&quot;--%@&quot;,TWITTERFON_FORM_BOUNDARY];<br />&nbsp;&nbsp;&nbsp;&nbsp;//结束符&nbsp;AaB03x--<br />&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*endMPboundary=[[NSString&nbsp;alloc]initWithFormat:@&quot;%@--&quot;,MPboundary];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//得到图片的data<br />&nbsp;&nbsp;&nbsp;&nbsp;NSData*&nbsp;data&nbsp;=&nbsp;UIImagePNGRepresentation(image);<br />&nbsp;&nbsp;&nbsp;&nbsp;//http&nbsp;body的字符串<br />&nbsp;&nbsp;&nbsp;&nbsp;NSMutableString&nbsp;*body=[[NSMutableString&nbsp;alloc]init];<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;////添加分界线，换行<br />&nbsp;&nbsp;&nbsp;&nbsp;[body&nbsp;appendFormat:@&quot;%@\r\n&quot;,MPboundary];<br />&nbsp;&nbsp;&nbsp;&nbsp;//声明pic字段，文件名为boris.png<br />&nbsp;&nbsp;&nbsp;&nbsp;[body&nbsp;appendFormat:@&quot;Content-Disposition:&nbsp;form-data;&nbsp;name=\&quot;Image\&quot;;&nbsp;filename=\&quot;boris.png\&quot;\r\n&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;//声明上传文件的格式<br />&nbsp;&nbsp;&nbsp;&nbsp;[body&nbsp;appendFormat:@&quot;Content-Type:&nbsp;image/png\r\n\r\n&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//声明结束符：--AaB03x--<br />&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*end=[[NSString&nbsp;alloc]initWithFormat:@&quot;\r\n%@&quot;,endMPboundary];<br />&nbsp;&nbsp;&nbsp;&nbsp;//声明myRequestData，用来放入http&nbsp;body<br />&nbsp;&nbsp;&nbsp;&nbsp;NSMutableData&nbsp;*myRequestData=[NSMutableData&nbsp;data];<br />&nbsp;&nbsp;&nbsp;&nbsp;//将body字符串转化为UTF8格式的二进制<br />&nbsp;&nbsp;&nbsp;&nbsp;[myRequestData&nbsp;appendData:[body&nbsp;dataUsingEncoding:NSUTF8StringEncoding]];<br />&nbsp;&nbsp;&nbsp;&nbsp;//将image的data加入<br />&nbsp;&nbsp;&nbsp;&nbsp;[myRequestData&nbsp;appendData:data];<br />&nbsp;&nbsp;&nbsp;&nbsp;//加入结束符--AaB03x--<br />&nbsp;&nbsp;&nbsp;&nbsp;[myRequestData&nbsp;appendData:[end&nbsp;dataUsingEncoding:NSUTF8StringEncoding]];<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//设置HTTPHeader中Content-Type的值<br />&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*content=[[NSString&nbsp;alloc]initWithFormat:@&quot;multipart/form-data;&nbsp;boundary=%@&quot;,TWITTERFON_FORM_BOUNDARY];<br />&nbsp;&nbsp;&nbsp;&nbsp;//设置HTTPHeader<br />&nbsp;&nbsp;&nbsp;&nbsp;[request&nbsp;setValue:content&nbsp;forHTTPHeaderField:@&quot;Content-Type&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;//设置Content-Length<br />&nbsp;&nbsp;&nbsp;&nbsp;[request&nbsp;setValue:[NSString&nbsp;stringWithFormat:@&quot;%lu&quot;,&nbsp;(unsigned&nbsp;long)[myRequestData&nbsp;length]]&nbsp;forHTTPHeaderField:@&quot;Content-Length&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;//设置http&nbsp;body<br />&nbsp;&nbsp;&nbsp;&nbsp;[request&nbsp;setHTTPBody:myRequestData];<br />&nbsp;&nbsp;&nbsp;&nbsp;//http&nbsp;method<br />&nbsp;&nbsp;&nbsp;&nbsp;[request&nbsp;setHTTPMethod:@&quot;POST&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;NSError&nbsp;*error;<br />&nbsp;&nbsp;&nbsp;&nbsp;NSData&nbsp;*resdata&nbsp;=&nbsp;[NSURLConnection&nbsp;sendSynchronousRequest:request&nbsp;returningResponse:nil&nbsp;error:&amp;error];<br />&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*string&nbsp;=&nbsp;[[NSString&nbsp;alloc]&nbsp;initWithData:resdata&nbsp;encoding:NSUTF8StringEncoding];<br />&nbsp;&nbsp;&nbsp;&nbsp;DLog(@&quot;%@&quot;,&nbsp;string);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;_errMsg&nbsp;=&nbsp;@&quot;&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;NSDictionary&nbsp;*jsonDataDict&nbsp;=&nbsp;[string&nbsp;JSONValue];<br />&nbsp;&nbsp;&nbsp;&nbsp;NSDictionary&nbsp;*jsonData&nbsp;=&nbsp;[jsonDataDict&nbsp;objectForKey:@&quot;status&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;NSNumber&nbsp;*code&nbsp;=&nbsp;[jsonData&nbsp;objectForKey:@&quot;code&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;([code&nbsp;intValue]&nbsp;==&nbsp;-1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;上传头像失败<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_errMsg&nbsp;=&nbsp;&nbsp;[jsonData&nbsp;objectForKey:@&quot;msg&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;上传头像成功<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSDictionary&nbsp;*jsonResult&nbsp;=&nbsp;&nbsp;[jsonDataDict&nbsp;objectForKey:@&quot;result&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*avatar&nbsp;=&nbsp;[jsonResult&nbsp;objectForKey:@&quot;avatar&quot;];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;avatar;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nil;<br /><br />}&nbsp;</pre>]]></description><category>手机开发</category><comments>http://camnpr.com/mobile-dev/1996.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=1996</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=1996&amp;key=76ef4554</trackback:ping></item></channel></rss>
