如何在Android上编写高效的Java代码 如何编写高效android代码

\u5982\u4f55\u5728Android\u4e0a\u7f16\u5199\u9ad8\u6548\u7684Java\u4ee3\u7801

\u65b9\u6cd5/\u6b65\u9aa41 \u9996\u5148\u6211\u4eec\u8981\u521b\u5efa\u4e00\u4e2aandroid\u9879\u76ee2 \u56e0\u4e3a\u9879\u76ee\u9700\u8981\u4f7f\u7528Unity\u63d0\u4f9b\u7684\u63a5\u53e3\uff0c\u6240\u4ee5\u9700\u8981\u5c06\u63a5\u53e3classes.jar\u5f15\u5165\u81f3\u5f53\u524d\u5de5\u7a0b\u4f46\u4e2d\u3002\u63a5\u53e3\u5305\u7684\u6240\u5728\u5730\uff0c\u6253\u5f00Finder->\u5e94\u7528\u7a0b\u5e8f->Unity->\u70b9\u51fbUnity\u56fe\u6807\uff0c\u9f20\u6807\u53f3\u952e\u9009\u62e9\u201c\u663e\u793a\u5305\u5185\u5bb9\u201d->Contents->PlaybackEngines->AndroidPlayer->bin->classes.jar \u3002\u63a5\u53e3\u5305\u5f15\u5165\u5de5\u7a0b\u540e\uff0c\u5f00\u59cb\u7f16\u5199JAVA\u4ee3\u7801\u30023 UnityTestActivity\u662f\u4e3bActivity\uff0cUnity\u7a0b\u5e8f\u4e00\u8d77\u52a8\u5c31\u4f1a\u8c03\u7528\u8fd9\u4e2aActivity\uff0c\u5b83\u662f\u5728AndroidManifest.xml\u4e2d\u914d\u7f6e\u7684\u3002\u5b83\u9700\u8981\u7ee7\u627fUnityPlayerActivity\uff0c\u7136\u800c\u5b83\u5c31\u662f\u521a\u521a\u6211\u4eec\u5f15\u5165\u7684classes.jar\u5305\u4e2d\u63d0\u4f9b\u7684\u63a5\u53e3\u7c7b\u3002UnityTestActivity\u5bf9\u5916\u63d0\u4f9b\u4e86\u4e24\u4e2a\u65b9\u6cd5\u63a5\u53e3\uff0cStartActivity0(String name) \u65b9\u6cd5\u4e0eStartActivity1(String name)\u65b9\u6cd5\uff0c\u8fd9\u4e24\u4e2a\u65b9\u6cd5\u662f\u5728Unity\u4e2d\u4f7f\u7528C#\u811a\u672c\u8c03\u7528\u7684\uff0c\u610f\u601d\u662f\u8c03\u7528\u540e\u7a0b\u5e8f\u5c06\u6253\u5f00\u4e00\u4e2a\u65b0\u7684Activity\uff0c\u53c2\u6570name\u4e5f\u662f\u7531C#\u811a\u672c\u4f20\u9012\u8fc7\u6765\u7684\uff0c\u63a5\u7740\u5c06\u4f20\u9012\u7684String\u53c2\u6570\u7ee7\u7eed\u4f20\u9012\u7ed9\u65b0\u6253\u5f00\u7684Activity\u30024 \u63a5\u4e0b\u6765\u5c31\u662f\u8bbe\u7f6exml\u6587\u4ef6\u548c\u5e03\u5c40\u6587\u4ef6\u4e86\u3002\u5bf9\u4e8e\u4f1aandroid\u7f16\u7a0b\u7684\u540c\u5b66\u5c31\u5f88\u719f\u6089\u4e86\u30025 \u628a\u5199\u597d\u7684java\u4ee3\u7801\u53d1\u5e03\u6210jar\u5305\u3002\u63a5\u4e0b\u6765\u5c31\u521b\u5efaunity\u5de5\u7a0b\uff0cUnity\u5de5\u7a0b\u4e2d\u6587\u4ef6\u5939\u7684\u7ed3\u6784\u5982\u4e0b\uff0cPlugins->Android\u7684\u540d\u79f0\u4e0d\u80fd\u4fee\u6539\uff0c\u5fc5\u9700\u4fdd\u6301\u4e00\u81f4\u3002\u63a5\u7740\u628aEclipse\u4e2dAndroid\u7684\u5de5\u7a0b\u6587\u4ef6\u62f7\u8d1d\u81f3\u8fd9\u91cc\uff0c\u9664\u4e86Android\u5de5\u7a0b\u4e2d\u7684src\u6587\u4ef6\u5939\uff0c\u5c06\u5176\u5b83\u6587\u4ef6\u5939\u5168\u90e8\u62f7\u8d1d\u81f3Plugins->Android\u6587\u4ef6\u5939\u4e2d\u3002\u6700\u540e\u5728Plugins->Android\u6587\u4ef6\u5939\u4e2d\u521b\u5efabin\u6587\u4ef6\u5939\uff0c\u7136\u540e\u5c06\u521a\u521a\u751f\u6210\u7684.jar\u6587\u4ef6\u62f7\u8d1d\u8fdb\u6765\uff0cjar\u7684\u540d\u79f0\u53ef\u4ee5\u968f\u4fbf\u4fee\u6539\uff0c\u4f46\u662fjar\u5305\u91cc\u9762\u5fc5\u987b\u662fcom->xys->\u4f60\u7684class\u6587\u4ef6\uff0c\u5426\u5219\u8fd0\u884c\u7a0b\u5e8f\u540e\u63d0\u793a\u627e\u4e0d\u5230\u7c7b\u6587\u4ef6\u30026 \u63a5\u4e0b\u6765\u5c31\u662f\u5982\u4f55\u5728C#\u4e2d\u8c03\u7528android\u7684\u65b9\u6cd5\u7684\u4ee3\u7801\u4e86\u3002\u52a0\u5165\u5982\u4e0b\u4ee3\u7801\u3002AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");jo.Call("StartActivity0","\u7b2c\u4e00\u4e2aActivity");\u5148\u5f97\u5230AndroidJavaClass\uff0c\u7136\u540e\u5f97\u5230AndroidjavaObject\u5c31\u662f\u5f53\u524dActivity\u7684\u5bf9\u8c61\uff0c\u4e5f\u5c31\u662f\u6211\u4eec\u5728\u4e0a\u9762\u521b\u5efa\u7684\u4e3bUnityTestActivity.JAVA\u3002\u62ff\u5230\u5b83\u7684\u5bf9\u8c61\u540e\u8c03\u7528jo.Call\uff08\uff09\u53c2\u65701\u8868\u793a\u8c03\u7528UnityTestActivity.JAVA\u7c7b\u4e2d\u7684\u65b9\u6cd5\u540d\u79f0\uff0c\u53c2\u65702\u8868\u793a\u8be5\u65b9\u6cd5\u4f20\u9012\u8fc7\u53bb\u7684\u53c2\u6570\u3002\u5982\u4e0b\u56fe\u6240\u793a\uff1a\u201c\u7b2c\u4e00\u4e2aActivity\u201d\u4e0e\u201c\u7b2c\u4e8c\u4e2aActivit\u201d\u5c31\u662f\u6211\u5728C#\u4e2d\u4f20\u9012\u8fc7\u53bb\u7684\u5b57\u7b26\u4e32\u30027 \u53d1\u5e03\u6210android\u5e73\u53f0apk

\u3000\u3000\u73b0\u4ee3\u7684\u624b\u6301\u8bbe\u5907\uff0c\u4e0e\u5176\u8bf4\u662f\u7535\u8bdd\uff0c\u66f4\u50cf\u4e00\u53f0\u62ff\u5728\u624b\u4e2d\u7684\u7535\u8111\u3002\u4f46\u662f\uff0c\u5373\u4f7f\u662f\u201c\u6700\u5feb\u201d\u7684\u624b\u6301\u8bbe\u5907\uff0c\u5176\u6027\u80fd\u4e5f\u8d76\u4e0d\u4e0a\u4e00\u53f0\u666e\u901a\u7684\u53f0\u5f0f\u7535\u8111\u3002

\u3000\u3000\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6211\u4eec\u5728\u4e66\u5199Android\u5e94\u7528\u7a0b\u5e8f\u7684\u65f6\u5019\u8981\u683c\u5916\u5173\u6ce8\u6548\u7387\u3002\u8fd9\u4e9b\u8bbe\u5907\u5e76\u6ca1\u6709\u90a3\u4e48\u5feb\uff0c\u5e76\u4e14\u53d7\u7535\u6c60\u7535\u91cf\u7684\u5236\u7ea6\u3002\u8fd9\u610f\u5473\u7740\uff0c\u8bbe\u5907\u6ca1\u6709\u66f4\u591a\u7684\u80fd\u529b\uff0c\u6211\u4eec\u5fc5\u987b\u628a\u7a0b\u5e8f\u5199\u7684\u5c3d\u91cf\u6709\u6548\u3002

\u3000\u3000\u672c\u6587\u8ba8\u8bba\u4e86\u5f88\u591a\u80fd\u8ba9\u5f00\u53d1\u8005\u4f7f\u4ed6\u4eec\u7684\u7a0b\u5e8f\u8fd0\u884c\u66f4\u6709\u6548\u7684\u65b9\u6cd5\uff0c\u9075\u7167\u8fd9\u4e9b\u65b9\u6cd5\uff0c\u4f60\u53ef\u4ee5\u4f7f\u4f60\u7684\u7a0b\u5e8f\u53d1\u6325\u6700\u5927\u7684\u6548\u529b\u3002

\u3000\u3000\u7b80\u4ecb

\u3000\u3000\u5bf9\u4e8e\u5360\u7528\u8d44\u6e90\u7684\u7cfb\u7edf\uff0c\u6709\u4e24\u6761\u57fa\u672c\u539f\u5219\uff1a

\u3000\u3000\u4e0d\u8981\u505a\u4e0d\u5fc5\u8981\u7684\u4e8b

