跳到主要內容

Android O 多了什麼新東西 ??

Background Execution Limits

1. 大部份在 AndroidMenifast 宣告的 Implicit BroadcastReceiver 不會被呼叫,但有些還是可以 work,如以下:
    • BOOT_COMPL
    • ETELOCALE_CHANGED
    • USB_DEVICE_ATTACHED
    • Explicit BroadcastReceiver 沒什麼改變,還是可正常發送。Runtime Implicit BroadcastReceiver 也沒什麼改變。
      2. Service 也有些改變,如以下: 
      • Run minimally after the app has been background (這要開發者怎麼決定哪些是一定要在背景執行的阿…)
      • App 在背景時,不能使用 startService() 跟 PendingIntent
      • Foreground service 不變,多了新 API 可以使用,NotificationManager#startServiceInForeground
      3. When you app enter cache state with no active component, weak locks be automatically released.

      4. Location
      • Background Location Limited updates, few times per hour
      • Passive Location Unchanged (這句在說啥?)
      • 有其他 app 在前景使用 Location update,你的 background location 更新的頻率會跟前景一樣 (所以重點就是要有 app 在前景要 location 的資料!)
      • Foreground Location 沒改變

      Settings.Secure.ANDROID_ID

      其實這個我看不懂他在說什麼,之前完全沒碰過…
      • pre-O:每個 app 的 ID 都一樣
      • post-O:每個 app 都會有個獨立的 ID (影片說由 Google Play Service 管嗎?)

      Account access

      • 不能用 GET_ACCOUNTS 這個 permission 了
      • 要改用 newChooseAccountIntent (AccountManager 跟 Google Play Service library 都有)

      Notification Channel

      • 大意就是提供一個統一的用法讓使用者管理 notification
      • App 設定在 Android O 的話,至少要實作一組 notification channel
      • 不是設定在 Android O 的話就不用管這個
      • 詳情請看官方介紹

      Autofill Framework

       讓使用者便於輸入使用者相關的個人資訊,減少使用者打錯的機會,並節省時間
      • Addresses
      • Credit card information
      • user name
      • password
      • 支援 custom view,但要額外實作一些 method
      • 詳情請看官方介紹

      Picture in Picture

        在 Android M 時 PIP mode 只支援 Android TV,在 Android O 所有的 device 都支援 PIP mode 了。新 API PictureInPictureArgs 可以設定 PIP mode,如畫面比例等。詳情請看官方介紹

      Multi Display Support

      Android O 有支援 multi display。假如你的 app 設定 Android O,執行在有 multi display 的 device 上時,使用者可以自由切換 activity 要在哪個 display 顯示。不過開發者在發佈 app 最好要測試過這個功能。

      Font Resources

      簡單說就是 resource 終於有 font 可以用了,如 R.font.your_font。詳情請看官方介紹


      這篇只是重點節錄上面 youtube 影片的內容,新功能還是要親自使用過後才會比較有感覺喔 (我也不知道自己哪時候會試,我到現在都還沒有 Android N 的 device…)

      參考資料

      Android O preview
      Android O Features and APIs

            這個網誌中的熱門文章

            如何把 Status Bar 變透明

            Android 從 4.4 (KitKat, api level 19) 後才支援這個功能, 到了 5.0 (Lollipop, api level 21) 自訂性更高, 可以讓我們設定各種顏色, 當然也包含透明色。以下分別介紹如何使用這兩種版本的方法。

            方法1: 利用 attribute "android:windowTranslucentStatus", 在 style.xml 加上這個 attribute 就好。要注意的是 Android 版本要在 4.4 以上才可以用這個 attribute:

            <resources> <!-- Base application theme for API 19+. This theme completely replaces AppTheme from res/values/styles.xml on API 19+ devices. --> <style name="AppTheme" parent="@style/AppBaseTheme"> <!-- API 19 theme customizations can go here. --> <item name="android:windowTranslucentStatus">true</item> </style> </resources>         下面的圖分別為 4.4 跟 5.0 的手機使用這個 attribute 的結果:


                    因為設定了這個 attribute, 畫面會從 status bar 下方開始畫。要解決這個有兩種方法, 第一個是在 layout 畫面設定 attribute "android:fitsSystemWindows"

            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to…

            在 Fragment 裡使用 ViewPager 搭配 FragmentPagerAdapter

            Fragment 是個強大的東西,可以想成 Activity 的子頁面,可隨時替換頁面內容(但使用起來還滿麻煩的…)。這麼強大的東西,在 ViewPager 當然也會提供 Fragment 的版本。在官方文件就有一個 PagerAdapter 的實作:FragmentPagerAdapter,可以用 Fragment 來當成每個 ViewPager 的子頁。FragmentPagerAdapter 的官方文件中也有提供 sample code。

                    但我自己參考 sample code 寫出來的效果卻怪怪的,ViewPager 裡子頁面的 lifecycle 竟然沒有跟著父 Fragment ,看起來比較像是跟著 Activity。仔細看 sample code 才發現,它是在 Activity 裡使用 ViewPager + FragmentPagerAdapter。那要如何使用在 Fragment 呢?

                    其實只要改一行 code 就可以了。 sample code 裡的
            mAdapter = new MyAdapter(getSupportFragmentManager()); 只要改成
            mAdapter = new MyAdapter(Fragment.getChildFragmentManager()); 就可以囉 ~~

                    由於 getChildFragmentManager() api level 17+ 才有的東西,而 Fragment 是 11+ 才有,不想定太高的 api level 可以使用 support v4 library,怎麼使用就不多說啦。

            參考資料:

            support v4 Fragment:
            http://developer.android.com/intl/zh-tw/reference/android/support/v4/app/Fragment.html

            support v4  FragmentPagerAdapter:
            http://developer.android.com/intl/zh-w/reference/android/support/v4/app/FragmentPagerAdapter.html


            ADT 開新專案不使用 support.v7.appcompat

            ADT 愈來愈煩了…不知道從哪一版開始,我目前版本是 Android SDK Tools 22.6.4,Android SDK Platform-Tools 19.0.2,只要開新專案選 Blank Activity,預設 MainActivity 就會 extends AtionBarActivity 並使用 Fragment 顯示頁面,而且 project list 還會多一個 appcompat_v7,可是我一點都不喜歡 Fragment 阿!!!但是選專案 Activity 時,多了一個 Empty Activity,我選它總可以了吧!


                    很好,總算是 extends Activity了,但還是一樣會多一個 appcompat_v7 的專案。這看了真的很礙眼,我索性就把它刪了。結果刪掉後,反而新專案怎麼 build 都失敗。看一下錯誤都是在 style.xml



                    看一下錯誤訊息,是No resource found that matches the given name 'Theme.AppCompat.Light'。因為這是在 support v7 appcompat 裡的東西,把它砍了當然就找不到,build 失敗也是正常的,這裡教大家如何能順利 build 這個新專案:

            1. 對專案按右鍵 --> Properties --> 左邊 Panel 選 Android --> 右邊 Scroll bar 拉到最下面 -->             Library 的地方把 appcompat_v7 這個 project library 給 remove 掉 --> Apply and OK。

            2. 把 style.xml 裡的 parent theme 都改成原有的 theme,例如 android:Theme.Light

            3. 重新 build project --> 打完收工!

                    這是不想用 Fragment 的情形才要這樣做啦,要是你的 app 想要呈現多頁的資訊的話,Fragment + ActionBar/ViewPager 還是不錯的選擇啦!(但是滿難用就是了)