在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ 一些很棒的點(diǎn)子
Launch mode 和 Intent flags專題
Canvas & Drawables
UTAustinX_UT.9.01x: Effective Thinking Through Mathematics
《JavaScript 語言精粹》
Memory leak專題
React基礎(chǔ)
《Test Driven Development: By Example》一書
Developer tools
安卓開發(fā)技能樹
<a rel="nofollow" href="https://mp.weixin.qq.com/s?__biz=MzA3NDM
Best Practices for Interaction and Engagement
各個(gè)安卓版本引入的主要新特性
Building Apps with Connectivity &amp; the Cloud
List.toArray()再強(qiáng)轉(zhuǎn)是一定會(huì)失敗的
深入Android frameworks
Google dev 100 days系列視頻
Building Apps with Contacts &amp; Sign-In
關(guān)系型數(shù)據(jù)庫設(shè)計(jì)范式
《App研發(fā)錄》一書
REST API設(shè)計(jì)
Google IO 2015摘要
自定義View/ViewGroup以及高性能實(shí)現(xiàn)自定義UI
安卓系統(tǒng)點(diǎn)擊事件處理
《50 Android Hacks》一書
Building Apps with Content Sharing
Flux基礎(chǔ)
<a rel="nofollow" href="http://developer.android.com/training/in
依賴注入(以Dagger 2為例)
Java同步機(jī)制
Java對象內(nèi)存的使用情況
JSR133(Java memory model)
Google官方Material Design手冊(<a rel="nofollow" href="http://develop
Futurice公司安卓團(tuán)隊(duì)的建議
安卓性能優(yōu)化
  • 1.
Best Practices for Performance
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
<a rel="nofollow" href="http://blog.danlew.net/2014/11/19/styles
Handling Runtime Changes
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
Building Apps with Graphics &amp; Animation
<a rel="nofollow" href="http://tools.android.com/tech-docs/new-b
Android項(xiàng)目架構(gòu)
MVP(Model-View-Presenter)模式
<a rel="nofollow" href="http://www.infoq.com/cn/es6-in-depth/"">
《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》一書
Rx在Android中的最佳實(shí)踐
函數(shù)調(diào)用時(shí),傳遞參數(shù)應(yīng)該是不可變的(Immutable)
ProGuard
面向?qū)ο罅笤瓌t(SOLID+)
深入理解Java虛擬機(jī)
深入Java深淺拷貝、immutable、unmodifiable
Best Practices for User Input
UI上的一些高效方式/最佳實(shí)踐
<a rel="nofollow" href="https://blog.stylingandroid.com/ripples-
Best Practices for User Interface
安卓測試驅(qū)動(dòng)開發(fā)/安卓測試驗(yàn)證
暗時(shí)間:學(xué)會(huì)正確思考
技術(shù)筆記
Aspect Oriented Programming(AOP)
Best Practices for Background Jobs
安卓系統(tǒng)動(dòng)效專題
Feed系統(tǒng)的設(shè)計(jì)
Data binding(MVVM,Model-View-ViewModel)
Effective Java一書筆記
<a rel="nofollow" href="http://developer.android.com/training/in
Rx (Reactive eXtention)
MultiDex專題
一些很棒的點(diǎn)子
WebRTC

一些很棒的點(diǎn)子