\u3000\u3000\u4e0d\u8981\u5206\u914d\u4e0d\u5fc5\u8981\u7684\u5185\u5b58

\u3000\u3000\u6240\u6709\u4e0b\u9762\u7684\u5185\u5bb9\u90fd\u9075\u7167\u8fd9\u4e24\u4e2a\u539f\u5219\u3002

\u3000\u3000\u6709\u4e9b\u4eba\u53ef\u80fd\u9a6c\u4e0a\u4f1a\u8df3\u51fa\u6765\uff0c\u628a\u672c\u8282\u7684\u5927\u90e8\u5206\u5185\u5bb9\u5f52\u4e8e\u201c\u8349\u7387\u7684\u4f18\u5316\u201d\uff08xing:\u53c2\u89c1[The Root of All Evil]\uff09\uff0c\u4e0d\u53ef\u5426\u8ba4\u5fae\u4f18\u5316\uff08micro-optimization\u3002xing:\u4ee3\u7801\u4f18\u5316\uff0c\u76f8\u5bf9\u4e8e\u7ed3\u6784\u4f18\u5316\uff09\u7684\u786e\u4f1a\u5e26\u6765\u5f88\u591a\u95ee\u9898\uff0c\u8bf8\u5982\u65e0\u6cd5\u4f7f\u7528\u66f4\u6709\u6548\u7684\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u3002\u4f46\u662f\u5728\u624b\u6301\u8bbe\u5907\u4e0a\uff0c\u4f60\u522b\u65e0\u9009\u62e9\u3002\u5047\u5982\u4f60\u8ba4\u4e3aAndroid\u865a\u62df\u673a\u7684\u6027\u80fd\u4e0e\u53f0\u5f0f\u673a\u76f8\u5f53\uff0c\u4f60\u7684\u7a0b\u5e8f\u5f88\u6709\u53ef\u80fd\u4e00\u5f00\u59cb\u5c31\u5360\u7528\u4e86\u7cfb\u7edf\u7684\u5168\u90e8\u5185\u5b58\uff08xing:\u5185\u5b58\u5f88\u5c0f\uff09\uff0c\u8fd9\u4f1a\u8ba9\u4f60\u7684\u7a0b\u5e8f\u6162\u5f97\u50cf\u8717\u725b\u4e00\u6837\uff0c\u66f4\u9051\u8bba\u505a\u5176\u4ed6\u7684\u64cd\u4f5c\u4e86\u3002

\u3000\u3000Android\u7684\u6210\u529f\u4f9d\u8d56\u4e8e\u4f60\u7684\u7a0b\u5e8f\u63d0\u4f9b\u7684\u7528\u6237\u4f53\u9a8c\u3002\u800c\u8fd9\u79cd\u7528\u6237\u4f53\u9a8c\uff0c\u90e8\u5206\u4f9d\u8d56\u4e8e\u4f60\u7684\u7a0b\u5e8f\u662f\u54cd\u5e94\u5feb\u901f\u800c\u7075\u6d3b\u7684\uff0c\u8fd8\u662f\u54cd\u5e94\u7f13\u6162\u800c\u50f5\u5316\u7684\u3002\u56e0\u4e3a\u6240\u6709\u7684\u7a0b\u5e8f\u90fd\u8fd0\u884c\u5728\u540c\u4e00\u4e2a\u8bbe\u5907\u4e4b\u4e0a\uff0c\u90fd\u5728\u4e00\u8d77\uff0c\u8fd9\u5c31\u5982\u679c\u5728\u540c\u4e00\u6761\u8def\u4e0a\u884c\u9a76\u7684\u6c7d\u8f66\u3002\u800c\u8fd9\u7bc7\u6587\u6863\u5c31\u76f8\u5f53\u4e8e\u4f60\u5728\u53d6\u5f97\u9a7e\u7167\u4e4b\u524d\u5fc5\u987b\u8981\u5b66\u4e60\u7684\u4ea4\u901a\u89c4\u5219\u3002\u5982\u679c\u5927\u5bb6\u90fd\u6309\u7167\u8fd9\u4e9b\u89c4\u5219\u53bb\u505a\uff0c\u9a7e\u9a76\u5c31\u4f1a\u5f88\u987a\u7545\uff0c\u4f46\u662f\u5982\u679c\u4f60\u4e0d\u8fd9\u6837\u505a\uff0c\u4f60\u53ef\u80fd\u4f1a\u8f66\u6bc1\u4eba\u4ea1\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u8fd9\u4e9b\u539f\u5219\u5341\u5206\u91cd\u8981\u3002

\u3000\u3000\u5f53\u6211\u4eec\u5f00\u95e8\u89c1\u5c71\u3001\u76f4\u51fb\u4e3b\u9898\u4e4b\u524d\uff0c\u8fd8\u5fc5\u987b\u8981\u63d0\u9192\u5927\u5bb6\u4e00\u70b9\uff1a\u4e0d\u7ba1VM\u662f\u5426\u652f\u6301\u5b9e\u65f6\uff08JIT\uff09\u7f16\u8bd1\u5668\uff08xing:\u5b83\u5141\u8bb8\u5b9e\u65f6\u5730\u5c06Java\u89e3\u91ca\u578b\u7a0b\u5e8f\u81ea\u52a8\u7f16\u8bd1\u6210\u672c\u673a\u673a\u5668\u8bed\u8a00\uff0c\u4ee5\u4f7f\u7a0b\u5e8f\u6267\u884c\u7684\u901f\u5ea6\u66f4\u5feb\u3002\u6709\u4e9bJVM\u5305\u542bJIT\u7f16\u8bd1\u5668\u3002\uff09\uff0c\u4e0b\u9762\u63d0\u5230\u7684\u8fd9\u4e9b\u539f\u5219\u90fd\u662f\u6210\u7acb\u7684\u3002\u5047\u5982\u6211\u4eec\u6709\u76ee\u6807\u5b8c\u5168\u76f8\u540c\u7684\u4e24\u4e2a\u65b9\u6cd5\uff0c\u5728\u89e3\u91ca\u6267\u884c\u65f6foo()\u6bd4bar()\u5feb\uff0c\u90a3\u4e48\u7f16\u8bd1\u4e4b\u540e\uff0cfoo()\u4f9d\u7136\u4f1a\u6bd4bar()\u5feb\u3002\u6240\u4ee5\u4e0d\u8981\u5bc4\u5e0c\u671b\u4e8e\u7f16\u8bd1\u5668\u53ef\u4ee5\u62ef\u6551\u4f60\u7684\u7a0b\u5e8f\u3002

\u3000\u3000\u907f\u514d\u5efa\u7acb\u5bf9\u8c61

\u3000\u3000\u4e16\u754c\u4e0a\u6ca1\u6709\u514d\u8d39\u7684\u5bf9\u8c61\u3002\u867d\u7136GC\u4e3a\u6bcf\u4e2a\u7ebf\u7a0b\u90fd\u5efa\u7acb\u4e86\u4e34\u65f6\u5bf9\u8c61\u6c60\uff0c\u53ef\u4ee5\u4f7f\u521b\u5efa\u5bf9\u8c61\u7684\u4ee3\u4ef7\u53d8\u5f97\u5c0f\u4e00\u4e9b\uff0c\u4f46\u662f\u5206\u914d\u5185\u5b58\u6c38\u8fdc\u90fd\u6bd4\u4e0d\u5206\u914d\u5185\u5b58\u7684\u4ee3\u4ef7\u5927\u3002

\u3000\u3000\u5982\u679c\u4f60\u5728\u7528\u6237\u754c\u9762\u5faa\u73af\u4e2d\u5206\u914d\u5bf9\u8c61\u5185\u5b58\uff0c\u5c31\u4f1a\u5f15\u53d1\u5468\u671f\u6027\u7684\u5783\u573e\u56de\u6536\uff0c\u7528\u6237\u5c31\u4f1a\u89c9\u5f97\u754c\u9762\u50cf\u6253\u55dd\u4e00\u6837\u4e00\u987f\u4e00\u987f\u7684\u3002

\u3000\u3000\u6240\u4ee5\uff0c\u9664\u975e\u5fc5\u8981\uff0c\u5e94\u5c3d\u91cf\u907f\u514d\u5c3d\u529b\u5bf9\u8c61\u7684\u5b9e\u4f8b\u3002\u4e0b\u9762\u7684\u4f8b\u5b50\u5c06\u5e2e\u52a9\u4f60\u7406\u89e3\u8fd9\u6761\u539f\u5219\uff1a

\u3000\u3000\u5f53\u4f60\u4ece\u7528\u6237\u8f93\u5165\u7684\u6570\u636e\u4e2d\u622a\u53d6\u4e00\u6bb5\u5b57\u7b26\u4e32\u65f6\uff0c\u5c3d\u91cf\u4f7f\u7528substring\u51fd\u6570\u53d6\u5f97\u539f\u59cb\u6570\u636e\u7684\u4e00\u4e2a\u5b50\u4e32\uff0c\u800c\u4e0d\u662f\u4e3a\u5b50\u4e32\u53e6\u5916\u5efa\u7acb\u4e00\u4efd\u62f7\u8d1d\u3002\u8fd9\u6837\u4f60\u5c31\u6709\u4e00\u4e2a\u65b0\u7684String\u5bf9\u8c61\uff0c\u5b83\u4e0e\u539f\u59cb\u6570\u636e\u5171\u4eab\u4e00\u4e2achar\u6570\u7ec4\u3002
\u3000\u3000\u5982\u679c\u4f60\u6709\u4e00\u4e2a\u51fd\u6570\u8fd4\u56de\u4e00\u4e2aString\u5bf9\u8c61\uff0c\u800c\u4f60\u786e\u5207\u7684\u77e5\u9053\u8fd9\u4e2a\u5b57\u7b26\u4e32\u4f1a\u88ab\u9644\u52a0\u5230\u4e00\u4e2aStringBuffer\uff0c\u90a3\u4e48\uff0c\u8bf7\u6539\u53d8\u8fd9\u4e2a\u51fd\u6570\u7684\u53c2\u6570\u548c\u5b9e\u73b0\u65b9\u5f0f\uff0c\u76f4\u63a5\u628a\u7ed3\u679c\u9644\u52a0\u5230StringBuffer\u4e2d\uff0c\u800c\u4e0d\u8981\u518d\u5efa\u7acb\u4e00\u4e2a\u77ed\u547d\u7684\u4e34\u65f6\u5bf9\u8c61\u3002
\u3000\u3000\u4e00\u4e2a\u66f4\u6781\u7aef\u7684\u4f8b\u5b50\u662f\uff0c\u628a\u591a\u7ef4\u6570\u7ec4\u5206\u6210\u591a\u4e2a\u4e00\u7ef4\u6570\u7ec4\u3002