系統(tǒng)API

  • 自Android 5.0之后,用戶的“最近任務(wù)”(recent tasks)視圖,可以自定義了,支持自定義圖標(biāo)、標(biāo)題、頂欄色彩;參考:developers,blog;
  • 全新的Android編譯系統(tǒng):Jack & Jill
  • 使用LinearLayout的divider屬性,設(shè)置為shape drawable,控制其子元素之間的間距
  • 使用wedget,在桌面上顯示內(nèi)容。示例
  • Android 5.0引入TextView的CSS樣式fontFeatureSettings
  • 利用Action Intent盡可能利用用戶手機(jī)上已有的APP功能,還不需要相關(guān)的權(quán)限
  • TextView的高級玩法:CompoundDrawable,shadow,Typeface自定義字體,Shader,HTML渲染(支持自定義tag)、Span(SpannableString:字符級別、段落級別、對其),自定義Span(立式分?jǐn)?shù)、彩虹效果、彩虹動(dòng)效、可點(diǎn)擊URL、Emoji...),用xml定義drawable動(dòng)畫

    http://wiki.jikexueyuan.com/project/notes/images/AdvancedTextView.png" alt="AdvancedTextView.png" />

  • Android integration of multiple icon providers such as FontAwesome, Entypo, Typicons,...
  • Shape Drawable:形狀、圓角、邊框、填充、漸變色填充等
  • View繪制時(shí)加上特效:Shader,圖像渲染、線性漸變、環(huán)形漸變、掃描漸變、組合漸變
  • 安卓系統(tǒng)的“售貨亭模式”
    • 只允許用戶在一個(gè)應(yīng)用程序內(nèi)使用,不能接收到系統(tǒng)通知,狀態(tài)欄,退出程序,類似于ATM機(jī),只能使用一個(gè)應(yīng)用程序。
    • 5.0:設(shè)置菜單內(nèi)Screen pinning mode;startLockTask();
    • pre 5.0:
      • 自啟動(dòng):監(jiān)聽啟動(dòng)事件android.intent.action.BOOT_COMPLETED,隨系統(tǒng)啟動(dòng)APP;
      • 監(jiān)聽返回鍵,并且不返回;
      • manifest文件啟動(dòng)activity添加三個(gè)category:android.intent.category.HOME、android.intent.category.LAUNCHER、android.intent.category.DEFAULT;
      • 電源鍵:只在4.0以下的系統(tǒng)可以達(dá)到效果
        @Override  
        public void onAttachedToWindow() {  
          getWindow().addFlags(  
              WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);  
          getWindow().addFlags(  
              WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);  
        }
      • 系統(tǒng)對話框:監(jiān)聽失去焦點(diǎn)事件,然后發(fā)廣播關(guān)掉所有系統(tǒng)對話框
        @Override  
        public void onWindowFocusChanged(boolean hasFocus) {  
        super.onWindowFocusChanged(hasFocus);  
        if(!hasFocus) {  
          Intent closeDialog =   
                new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);  
          sendBroadcast(closeDialog);  
        }  
        }  
      • 虛擬鍵盤
      • 狀態(tài)欄:全屏、TYPE_SYSTEM_ALERT、截取狀態(tài)欄區(qū)域的點(diǎn)擊事件
  • onResumeFragments
    • FragmentActivity的子類(AppCompatActivity等)均有此lifecycle方法
    • FragmentActivity的onResume函數(shù)調(diào)用的時(shí)候,所有的Fragment都還沒有onResume,Activity并不能保證保存的狀態(tài)已被恢復(fù),而在這種情況下,是不能進(jìn)行fragment的transaction的,而在onResumeFragments則能保證調(diào)用的時(shí)候activity已經(jīng)恢復(fù)了狀態(tài)
    • read more
  • 使用ViewPager的同時(shí)不用Fragment作為顯示的內(nèi)容
  • Notification中加入聯(lián)系人信息之后,通知消息的顯示將有更高的優(yōu)先級
  • xml中使用tools屬性來輔助IDE預(yù)覽
    • xml需要預(yù)覽的內(nèi)容,統(tǒng)統(tǒng)用tools:屬性,否則會(huì)有運(yùn)行時(shí)開銷,參考
    • 輔助lint:類似于@SuppressWarnings(tools:ignore),@TargetApi(tools:targetApi),指定locale(tools:locale)
    • 輔助預(yù)覽layout:tool:context, tools:showIn, tools:menu, tools:actionBarNavMode, 指定frament的layout(tools:layout),tools:listheader/listitem/listfooter
    • Support Annotations: @Nullable/NonNull, resources ids(), range, collection size, TypeDef, Thread(MainThread/UiThread/BinderThread/WorkerThread), "Architecture"(CallSuper/CheckResult/VisibleForTesting), Permission{ RequiresPermission(Manifest.permission.BLUTOOTH) }, proguard(Keep)
    • ViewDebug: @ViewDebug.ExportedProperty
  • Percent layout library

    • 為什么要有Percent?
      • LinearLayout的layout_weight屬性可以實(shí)現(xiàn)按需+比例分配空間,但是當(dāng)相對定位與比例分配都需要使用的時(shí)候,就不得不使用兩層Layout來實(shí)現(xiàn)了,有損性能;另注:當(dāng)LinearLayout只有一個(gè)子View使用layout_weight屬性時(shí),將需要按比例分配的長/寬屬性置為0,可以提高性能,因?yàn)閘ayout_weight被使用時(shí)會(huì)有兩遍measure,而如果置為0,使用layout_weight的子View第一遍measure就可以省略。
      • 嵌套的layout_weight使用將會(huì)導(dǎo)致性能下降,指數(shù)級
    • PercentRelativeLayout/PercentFrameLayout
    • 應(yīng)該還是會(huì)需要兩次measure,還是應(yīng)該盡力避免嵌套Percent,此外,減少Layout的層數(shù)是一個(gè)常識
    • 例子

      <android.support.percent.PercentRelativeLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
      
        <View
          android:id="@+id/first"
          android:background="@color/sa_green_dark"
          app:layout_heightPercent="50%"
          app:layout_marginLeftPercent="25%"
          app:layout_marginTopPercent="25%"
          app:layout_widthPercent="50%" />
      
        <View
          android:layout_width="0dp"
          android:layout_height="32dp"
          android:layout_alignLeft="@id/first"
          android:layout_alignStart="@id/first"
          android:layout_alignRight="@id/first"
          android:layout_alignEnd="@id/first"
          android:layout_below="@id/first"
          android:layout_marginTop="8dp"
          android:background="@color/light_grey" />
      
      </android.support.percent.PercentRelativeLayout>

      http://wiki.jikexueyuan.com/project/notes/images/PercentRelativeLayout.png" alt="PercentRelativeLayout.png" />

    • pitfalls
      • 當(dāng)子View需要的長/寬大于給定的percent時(shí),可以通過指定layout_width/height為wrap_content來實(shí)現(xiàn)大小擴(kuò)展,然而似乎不起效?
      • Percent*Layout中不要使用padding,否則總大小將小于100%,可能會(huì)導(dǎo)致對其問題
  • Layout animations on RecyclerView
    • RecyclerView的子類,重寫protected void attachLayoutAnimationParameters(View child, ViewGroup.LayoutParams params, int index, int count)方法,控制layout動(dòng)畫的播放
    • 使用xml定義animation
  • Chrome custom tabs
  • 執(zhí)行定時(shí)任務(wù),可能的實(shí)現(xiàn)方式有:Alarm, JobScheduler, API 21+, JobSchedulerCompat API 10+, GcmNetworkManager, 分享。
  • RenderScript例子:HealingBrush
  • 安卓6.0引入的運(yùn)行時(shí)權(quán)限系統(tǒng),如果APP使用ACTION_SEND分享文件,并使用了file://形式的Uri,那么接收APP將需要READ_EXTERNAL_STORAGE權(quán)限,否則將會(huì)崩潰;而如果使用content://形式Uri,接收APP將不需要權(quán)限;所以應(yīng)該使用后者形式;
  • 安卓6.0引入了App Links,將限制一個(gè)Intent只能被通過App link驗(yàn)證的APP打開,具體驗(yàn)證方式可以參考官方文檔;packageManager.queryIntentActivities(intent, MATCH_DEFAULT_ONLY);將至多返回一個(gè)結(jié)果;MATCH_ALL這個(gè)flag起作用的前提是尚無通過驗(yàn)證的APP,否則也只會(huì)有一個(gè)結(jié)果;詳見;
  • 在manifest中設(shè)置android:windowSoftInputMode="adjustResize"后,activity內(nèi)的“可折疊”ViewGroup,例如ScrollView會(huì)在鍵盤彈起時(shí)減小其高度,然而如果在activit的theme中設(shè)置android:windowFullscreen="true"或者android:fitsSystemWindows="false",那么adjustResize都將不起作用。
  • 如果Activity使用Theme.NoDisplay,并且沒有立即finish,那APP將會(huì)ANR,詳見
  • 安卓音頻處理高性能方案
  • Activity響應(yīng)ACTION_PROCESS_TEXT的intent,會(huì)在用戶選擇文本時(shí),提供為其服務(wù)的機(jī)會(huì)

Material design

構(gòu)建/工具

  • 利用buildSrc工程和Codemodel自動(dòng)生成代碼,buildSrc目錄下的代碼將作為gradle插件被編譯,并自動(dòng)添加到工程的依賴中
  • 第三方庫在manifest中聲明的權(quán)限,可能app中并不會(huì)使用,可以屬性,使得gradle在進(jìn)行manifest merge時(shí),移除該權(quán)限,例子:
    <uses-permission 
      android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove"/>
    <uses-permission 
      android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove"/>
  • 縮小APK包體積的Tips
    • Proguard
    • Lint
    • 不必為每種dpi打包資源文件(圖標(biāo))
    • 移除第三方庫中不必要的資源文件
      defaultConfig {
          resConfigs "en", "de", "fr", "it"
          resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
      }
    • 圖片壓縮,9-patches
    • Limit the number of architectures, armabi, x86 is enough
    • Reuse whenever possible:圖標(biāo)如果只是顏色不同、旋轉(zhuǎn),則可以只打包一個(gè),然后通過tint/tintMode/ColorFilter/RotateDrawable來重復(fù)利用
    • Render in code when appropriate
    • Going even further? Server side packaging,根據(jù)設(shè)備具體細(xì)節(jié)打包資源,但是有一定風(fēng)險(xiǎn)。
  • 通過gradle配置sourceSets讓單元測試和集成測試共享代碼,受此啟發(fā),可以更加高度定制化代碼路徑。詳見
  • DDMS MAT分析內(nèi)存分配、內(nèi)存泄漏
  • 自定義Lint的規(guī)則,進(jìn)行定制的代碼檢查
  • gradle配置測試顯示log

      android {
      ...
    
      testOptions.unitTests.all {
          testLogging {
          events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'
          outputs.upToDateWhen { false }
          showStandardStreams = true
          }
      }
      }
  • gradle配置minSdkVersion 21可以加快開發(fā)時(shí)的打包速度

有意思的第三方庫/教程

Google API

最佳實(shí)踐

  • 使用Headless Fragment把部分Activity公用的邏輯封裝起來,避免將只被部分Activity公用的邏輯加到所有Activity的父類中。
  • 通過Intent調(diào)起其他應(yīng)用時(shí),需要先檢查是否有應(yīng)用可以響應(yīng)此Intent:

      if (sendIntent.resolveActivity(getPackageManager()) != null) {
          startActivity(sendIntent);
      }
  • #qualitymatters
    • Fail fast, fail early
    • Pull Requests, Code Review and Continuous Integration
    • Code quality, SOLID
    • Static Code/Resources Analysis
    • Unit tests
    • Code Coverage
    • Functional (UI) tests
    • Integration tests
    • Developer Settings Menu (aka Debug Drawer)
  • inflater.inflate,第二個(gè)參數(shù)不要傳遞null,第三個(gè)參數(shù)在Fragment::onCreateView和recycler view holder的onCreateViewHolder時(shí),都必須傳false;