\u3000\u3000int\u6570\u7ec4\u6bd4Integer\u6570\u7ec4\u597d\uff0c\u8fd9\u4e5f\u6982\u62ec\u4e86\u4e00\u4e2a\u57fa\u672c\u4e8b\u5b9e\uff0c\u4e24\u4e2a\u5e73\u884c\u7684int\u6570\u7ec4\u6bd4(int,int)\u5bf9\u8c61\u6570\u7ec4\u6027\u80fd\u8981\u597d\u5f88\u591a\u3002\u540c\u7406\uff0c\u8fd9\u8bd5\u7528\u4e8e\u6240\u6709\u57fa\u672c\u7c7b\u578b\u7684\u7ec4\u5408\u3002
\u3000\u3000\u5982\u679c\u4f60\u60f3\u7528\u4e00\u79cd\u5bb9\u5668\u5b58\u50a8(Foo,Bar)\u5143\u7ec4\uff0c\u5c1d\u8bd5\u4f7f\u7528\u4e24\u4e2a\u5355\u72ec\u7684Foo[]\u6570\u7ec4\u548cBar[]\u6570\u7ec4\uff0c\u4e00\u5b9a\u6bd4(Foo,Bar)\u6570\u7ec4\u6548\u7387\u66f4\u9ad8\u3002\uff08\u4e5f\u6709\u4f8b\u5916\u7684\u60c5\u51b5\uff0c\u5c31\u662f\u5f53\u4f60\u5efa\u7acb\u4e00\u4e2aAPI\uff0c\u8ba9\u522b\u4eba\u8c03\u7528\u5b83\u7684\u65f6\u5019\u3002\u8fd9\u65f6\u5019\u4f60\u8981\u6ce8\u91cd\u5bf9API\u501f\u53e3\u7684\u8bbe\u8ba1\u800c\u727a\u7272\u4e00\u70b9\u513f\u901f\u5ea6\u3002\u5f53\u7136\u5728API\u7684\u5185\u90e8\uff0c\u4f60\u4ecd\u8981\u5c3d\u53ef\u80fd\u7684\u63d0\u9ad8\u4ee3\u7801\u7684\u6548\u7387\uff09

\u3000\u3000\u603b\u4f53\u6765\u8bf4\uff0c\u5c31\u662f\u907f\u514d\u521b\u5efa\u77ed\u547d\u7684\u4e34\u65f6\u5bf9\u8c61\u3002\u51cf\u5c11\u5bf9\u8c61\u7684\u521b\u5efa\u5c31\u80fd\u51cf\u5c11\u5783\u573e\u6536\u96c6\uff0c\u8fdb\u800c\u51cf\u5c11\u5bf9\u7528\u6237\u4f53\u9a8c\u7684\u5f71\u54cd\u3002

\u3000\u3000\u4f7f\u7528\u672c\u5730\u65b9\u6cd5

\u3000\u3000\u5f53\u4f60\u5728\u5904\u7406\u5b57\u4e32\u7684\u65f6\u5019\uff0c\u4e0d\u8981\u541d\u60dc\u4f7f\u7528String.indexOf(), String.lastIndexOf()\u7b49\u7279\u6b8a\u5b9e\u73b0\u7684\u65b9\u6cd5\uff08specialty methods\uff09\u3002\u8fd9\u4e9b\u65b9\u6cd5\u90fd\u662f\u4f7f\u7528C/C++\u5b9e\u73b0\u7684\uff0c\u6bd4\u8d77Java\u5faa\u73af\u5feb10\u5230100\u500d\u3002

\u3000\u3000\u4f7f\u7528\u5b9e\u7c7b\u6bd4\u63a5\u53e3\u597d

\u3000\u3000\u5047\u8bbe\u4f60\u6709\u4e00\u4e2aHashMap\u5bf9\u8c61\uff0c\u4f60\u53ef\u4ee5\u5c06\u5b83\u58f0\u660e\u4e3aHashMap\u6216\u8005Map:

\u3000\u3000Map myMap1 = new HashMap();HashMap myMap2 = new HashMap();
\u3000\u3000\u54ea\u4e2a\u66f4\u597d\u5462\uff1f

\u3000\u3000\u6309\u7167\u4f20\u7edf\u7684\u89c2\u70b9Map\u4f1a\u66f4\u597d\u4e9b\uff0c\u56e0\u4e3a\u8fd9\u6837\u4f60\u53ef\u4ee5\u6539\u53d8\u4ed6\u7684\u5177\u4f53\u5b9e\u73b0\u7c7b\uff0c\u53ea\u8981\u8fd9\u4e2a\u7c7b\u7ee7\u627f\u81eaMap\u63a5\u53e3\u3002\u4f20\u7edf\u7684\u89c2\u70b9\u5bf9\u4e8e\u4f20\u7edf\u7684\u7a0b\u5e8f\u662f\u6b63\u786e\u7684\uff0c\u4f46\u662f\u5b83\u5e76\u4e0d\u9002\u5408\u5d4c\u5165\u5f0f\u7cfb\u7edf\u3002\u8c03\u7528\u4e00\u4e2a\u63a5\u53e3\u7684\u5f15\u7528\u4f1a\u6bd4\u8c03\u7528\u5b9e\u4f53\u7c7b\u7684\u5f15\u7528\u591a\u82b1\u8d39\u4e00\u500d\u7684\u65f6\u95f4\u3002

\u3000\u3000\u5982\u679cHashMap\u5b8c\u5168\u9002\u5408\u4f60\u7684\u7a0b\u5e8f\uff0c\u90a3\u4e48\u4f7f\u7528Map\u5c31\u6ca1\u6709\u4ec0\u4e48\u4ef7\u503c\u3002\u5982\u679c\u6709\u4e9b\u5730\u65b9\u4f60\u4e0d\u80fd\u786e\u5b9a\uff0c\u5148\u907f\u514d\u4f7f\u7528Map\uff0c\u5269\u4e0b\u7684\u4ea4\u7ed9IDE\u63d0\u4f9b\u7684\u91cd\u6784\u529f\u80fd\u597d\u4e86\u3002(\u5f53\u7136\u516c\u5171API\u662f\u4e00\u4e2a\u4f8b\u5916\uff1a\u4e00\u4e2a\u597d\u7684API\u5e38\u5e38\u4f1a\u727a\u7272\u4e00\u4e9b\u6027\u80fd\uff09

\u3000\u3000\u7528\u9759\u6001\u65b9\u6cd5\u6bd4\u865a\u65b9\u6cd5\u597d

\u3000\u3000\u5982\u679c\u4f60\u4e0d\u9700\u8981\u8bbf\u95ee\u4e00\u4e2a\u5bf9\u8c61\u7684\u6210\u5458\u53d8\u91cf\uff0c\u90a3\u4e48\u8bf7\u628a\u65b9\u6cd5\u58f0\u660e\u6210static\u3002\u865a\u65b9\u6cd5\u6267\u884c\u7684\u66f4\u5feb\uff0c\u56e0\u4e3a\u5b83\u53ef\u4ee5\u88ab\u76f4\u63a5\u8c03\u7528\u800c\u4e0d\u9700\u8981\u4e00\u4e2a\u865a\u51fd\u6570\u8868\u3002\u53e6\u5916\u4f60\u4e5f\u53ef\u4ee5\u901a\u8fc7\u58f0\u660e\u4f53\u73b0\u51fa\u8fd9\u4e2a\u51fd\u6570\u7684\u8c03\u7528\u4e0d\u4f1a\u6539\u53d8\u5bf9\u8c61\u7684\u72b6\u6001\u3002

\u3000\u3000\u4e0d\u7528getter\u548csetter

\u3000\u3000\u5728\u5f88\u591a\u672c\u5730\u8bed\u8a00\u5982C++\u4e2d\uff0c\u90fd\u4f1a\u4f7f\u7528getter\uff08\u6bd4\u5982\uff1ai = getCount()\uff09\u6765\u907f\u514d\u76f4\u63a5\u8bbf\u95ee\u6210\u5458\u53d8\u91cf\uff08i = mCount\uff09\u3002\u5728C++\u4e2d\u8fd9\u662f\u4e00\u4e2a\u975e\u5e38\u597d\u7684\u4e60\u60ef\uff0c\u56e0\u4e3a\u7f16\u8bd1\u5668\u80fd\u591f\u5185\u8054\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u9700\u8981\u7ea6\u675f\u6216\u8c03\u8bd5\u53d8\u91cf\uff0c\u4f60\u53ef\u4ee5\u5728\u4efb\u4f55\u65f6\u5019\u6dfb\u52a0\u4ee3\u7801\u3002

\u3000\u3000\u5728Android\u4e0a\uff0c\u8fd9\u5c31\u4e0d\u662f\u4e2a\u597d\u4e3b\u610f\u4e86\u3002\u865a\u65b9\u6cd5\u7684\u5f00\u9500\u6bd4\u76f4\u63a5\u8bbf\u95ee\u6210\u5458\u53d8\u91cf\u5927\u5f97\u591a\u3002\u5728\u901a\u7528\u7684\u63a5\u53e3\u5b9a\u4e49\u4e2d\uff0c\u53ef\u4ee5\u4f9d\u7167OO\u7684\u65b9\u5f0f\u5b9a\u4e49getters\u548csetters\uff0c\u4f46\u662f\u5728\u4e00\u822c\u7684\u7c7b\u4e2d\uff0c\u4f60\u5e94\u8be5\u76f4\u63a5\u8bbf\u95ee\u53d8\u91cf\u3002

\u3000\u3000\u5c06\u6210\u5458\u53d8\u91cf\u7f13\u5b58\u5230\u672c\u5730

\u3000\u3000\u8bbf\u95ee\u6210\u5458\u53d8\u91cf\u6bd4\u8bbf\u95ee\u672c\u5730\u53d8\u91cf\u6162\u5f97\u591a\uff0c\u4e0b\u9762\u4e00\u6bb5\u4ee3\u7801\uff1a

\u3000\u3000for (int i = 0; i < this.mCount; i++)dumpItem(this.mItems[i]);
\u3000\u3000\u518d\u597d\u6539\u6210\u8fd9\u6837\uff1a

\u3000\u3000int count = this.mCount;Item[] items = this.mItems; for (int i = 0; i < count; i++)dumpItems(items[i]);
\u3000\u3000\uff08\u4f7f\u7528"this"\u662f\u4e3a\u4e86\u8868\u660e\u8fd9\u4e9b\u662f\u6210\u5458\u53d8\u91cf\uff09

\u3000\u3000\u53e6\u4e00\u4e2a\u76f8\u4f3c\u7684\u539f\u5219\u662f\uff1a\u6c38\u8fdc\u4e0d\u8981\u5728for\u7684\u7b2c\u4e8c\u4e2a\u6761\u4ef6\u4e2d\u8c03\u7528\u4efb\u4f55\u65b9\u6cd5\u3002\u5982\u4e0b\u9762\u65b9\u6cd5\u6240\u793a\uff0c\u5728\u6bcf\u6b21\u5faa\u73af\u7684\u65f6\u5019\u90fd\u4f1a\u8c03\u7528getCount()\u65b9\u6cd5\uff0c\u8fd9\u6837\u505a\u6bd4\u4f60\u5728\u4e00\u4e2aint\u5148\u628a\u7ed3\u679c\u4fdd\u5b58\u8d77\u6765\u5f00\u9500\u5927\u5f88\u591a\u3002

\u3000\u3000for (int i = 0; i < this.getCount(); i++)dumpItems(this.getItem(i));
\u3000\u3000\u540c\u6837\u5982\u679c\u4f60\u8981\u591a\u6b21\u8bbf\u95ee\u4e00\u4e2a\u53d8\u91cf\uff0c\u4e5f\u6700\u597d\u5148\u4e3a\u5b83\u5efa\u7acb\u4e00\u4e2a\u672c\u5730\u53d8\u91cf\uff0c\u4f8b\u5982\uff1a

\u3000\u3000protected void drawHorizontalScrollBar(Canvas canvas, int width, int height) {if (isHorizontalScrollBarEnabled()) {int size = mScrollBar.getSize(false);if (size <= 0) {size = mScrollBarSize;}mScrollBar.setBounds(0, height - size, width, height);mScrollBar.setParams(computeHorizontalScrollRange(),computeHorizontalScrollOffset(),computeHorizontalScrollExtent(), false);mScrollBar.draw(canvas);}}

\u3000\u3000\u8fd9\u91cc\u67094\u6b21\u8bbf\u95ee\u6210\u5458\u53d8\u91cfmScrollBar\uff0c\u5982\u679c\u5c06\u5b83\u7f13\u5b58\u5230\u672c\u5730\uff0c4\u6b21\u6210\u5458\u53d8\u91cf\u8bbf\u95ee\u5c31\u4f1a\u53d8\u62104\u6b21\u6548\u7387\u66f4\u9ad8\u7684\u6808\u53d8\u91cf\u8bbf\u95ee\u3002

\u3000\u3000\u53e6\u5916\u5c31\u662f\u65b9\u6cd5\u7684\u53c2\u6570\u4e0e\u672c\u5730\u53d8\u91cf\u7684\u6548\u7387\u76f8\u540c\u3002

\u3000\u3000\u4f7f\u7528\u5e38\u91cf

\u3000\u3000\u8ba9\u6211\u4eec\u6765\u770b\u770b\u8fd9\u4e24\u6bb5\u5728\u7c7b\u524d\u9762\u7684\u58f0\u660e\uff1a

\u3000\u3000static int intVal = 42;static String strVal = "Hello, world!";
\u3000\u3000\u5fc5\u4ee5\u5176\u4f1a\u751f\u6210\u4e00\u4e2a\u53eb\u505a\u7684\u521d\u59cb\u5316\u7c7b\u7684\u65b9\u6cd5\uff0c\u5f53\u7c7b\u7b2c\u4e00\u6b21\u88ab\u4f7f\u7528\u7684\u65f6\u5019\u8fd9\u4e2a\u65b9\u6cd5\u4f1a\u88ab\u6267\u884c\u3002\u65b9\u6cd5\u4f1a\u5c0642\u8d4b\u7ed9intVal\uff0c\u7136\u540e\u628a\u4e00\u4e2a\u6307\u5411\u7c7b\u4e2d\u5e38\u91cf\u8868\u7684\u5f15\u7528\u8d4b\u7ed9strVal\u3002\u5f53\u4ee5\u540e\u8981\u7528\u5230\u8fd9\u4e9b\u503c\u7684\u65f6\u5019\uff0c\u4f1a\u5728\u6210\u5458\u53d8\u91cf\u8868\u4e2d\u67e5\u627e\u5230\u4ed6\u4eec\u3002

\u3000\u3000\u4e0b\u9762\u6211\u4eec\u505a\u4e9b\u6539\u8fdb\uff0c\u4f7f\u7528\u201cfinal"\u5173\u952e\u5b57\uff1a

\u3000\u3000static final int intVal = 42;static final String strVal = "Hello, world!";
\u3000\u3000\u73b0\u5728\uff0c\u7c7b\u4e0d\u518d\u9700\u8981\u65b9\u6cd5\uff0c\u56e0\u4e3a\u5728\u6210\u5458\u53d8\u91cf\u521d\u59cb\u5316\u7684\u65f6\u5019\uff0c\u4f1a\u5c06\u5e38\u91cf\u76f4\u63a5\u4fdd\u5b58\u5230\u7c7b\u6587\u4ef6\u4e2d\u3002\u7528\u5230intVal\u7684\u4ee3\u7801\u88ab\u76f4\u63a5\u66ff\u6362\u621042\uff0c\u800c\u4f7f\u7528strVal\u7684\u4f1a\u6307\u5411\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e38\u91cf\uff0c\u800c\u4e0d\u662f\u4f7f\u7528\u6210\u5458\u53d8\u91cf\u3002

\u3000\u3000\u5c06\u4e00\u4e2a\u65b9\u6cd5\u6216\u7c7b\u58f0\u660e\u4e3a"final"\u4e0d\u4f1a\u5e26\u6765\u6027\u80fd\u7684\u63d0\u5347\uff0c\u4f46\u662f\u4f1a\u5e2e\u52a9\u7f16\u8bd1\u5668\u4f18\u5316\u4ee3\u7801\u3002\u4e3e\u4f8b\u8bf4\uff0c\u5982\u679c\u7f16\u8bd1\u5668\u77e5\u9053\u4e00\u4e2a"getter"\u65b9\u6cd5\u4e0d\u4f1a\u88ab\u91cd\u8f7d\uff0c\u90a3\u4e48\u7f16\u8bd1\u5668\u4f1a\u5bf9\u5176\u91c7\u7528\u5185\u8054\u8c03\u7528\u3002

\u3000\u3000\u4f60\u4e5f\u53ef\u4ee5\u5c06\u672c\u5730\u53d8\u91cf\u58f0\u660e\u4e3a"final"\uff0c\u540c\u6837\uff0c\u8fd9\u4e5f\u4e0d\u4f1a\u5e26\u6765\u6027\u80fd\u7684\u63d0\u5347\u3002\u4f7f\u7528"final"\u53ea\u80fd\u4f7f\u672c\u5730\u53d8\u91cf\u770b\u8d77\u6765\u66f4\u6e05\u6670\u4e9b\uff08\u4f46\u662f\u4e5f\u6709\u4e9b\u65f6\u5019\u8fd9\u662f\u5fc5\u987b\u7684\uff0c\u6bd4\u5982\u5728\u4f7f\u7528\u533f\u540d\u5185\u90e8\u7c7b\u7684\u65f6\u5019\uff09\uff08xing:\u539f\u6587\u662f or you have to, e.g. for use in an anonymous inner class\uff09

\u3000\u3000\u8c28\u614e\u4f7f\u7528foreach

\u3000\u3000foreach\u53ef\u4ee5\u7528\u5728\u5b9e\u73b0\u4e86Iterable\u63a5\u53e3\u7684\u96c6\u5408\u7c7b\u578b\u4e0a\u3002foreach\u4f1a\u7ed9\u8fd9\u4e9b\u5bf9\u8c61\u5206\u914d\u4e00\u4e2aiterator\uff0c\u7136\u540e\u8c03\u7528 hasNext()\u548cnext()\u65b9\u6cd5\u3002\u4f60\u6700\u597d\u4f7f\u7528foreach\u5904\u7406ArrayList\u5bf9\u8c61\uff0c\u4f46\u662f\u5bf9\u5176\u4ed6\u96c6\u5408\u5bf9\u8c61\uff0cforeach\u76f8\u5f53\u4e8e\u4f7f\u7528 iterator\u3002

\u3000\u3000\u4e0b\u9762\u5c55\u793a\u4e86foreach\u4e00\u79cd\u53ef\u63a5\u53d7\u7684\u7528\u6cd5\uff1a

\u3000\u3000public class Foo {int mSplat;static Foo mArray[] = new Foo[27]; public static void zero() {int sum = 0;for (int i = 0; i < mArray.length; i++) {sum += mArray[i].mSplat;}} public static void one() {int sum = 0;Foo[] localArray = mArray;int len = localArray.length;for (int i = 0; i < len; i++) {sum += localArray[i].mSplat;}} public static void two() {int sum = 0;for (Foo a: mArray) {sum += a.mSplat;}}}

\u3000\u3000\u5728zero()\u4e2d\uff0c\u6bcf\u6b21\u5faa\u73af\u90fd\u4f1a\u8bbf\u95ee\u4e24\u6b21\u9759\u6001\u6210\u5458\u53d8\u91cf\uff0c\u53d6\u5f97\u4e00\u6b21\u6570\u7ec4\u7684\u957f\u5ea6\u3002

\u3000\u3000retrieves the static field twice and gets the array length once for every iteration through the loop.

\u3000\u3000\u5728one()\u4e2d\uff0c\u5c06\u6240\u6709\u6210\u5458\u53d8\u91cf\u5b58\u50a8\u5230\u672c\u5730\u53d8\u91cf\u3002 pulls everything out into local variables, avoiding the lookups.

\u3000\u3000two()\u4f7f\u7528\u4e86\u5728java1.5\u4e2d\u5f15\u5165\u7684foreach\u8bed\u6cd5\u3002\u7f16\u8bd1\u5668\u4f1a\u5c06\u5bf9\u6570\u7ec4\u7684\u5f15\u7528\u548c\u6570\u7ec4\u7684\u957f\u5ea6\u4fdd\u5b58\u5230\u672c\u5730\u53d8\u91cf\u4e2d\uff0c\u8fd9\u5bf9\u8bbf\u95ee\u6570\u7ec4\u5143\u7d20\u975e\u5e38\u597d\u3002\u4f46\u662f\u7f16\u8bd1\u5668\u8fd8\u4f1a\u5728\u6bcf\u6b21\u5faa\u73af\u4e2d\u4ea7\u751f\u4e00\u4e2a\u989d\u5916\u7684\u5bf9\u672c\u5730\u53d8\u91cf\u7684\u5b58\u50a8\u64cd\u4f5c\uff08\u5bf9\u53d8\u91cfa\u7684\u5b58\u53d6\uff09\u8fd9\u6837\u4f1a\u6bd4one()\u591a\u51fa4\u4e2a\u5b57\u8282\uff0c\u901f\u5ea6\u8981\u7a0d\u5fae\u6162\u4e00\u4e9b\u3002

\u3000\u3000\u7efc\u4e0a\u6240\u8ff0\uff1aforeach\u8bed\u6cd5\u5728\u8fd0\u7528\u4e8earray\u65f6\u6027\u80fd\u5f88\u597d\uff0c\u4f46\u662f\u8fd0\u7528\u4e8e\u5176\u4ed6\u96c6\u5408\u5bf9\u8c61\u65f6\u8981\u5c0f\u5fc3\uff0c\u56e0\u4e3a\u5b83\u4f1a\u4ea7\u751f\u989d\u5916\u7684\u5bf9\u8c61\u3002

\u3000\u3000\u907f\u514d\u4f7f\u7528\u679a\u4e3e

\u3000\u3000\u679a\u4e3e\u53d8\u91cf\u975e\u5e38\u65b9\u4fbf\uff0c\u4f46\u4e0d\u5e78\u7684\u662f\u5b83\u4f1a\u727a\u7272\u6267\u884c\u7684\u901f\u5ea6\u548c\u5e76\u5927\u5e45\u589e\u52a0\u6587\u4ef6\u4f53\u79ef\u3002\u4f8b\u5982\uff1a

\u3000\u3000public class Foo {public enum Shrubbery { GROUND, CRAWLING, HANGING }}

\u3000\u3000\u4f1a\u4ea7\u751f\u4e00\u4e2a900\u5b57\u8282\u7684.class\u6587\u4ef6(Foo$Shubbery.class)\u3002\u5728\u5b83\u88ab\u9996\u6b21\u8c03\u7528\u65f6\uff0c\u8fd9\u4e2a\u7c7b\u4f1a\u8c03\u7528\u521d\u59cb\u5316\u65b9\u6cd5\u6765\u51c6\u5907\u6bcf\u4e2a\u679a\u4e3e\u53d8\u91cf\u3002\u6bcf\u4e2a\u679a\u4e3e\u9879\u90fd\u4f1a\u88ab\u58f0\u660e\u6210\u4e00\u4e2a\u9759\u6001\u53d8\u91cf\uff0c\u5e76\u88ab\u8d4b\u503c\u3002\u7136\u540e\u5c06\u8fd9\u4e9b\u9759\u6001\u53d8\u91cf\u653e\u5728\u4e00\u4e2a\u540d\u4e3a"$VALUES"\u7684\u9759\u6001\u6570\u7ec4\u53d8\u91cf\u4e2d\u3002\u800c\u8fd9\u4e48\u4e00\u5927\u5806\u4ee3\u7801\uff0c\u4ec5\u4ec5\u662f\u4e3a\u4e86\u4f7f\u7528\u4e09\u4e2a\u6574\u6570\u3002

\u3000\u3000\u8fd9\u6837:

\u3000\u3000Shrubbery shrub = Shrubbery.GROUND;\u4f1a\u5f15\u8d77\u4e00\u4e2a\u5bf9\u9759\u6001\u53d8\u91cf\u7684\u5f15\u7528\uff0c\u5982\u679c\u8fd9\u4e2a\u9759\u6001\u53d8\u91cf\u662ffinal int\uff0c\u90a3\u4e48\u7f16\u8bd1\u5668\u4f1a\u76f4\u63a5\u5185\u8054\u8fd9\u4e2a\u5e38\u6570\u3002

\u3000\u3000\u4e00\u65b9\u9762\u8bf4\uff0c\u4f7f\u7528\u679a\u4e3e\u53d8\u91cf\u53ef\u4ee5\u8ba9\u4f60\u7684API\u66f4\u51fa\u8272\uff0c\u5e76\u80fd\u63d0\u4f9b\u7f16\u8bd1\u65f6\u7684\u68c0\u67e5\u3002\u6240\u4ee5\u5728\u901a\u5e38\u7684\u65f6\u5019\u4f60\u6beb\u65e0\u7591\u95ee\u5e94\u8be5\u4e3a\u516c\u5171API\u9009\u62e9\u679a\u4e3e\u53d8\u91cf\u3002\u4f46\u662f\u5f53\u6027\u80fd\u65b9\u9762\u6709\u6240\u9650\u5236\u7684\u65f6\u5019\uff0c\u4f60\u5c31\u5e94\u8be5\u907f\u514d\u8fd9\u79cd\u505a\u6cd5\u4e86\u3002

\u3000\u3000\u6709\u4e9b\u60c5\u51b5\u4e0b\uff0c\u4f7f\u7528ordinal()\u65b9\u6cd5\u83b7\u53d6\u679a\u4e3e\u53d8\u91cf\u7684\u6574\u6570\u503c\u4f1a\u66f4\u597d\u4e00\u4e9b\uff0c\u4e3e\u4f8b\u6765\u8bf4\uff0c\u5c06\uff1a

\u3000\u3000for (int n = 0; n < list.size(); n++) {if (list.items[n].e == MyEnum.VAL_X)// do stuff 1else if (list.items[n].e == MyEnum.VAL_Y)// do stuff 2}

\u3000\u3000\u66ff\u6362\u4e3a:

\u3000\u3000int valX = MyEnum.VAL_X.ordinal();int valY = MyEnum.VAL_Y.ordinal();int count = list.size();MyItem items = list.items(); for (int n = 0; n < count; n++){int valItem = items[n].e.ordinal(); if (valItem == valX)// do stuff 1else if (valItem == valY)// do stuff 2}

\u3000\u3000\u4f1a\u4f7f\u6027\u80fd\u5f97\u5230\u4e00\u4e9b\u6539\u5584\uff0c\u4f46\u8fd9\u5e76\u4e0d\u662f\u6700\u7ec8\u7684\u89e3\u51b3\u4e4b\u9053\u3002

\u3000\u3000\u5c06\u4e0e\u5185\u90e8\u7c7b\u4e00\u540c\u4f7f\u7528\u7684\u53d8\u91cf\u58f0\u660e\u5728\u5305\u8303\u56f4\u5185

\u3000\u3000\u8bf7\u770b\u4e0b\u9762\u7684\u7c7b\u5b9a\u4e49\uff1a

\u3000\u3000public class Foo {private int mValue; public void run() {Inner in = new Inner();mValue = 27;in.stuff();} private void doStuff(int value) {System.out.println("Value is " + value);} private class Inner {void stuff() {Foo.this.doStuff(Foo.this.mValue);}}}

\u3000\u3000\u8fd9\u5176\u4e2d\u7684\u5173\u952e\u662f\uff0c\u6211\u4eec\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5185\u90e8\u7c7b(Foo$Inner)\uff0c\u5b83\u9700\u8981\u8bbf\u95ee\u5916\u90e8\u7c7b\u7684\u79c1\u6709\u57df\u53d8\u91cf\u548c\u51fd\u6570\u3002\u8fd9\u662f\u5408\u6cd5\u7684\uff0c\u5e76\u4e14\u4f1a\u6253\u5370\u51fa\u6211\u4eec\u5e0c\u671b\u7684\u7ed3\u679c"Value is 27"\u3002

\u3000\u3000\u95ee\u9898\u662f\u5728\u6280\u672f\u4e0a\u6765\u8bb2\uff08\u5728\u5e55\u540e\uff09Foo$Inner\u662f\u4e00\u4e2a\u5b8c\u5168\u72ec\u7acb\u7684\u7c7b\uff0c\u5b83\u8981\u76f4\u63a5\u8bbf\u95eeFoo\u7684\u79c1\u6709\u6210\u5458\u662f\u975e\u6cd5\u7684\u3002\u8981\u8de8\u8d8a\u8fd9\u4e2a\u9e3f\u6c9f\uff0c\u7f16\u8bd1\u5668\u9700\u8981\u751f\u6210\u4e00\u7ec4\u65b9\u6cd5\uff1a

\u3000\u3000static int Foo.access$100(Foo foo) {return foo.mValue;}static void Foo.access$200(Foo foo, int value) {foo.doStuff(value);}

\u3000\u3000\u5185\u90e8\u7c7b\u5728\u6bcf\u6b21\u8bbf\u95ee"mValue"\u548c"doStuff"\u65b9\u6cd5\u65f6\uff0c\u90fd\u4f1a\u8c03\u7528\u8fd9\u4e9b\u9759\u6001\u65b9\u6cd5\u3002\u5c31\u662f\u8bf4\uff0c\u4e0a\u9762\u7684\u4ee3\u7801\u8bf4\u660e\u4e86\u4e00\u4e2a\u95ee\u9898\uff0c\u4f60\u662f\u5728\u901a\u8fc7\u63a5\u53e3\u65b9\u6cd5\u8bbf\u95ee\u8fd9\u4e9b\u6210\u5458\u53d8\u91cf\u548c\u51fd\u6570\u800c\u4e0d\u662f\u76f4\u63a5\u8c03\u7528\u5b83\u4eec\u3002\u5728\u524d\u9762\u6211\u4eec\u5df2\u7ecf\u8bf4\u8fc7\uff0c\u4f7f\u7528\u63a5\u53e3\u65b9\u6cd5\uff08getter\u3001setter\uff09\u6bd4\u76f4\u63a5\u8bbf\u95ee\u901f\u5ea6\u8981\u6162\u3002\u6240\u4ee5\u8fd9\u4e2a\u4f8b\u5b50\u5c31\u662f\u5728\u7279\u5b9a\u8bed\u6cd5\u4e0b\u9762\u4ea7\u751f\u7684\u4e00\u4e2a\u201c\u9690\u6027\u7684\u201d\u6027\u80fd\u969c\u788d\u3002

\u3000\u3000\u901a\u8fc7\u5c06\u5185\u90e8\u7c7b\u8bbf\u95ee\u7684\u53d8\u91cf\u548c\u51fd\u6570\u58f0\u660e\u7531\u79c1\u6709\u8303\u56f4\u6539\u4e3a\u5305\u8303\u56f4\uff0c\u6211\u4eec\u53ef\u4ee5\u907f\u514d\u8fd9\u4e2a\u95ee\u9898\u3002\u8fd9\u6837\u505a\u53ef\u4ee5\u8ba9\u4ee3\u7801\u8fd0\u884c\u66f4\u5feb\uff0c\u5e76\u4e14\u907f\u514d\u4ea7\u751f\u989d\u5916\u7684\u9759\u6001\u65b9\u6cd5\u3002\uff08\u9057\u61be\u7684\u662f\uff0c\u8fd9\u4e9b\u57df\u548c\u65b9\u6cd5\u53ef\u4ee5\u88ab\u540c\u4e00\u4e2a\u5305\u5185\u7684\u5176\u4ed6\u7c7b\u76f4\u63a5\u8bbf\u95ee\uff0c\u8fd9\u4e0e\u7ecf\u5178\u7684OO\u539f\u5219\u76f8\u8fdd\u80cc\u3002\u56e0\u6b64\u5f53\u4f60\u8bbe\u8ba1\u516c\u5171API\u7684\u65f6\u5019\u5e94\u8be5\u8c28\u614e\u4f7f\u7528\u8fd9\u6761\u4f18\u5316\u539f\u5219\uff09

\u3000\u3000\u907f\u514d\u4f7f\u7528\u6d6e\u70b9\u6570

\u3000\u3000\u5728\u5954\u817eCPU\u51fa\u73b0\u4e4b\u524d\uff0c\u6e38\u620f\u8bbe\u8ba1\u8005\u505a\u5f97\u6700\u591a\u7684\u5c31\u662f\u6574\u6570\u8fd0\u7b97\u3002\u968f\u7740\u5954\u817e\u7684\u5230\u6765\uff0c\u6d6e\u70b9\u8fd0\u7b97\u5904\u7406\u5668\u6210\u4e3a\u4e86CPU\u5185\u7f6e\u7684\u7279\u6027\uff0c\u6d6e\u70b9\u548c\u6574\u6570\u914d\u5408\u4f7f\u7528\uff0c\u80fd\u591f\u8ba9\u4f60\u7684\u6e38\u620f\u8fd0\u884c\u5f97\u66f4\u987a\u7545\u3002\u901a\u5e38\u5728\u684c\u9762\u7535\u8111\u4e0a\uff0c\u4f60\u53ef\u4ee5\u968f\u610f\u7684\u4f7f\u7528\u6d6e\u70b9\u8fd0\u7b97\u3002

\u3000\u3000\u4f46\u662f\u975e\u5e38\u9057\u61be\uff0c\u5d4c\u5165\u5f0f\u5904\u7406\u5668\u901a\u5e38\u6ca1\u6709\u652f\u6301\u6d6e\u70b9\u8fd0\u7b97\u7684\u786c\u4ef6\uff0c\u6240\u6709\u5bf9"float"\u548c"double"\u7684\u8fd0\u7b97\u90fd\u662f\u901a\u8fc7\u8f6f\u4ef6\u5b9e\u73b0\u7684\u3002\u4e00\u4e9b\u57fa\u672c\u7684\u6d6e\u70b9\u8fd0\u7b97\uff0c\u751a\u81f3\u9700\u8981\u6beb\u79d2\u7ea7\u7684\u65f6\u95f4\u624d\u80fd\u5b8c\u6210\u3002

\u3000\u3000\u751a\u81f3\u662f\u6574\u6570\uff0c\u4e00\u4e9b\u82af\u7247\u6709\u5bf9\u4e58\u6cd5\u7684\u786c\u4ef6\u652f\u6301\u800c\u7f3a\u5c11\u5bf9\u9664\u6cd5\u7684\u652f\u6301\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6574\u6570\u7684\u9664\u6cd5\u548c\u53d6\u6a21\u8fd0\u7b97\u4e5f\u662f\u6709\u8f6f\u4ef6\u6765\u5b8c\u6210\u7684\u3002\u6240\u4ee5\u5f53\u4f60\u5728\u4f7f\u7528\u54c8\u5e0c\u8868\u6216\u8005\u505a\u5927\u91cf\u6570\u5b66\u8fd0\u7b97\u65f6\u4e00\u5b9a\u8981\u5c0f\u5fc3\u8c28\u614e\u3002

Java平台一般有三个版本:Java ME(微型版,用于某些手机)、Java SE(标准版,用于台式电脑)、Java EE(企业版,用于服务器端应用)。在谈到Java时,我们通常是指Java SE,因为只有这个版本包含虚拟机和编译器。

首先,Java代码会被编译成称为字节码的中间格式。当字节码在目标电脑上运行时,虚拟机会快速将它解析成目标电脑硬件和操作系统所需要的本机格式。

除了为开发者提供“一次编写,到处运行”的优势,Java还能通过垃圾回收器(GC)实现自动内存管理,开发者可免去手动在代码中释放无用对象的内存。虽然这个功能非常有用,且大大降低了在代码中引入内存问题的风险,但是它会增加运行时的开销,因为需要不停地执行垃圾回收进程。

本文开头将比较Java SE和用于Android开发的Java之间的差异。首先我会介绍开发者习惯的Java
SE语言结构以及它们是如何在Android上运行的。其次,我会介绍如何优化Android中的Java代码,如何优化内存分配,以及如何恰当地处理多线程。

比较Android上的Dalvik Java和Java SE

虽然远在Android出现之前,开发者就能用Java编程语言为移动设备编写应用程序,但它只是Java中功能极为有限的一个版本,称为Java
ME(微型版)。不同的移动设备还需编写不同的代码,因此,写一个应用程序就能在支持Java
ME的任何手机上运行是几乎不可能的。此外,由于当时不存在很好的在线商店,应用发布过程极其复杂。

Android的问世为开发者提供了构建智能手机强大应用的机会,开发者只需用Java编程语言以及他们熟知的标准Java
API编写代码。然而,尽管Android开发者仍使用Java SE编译器来编译应用程序,你会发现,James
Gosling开发的Java和Android设备上的Java存在许多不同之处。

在Android设备上运行的VM(虚拟机)称为Dalvik。它最初由谷歌的Dan
Bornstein开发,适用于CPU和内存受限的移动设备。Java SE和Dalvik Java存在一些差异,主要体现在虚拟机上。Java
SE使用了栈机设计,而Dalvik被设计成了基于寄存器的机器。Android SDK中有一个dx工具,它会把Java
SE栈机器的字节码转换成基于寄存器的Dalvik机器字节码,该转换步骤由IDE自动完成。

基于栈的虚拟机和基于寄存器的虚拟机的定义以及差异将不列入我们的讨论范围。由于历史原因,Android使用基于寄存器的虚拟机。虽然基于寄存器的虚拟机最多可以比基于栈的虚拟机快32%,但这只限于执行时解释字节码的虚拟机(也就是说,解释型虚拟机)。在Android
2.2版本(也称为Froyo)之前,Dalvik虚拟机都是纯解释型的。Froyo版本引入了JIT编译器(即时编译),这是Java
SE很早就有的一个优势。

JIT编译,也称为动态翻译。它在执行前把字节码翻译成本机代码(如图1所示),这样主要有两个好处。首先,它消除了那些纯解释型虚拟机的开销;其次,它能对本机代码执行优化,这通常是静态编译代码无法做到的。例如,JIT编译器可以在它运行的CPU上选择最合适的优化,也可以根据应用程序的输入来分析代码是如何运行的,以便进行下一步的优化。

图1 Android Java和Java SE翻译步骤

虽然Android的Dalvik JIT编译器有很大的发展前景,但要达到如Java SE的JIT编译器般稳定、成熟度尚需很长一段时间。不过,Dalvik JIT的出现为Android提供了巨大的性能优势,而且它也在不断得以改善。

JAVA
SE虚拟机和Dalvik虚拟机的另一个区别是,后者进行了优化,可运行在同一个机器上的多个实例中。它在开机时会启动一个叫做zygote的进程,该进程会创建第一个Dalvik实例,由这个实例创建所有其他的实例。当应用程序启动时,zygote进程会收到一个创建新虚拟机实例的请求,并给该应用程序创建一个新进程(如图2所示)。如果开发者已习惯于Java

SE开发,这样的设计可能看起来不切实际,但它有一个很大的优势,可以避免由一个应用程序运行失败导致Dalvik虚拟机崩溃,继而引发多应用程序崩溃。

图2 在Android中启动新Dalvik虚拟机实例

Android和Java
SE除了运行的虚拟机不同之外,它们实现API的方式也不一样。Android中属于java和javax包中的API都来自Apache
Harmony(这是一个开源项目,旨在重新实现Java SE软件栈,该项目从2011年11月不再维护)。在开发方面,这些API和Java
SE包中的类似,但也存在一些差别。例如,谷歌对HttpUrlConnection类进行了Java SE版本中所没有的重大升级。

此外,Android平台移除了Java
SE中无关的API。例如,Swing/AWT包被完全移除,因为Android使用不同的UI框架。其他被移除的API还有RMI、CORBA、ImageIO和JMX。它们或者被替换为特定的Android版本(在android包空间内),或者因为一些实际原因根本不存在。

优化Android上的Java代码

经过多年的改进,Java
SE具备了一些简化编写复杂代码结构的新特性。其中的一些特性会让整个流程变得更简单,但开发者需要了解何时以及如何正确地使用它们。另外,由于Java

SE大多用于服务器端开发(使用Java企业版的API),因而开发人员专门对服务器端Java代码进行了优化。注解和Java虚拟机对脚本语言的支持就是对服务器端开发进行优化的例证。虽然这些工具在构建后端开发时很强大,但在开发Android客户端代码时,这些特性的作用很小,甚至起反作用。Java开发者已经习惯于无限量的RAM和CPU,而Android开发需要密切关注性能和内存分配。简单地说,开发者需要使用稍微不同的方法对待Android和后端的开发。

然而,随着Android的首次发布,情况有所改变。曾经一些在Android上尽量不用的Java规范重新被推荐,这主要因为Android目前的JIT编译器解决了这些规范导致的性能问题。

本文将讨论编写Android应用程序需要了解的Java代码。我们不会深究Java编程语言的细节,而是重点关注对Android开发重要的东西。不过,开发者仍需了解,大多数适用于Java SE的规则和建议同样适用于Android和Dalvik虚拟机。

Android上的类型安全枚举

Java SE 5.0新增了许多方便开发者的新特性。其中最值得期待的是引入了类型安全枚举。枚举在代码中用来表示属于某一组的几个选择。在早期版本的Java中,可以用多个整型常量解决这个问题。虽然这在技术上可行,但是很容易出错。请看下面的代码:
public class Machine {
public static final int STOPPED = 10;
public static final int INITIALIZING = 20;
public static final int STARTING = 30;
public static final int RUNNING = 40;
public static final int STOPPING = 50;
public static final int CRASHED = 60;
private int mState;

public Machine() {
mState = STOPPED;
}

public int getState() {
return mState;
}

public void setState(int state) {
mState = state;
}
}

问题是,虽然这些常量是期望的,但是没有机制保证setState()方法接收不同的值。如果要在设置方法中添加检查,那么一旦得到的是非预期值,开发者就需要处理错误。开发者所需要的是在编译时检查非法赋值。类型安全的枚举解决了这个问题,如下所示:
public class Machine {
public enum State {
STOPPED, INITIALIZING, STARTING, RUNNING, STOPPING, CRASHED
}
private State mState;

public Machine() {
mState = State.STOPPED;
}

public State getState() {
return mState;
}

public void setState(State state) {
mState = state;
}
}

注意在声明不同类型安全值的地方新加的内部枚举类。这在编译时就会解决非法赋值的问题,所以代码更不容易出错。

如果Dalvik虚拟机还没有JIT编译器优化代码,不建议在Android平台上使用枚举类型,因为和使用整型常量相比,这种设计带来的内存和性能损失更大。这就是为什么在一些老版本的Android

API中还存在如此多的整型常量的原因。如今有了更强的JIT编译器以及一个不断改进的Dalvik虚拟机,开发者不必再担心这个问题,放心大胆地使用类型安全枚举即可。

然而,仍然存在一些情况使用整型常量是更好的选择。像int这样的Java基本类型,不会增加GC的开销。此外,Android SDK中许多已有的API仍然依赖基本类型,比如Handler类——在这种情况下,你没有太多的选择。

Android中增强版的for循环

Java SE 5.0还引入了增强版的for循环,提供了一个通用的缩写表达式来遍历集合和数组。首先,比较以下五种方法:
void loopOne(String[] names) {
int size = names.length;
for (int i = 0; i < size; i++) {
printName(names[i]);
}
}

void loopTwo(String[] names) {
for (String name : names) {
printName(name);
}
}

void loopThree(Collection<String> names) {
for (String name : names) {
printName(name);
}
}

void loopFour(Collection<String> names) {
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
printName(iterator.next());
}
}

// 不要在ArrayList上使用增强版的for循环
void loopFive(ArrayList<String> names) {
int size = names.size();
for (int i = 0; i < size; i++) {
printName(names.get(i));
}
}

上面显示了四种不同遍历集合和数组的方式。前面两种有着相同的性能,所以如果只是读取元素的话,可以放心地对数组使用增强版for循环。对Collection对象来说,增强版for循环和使用迭代器遍历元素有着相同的性能。ArrayList对象应避免使用增强版for循环。

如果不仅需要遍历元素,而且需要元素的位置,就一定要使用数组或者ArrayList,因为所有其他Collection类在这些情况下会更慢。

一般情况下,如果在读取元素几乎不变的数据集时对性能要求很高,建议使用常规数组。然而,数组的大小固定,添加数据会影响性能,所以编写代码时要考虑所有因素。

队列、同步和锁

通常情况下,应用程序会在一个线程中生产数据,在另一个线程中使用它们。常见的例子是在一个线程中获取网络上的数据,在另一个线程(操作UI的主线程)中把这些数据展现给用户。这种模式称为生产者/消费者模式,在面向对象编程课程中,开发者用算法来实现该模式可能要花上几个小时。下面会介绍一些简化生产者/消费者模式实现的现成类。

1. 更智能的队列

虽然已有现成的类并能用更少的代码实现该功能,但许多Java开发者仍然选择使用LinkedList以及同步块实现队列功能。开发者可在java.util.concurrent包中找到同步相关的类。此外,本包还包含信号量、锁以及对单个变量进行原子操作的类。考虑下面使用标准的LinkedList实现线程安全队列的代码。
public class ThreadSafeQueue {
private LinkedList<String> mList = new LinkedList<String>();
private final Object mLock = new Object();

public void offer(String value) {
synchronized (mLock) {
mList.offer(value);
mLock.notifyAll();
}
}

public synchronized String poll() {
synchronized (mLock) {
while (mList.isEmpty()) {
try {
mLock.wait();
} catch (InterruptedException e) {
//简洁起见忽略异常处理
}
}
return mList.poll();
}
}
}

虽然这段代码是正确的,并有可能在考试中得满分,但实现和测试这样一段代码只是在浪费时间。实际上,所有前面的代码可用下面一行代替。
LinkedBlockingQueue<String> blockingQueue =
new LinkedBlockingQueue<String>();

上面的一行代码能像前面的例子一样提供相同类型的阻塞队列,甚至能提供额外的线程安全操作。java.util.concurrent包含许多可选的队列以及并发映射类,所以,一般情况下,建议使用它们,而不是像之前的示例那样使用更多代码。

2. 更智能的锁

Java提供的synchronized关键字允许开发者创建线程安全的方法和代码块。synchronized关键字易于使用,也很容易滥用,对性能造成负面影响。当需要区分读数据和写数据时,synchronized关键字并不是最有效的。幸好,java.util.concurrent.locks包中的工具类对这种情况提供了很好的支持。
public class ReadWriteLockDemo {
private final ReentrantReadWriteLock mLock;
private String mName;
private int mAge;
private String mAddress;

public ReadWriteLockDemo() {
mLock = new ReentrantReadWriteLock();
}

public void setPersonData(String name, int age, String address) {
ReentrantReadWriteLock.WriteLock writeLock = mLock.writeLock();
try {
writeLock.lock();
mName = name;
mAge = age;
mAddress = address;
} finally {
writeLock.unlock();
}
}

public String getName() {
ReentrantReadWriteLock.ReadLock readLock = mLock.readLock();
try {
readLock.lock();
return mName;
} finally {
readLock.unlock();
}
}

// 重复代码不再赘述
}

上面的代码展示了在什么地方使用ReentrantReadWriteLock,它允许多个并发线程对数据进行只读访问,并确保同一时间只有一个线程写入相同的数据。

在代码中使用synchronized关键字仍然是处理锁问题的有效方法,但无论何种情况下,都要考虑ReentrantReadWriteLock是否是

  • 濡備綍浼樺寲 Android Studio 鍚姩,缂栬瘧鍜岃繍琛岄熷害
    绛旓細棣栧厛浣犺鎵惧埌鍘熷洜锛屽叾鍘熷洜鍒嗕负涓ゅぇ鍧楋細涓銆佺‖浠舵柟闈細鐢佃剳纭欢閰嶇疆涓嶉珮锛岃繖涓槸鍐冲畾鎬х殑锛屽喅瀹氫簡Android Studio鐨勫惎鍔紝缂栬瘧鍜岃繍琛岄熷害鍙兘鍦ㄤ竴瀹氬尯闂村唴鎻愬崌锛涗簩銆佽蒋浠舵柟闈細涓嬭浇鐨凙ndroid Studio鐗堟湰涓庝綘鐨勭數鑴戜笉鑳藉畬缇庡吋瀹硅繍琛屻傝В鍐冲姙娉曪細涓銆侀鍏堢湅鐢佃剳閰嶇疆濡備綍锛氬彲鍙傝傾ndroid Studio瀹樼綉涓枃鐗堢殑浠嬬粛锛...
  • Android 鍥剧墖鍔犺浇(涓)楂樻晥鍔犺浇Bitmap 鍩虹绡
    绛旓細鍦ㄥ涔濡備綍楂樻晥鍦板姞杞紹itmap涔嬪墠锛岄鍏堜粙缁嶄竴涓嬪浣曞姞杞戒竴涓狟itmap銆傛垜浠兘鐭ラ亾锛孊itmap鍦ˋndroid涓氬父鎸囩殑鏄竴寮犲浘鐗囷紝閭d箞濡備綍灏咼PG銆丳NG绛夋牸寮忕殑鍥剧墖杞崲鎴怋itmap瀵硅薄鍛紵BitmapFactory绫荤粰鎴戜滑鎻愪緵浜嗕竴浜涙柟娉曪細鎺ヤ笅鏉ュ紑濮嬩粙缁嶅浣曢珮鏁堝湴鍔犺浇Bitmap锛屽叾瀹炴牳蹇冩濇兂寰堢畝鍗曪細 灏辨槸閲囩敤BitmapFactory.Options...
  • 鎬庢牱鎵嶈兘楂樻晥瀛﹀ソAndroid寮鍙?
    绛旓細4銆佸涔犱竴闂ㄥ悗绔瑷锛屾瘮濡俻hp鎴栬匤ava绛夈傚洜涓烘垜浠湪瀹為檯鍋氬畨鍗撻」鐩殑鏃跺欙紝涓嶄粎瑕缂栧啓瀹夊崜鍓嶇鐨勪笢瑗匡紝鏈夌殑鏃跺欎篃闇瑕佸仛涓浜涘悗鍙帮紝鑰岃繖浜涘悗鍙版垜浠彲鑳戒細閲囩敤涓浜涘悗绔瑷鍘诲仛锛屾瘮濡傛垜浠彲浠ヤ娇鐢╬hp璇█寰堣交鏉剧殑寮鍙戝嚭瀹夊崜绠$悊鐨勫悗鍙般傞氳繃浠ヤ笂4鐐规柟娉曪紝瀹夊崜鐨勫紑鍙戝涔犱汉鍛樺氨鍙互鏇楂樻晥鐨勫涔Android浜嗐傛帴涓嬫潵...
  • 濡備綍楂樻晥瀛︿範Android鍔ㄧ敾
    绛旓細鍏充簬鍦ㄥ疄闄呭伐浣滀腑甯哥敤鎴栬呬細鎺ヨЕ鍒扮殑 Android Animation 澶ф鍙互鍒嗘垚浠ヤ笅鍑犵锛1. View Animation 杩欑灞炰簬鏈甯镐娇鐢ㄧ殑鍔ㄧ敾涔嬩竴锛屼緥濡 View Slide, Fade In/Out, Parallax Effect 绛夌瓑 2. Activity Transition 甯歌浜 Activity 杩涘叆鎴栬呰烦鍑烘椂鐨勫姩鐢伙紝姣斿鍚姩涓涓 Activity锛 浠庝晶闈㈡粦鍏ャ鍦 Android 4.4...
  • APP娴嬭瘯浠庣敤渚嬪眰闈㈠紑濮濡備綍鑳藉灏嗘暣涓繃绋嬭繘琛屽湴鏇村姞楂樻晥鍏ㄩ潰?
    绛旓細鍦ㄦ祴璇曡涓氬凡缁忓骞翠簡锛屼綘鐨勯偅浜涢棶棰樺浜庢柊浜烘潵璇寸殑纭粡甯稿彂鐢熺殑銆傛棤闈炲氨鏄彁楂樻祴璇曟晥鐜囷紝绉疮娴嬭瘯缁忛獙涓婇潰銆傚湪娴嬭瘯涓婁负浜嗛伩鍏嶉仐婕忥紝浣犻渶瑕佸舰鎴愪竴涓綋绯诲紡鐨勬祦绋嬶紝鍔熻兘閬嶅巻銆傛瘮濡傝瀹夊崜鐨勬祴璇曪紝鍦ㄨ璁$敤渚嬬殑鏃跺欒鐗瑰埆娉ㄦ剰浠ヤ笅鍑犱釜鏂归潰锛欰PP瑕嗙洊瀹夎銆佺綉缁滃垏鎹佸垎杈ㄧ巼鐨勯傞厤銆佸畨鍗撴墜鏈鸿嚜甯︾殑鐗╃悊閿佽鍏朵粬绋嬪簭...
  • Android搴旂敤鎬ц兘浼樺寲鐨勫唴瀹圭畝浠
    绛旓細浠婂ぉ鐨Android搴旂敤寮鍙戣呯粡甯歌鎯冲敖鍔炴硶鏉ユ彁鍗囩▼搴忔ц兘銆傜敱浜庡簲鐢ㄨ秺鏉ヨ秺澶嶆潅锛岃繖涓棶棰樹篃鍙樺緱瓒婃潵瓒婃鎵嬨傛湰涔︿富瑕佷粙缁濡備綍蹇楂樻晥鍦颁紭鍖栧簲鐢紝璁╁簲鐢ㄥ彉寰楃ǔ瀹氶珮鏁堛備綘灏嗗浼氬埄鐢ˋndroid SDK鍜孨DK鏉ユ贩鍚堟垨鍗曠嫭浣跨敤Java銆丆/C++鏉ュ紑鍙戝簲鐢ㄣ備功涓繕鐗瑰埆璁茶В浜嗗涓嬪唴瀹癸細 路 涓浜汷penGL鐨勪紭鍖栨妧鏈互鍙奟enderScript锛...
  • 瀹夊崜寮鍙瑕佹眰鏈夊摢浜涘畨鍗撳紑鍙戣姹
    绛旓細寮鍙戝畨鍗撴墜鏈篴pp闇瑕佺殑鎶鏈湁鍝簺锛熷紑鍙戜笉鍚岀被鍨嬬殑App闇瑕佺敤鍒板摢浜涙妧鏈紵WebApp锛歩OS/Android鐨勫唴缃祻瑙堝櫒鏄熀浜巜ebkit鍐呮牳鐨勶紝鎵浠ュ湪寮鍙憌ebApp鏃讹紝澶氭暟浣跨敤html鎴杊tml5銆丆SS3銆丣avaScript鎶鏈仛UI甯冨眬锛屼娇鍏跺湪缃戠珯椤甸潰涓婂疄鐜颁紶缁熺殑C锛廠鏋舵瀯杞欢鍔熻兘锛屾湇鍔$鎶鏈敤java銆乸hp銆丄SP銆傜幇鍦ㄤ篃鏈夊緢澶氫竴閿敓鎴恮ebApp...
  • 濡備綍楂樻晥鍦拌緭鍑篿OS鍜Android鏍囨敞鍜屽垏鍥
    绛旓細浜庢槸鑷繁灏鍐浜嗕釜灏忓伐鍏枫傜敤浜庝竴閿敓鎴愭墍闇瑕佺殑鍥剧墖銆傞鍏堟槸Android鐨勫垏鍥剧敓鎴愬伐鍏枫傛闈笂鏈夎繖鏍蜂竴寮犲浘鐗囨墦寮宸ュ叿锛岄夋嫨璇ュ浘鐗囨墍鍦ㄧ洰褰曘傝寰楀厛鎶婃簮鍥剧墖鍏堝懡鍚嶅ソ锛屽洜涓鸿绋嬪簭浼氳嚜鍔ㄥ懡鍚嶅叾涓2鍊嶏紝1鍊嶇瓑銆傛槸鐩稿浜android涓 mdpi鑰岃█鐨勩 濡傛灉鏄痻hdpi鐨勫浘鐗囷紝灏辨槸2鍊嶃傞夊ソ鏂囦欢澶逛箣鍚庯紝鐐瑰嚮寮濮嬬敓鎴愬湪鐩爣...
  • 鍙蹭笂鏈濂界敤鐨Android鍏ㄩ噺鐗堟湰鏇存柊搴揦Update浣跨敤鎸囧崡
    绛旓細鍙蹭笂鏈寮Android鍏ㄩ噺鏇存柊搴揦Update锛氬叏闈㈡寚鍗</ 闈㈠涓嶅悓椤圭洰鍜屽钩鍙扮殑缁熶竴鏇存柊闅鹃锛孹Update浣滀负涓娆捐交閲忕骇妗嗘灦锛屼互鍏朵綆鑰﹀悎銆侀珮鍙敤鎬ц劚棰栬屽嚭銆傚畠鐨勭洰鏍囨槸绠鍖栫増鏈洿鏂版祦绋嬶紝鍛婂埆鍐椾綑浠g爜鐨缂栧啓銆俋Update鐨勫己澶у姛鑳芥兜鐩栧涓狝ndroid鐗堟湰锛屽寘鎷潤榛樺拰鑷姩鏇存柊锛屼互鍙婂浗闄呭寲鐨勬敮鎸侊紝鍚屾椂杩樻彁渚涗簡涓板瘜鐨凙PI鎺ュ彛鍜岃嚜...
  • 濡備綍楂樻晥鍦拌緭鍑篿OS鍜Android鏍囨敞鍜屽垏鍥
    绛旓細鐜板湪鏈夊緢澶氫骇鍝佷负浜嗛檷浣庤璁℃垚鏈苟淇濇寔澶氬钩鍙颁綋楠岀殑涓鑷存э紝閮戒互iOS涓轰富鍋氫竴濂椾氦浜掕璁★紝搴旂敤浜巌OS鍜Android涓や釜骞冲彴銆備絾鏄湪鏍囨敞涓庡垏鍥剧殑鐜妭锛濡備綍楂樻晥鐨勪笌寮鍙戝鎺ワ紝浼间箮骞舵病鏈変粈涔堟洿楂樻槑鐨勫姙娉曘傚緢澶氬洟闃熺殑鍋氭硶鏄厛鍋氫竴濂梚OS鐨刄I+鏍囨敞+鍒囧浘锛屽啀鍦╥OS鐨勫熀纭涓婄缉鏀句竴濂桝ndroid鐨刄I+鏍囨敞+鍒囧浘銆備簨瀹炰笂...
  • 扩展阅读:苹果android怎么设置 ... android系统怎么打开 ... android苹果版下载 ... android入门基础知识 ... 苹果手机android在哪打开 ... android下载安装app ... 苹果android怎么打开 ... 平板android系统下载 ... android在哪里打开 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网