1. 程式人生 > >Android RRO機制的運用-----google開機嚮導客製化

Android RRO機制的運用-----google開機嚮導客製化

上週五的時候領導分了一個任務,客戶讓在google開機嚮導裡面增加一頁,首先就想到了android的Overlay,然後網上搜了下,發下有很多人寫了這方面的技術。而且寫的都還不錯,所以本篇只當記錄作用吧,列下寫的比較好的部落格:

http://developer.sonymobile.com/2014/04/22/sony-contributes-runtime-resource-overlay-framework-to-android-code-example/

看情況大家應該都參考的這篇,英文好的可以看下。

Android 執行時資源替換—-Runtime Resource Overlay

既然原理別人都已經寫好了,再寫就有點浪費時間了,不懂的話可以參考上面兩篇部落格。

下面直接開始我這個功能的實現。

首先看下我們的基本思路,(解釋一點 其實google的開機嚮導很多頁面都來自不同的app)

1、所以我們先要找到把每一頁整合到一起的配置檔案,
2、找到這個配置檔案後在相應的地方增加我們的頁面配置。

後面的事就是編寫UI之類的 根據需求來就可以了

1、查詢配置檔案

通過反編譯工具可以把SetupWizard的資原始檔反編譯出來,android的配置檔案一般都是xml檔案 。所以到現在我們應該已經得到了SetupWizard的配置檔案,這個配置檔案具體是什麼。請往下看。

通過sdk提供的hierarchyviewer工具我們可以得到SetupWizard每個頁面的包名

這裡寫圖片描述

注意到BluOOBEKeepActivity 和BluOOBEActiviy就是我新增的,先忽略掉它們,設定wifi的時候老是跳過 ,下面這張圖是走到設定wifi介面的時候截的。

這裡寫圖片描述

通過上圖我們可以知道SetupWizard會走到Setting中去選擇連線wifi的介面,別的包名看起來都是google的,google的應用我們一般都沒原始碼,所以就以Settings的這個介面入手,
看Settings中AndroidManifest.xml關於WifiSetupActivity的配置

<activity android:name=".wifi.WifiSetupActivity"
                android:taskAffinity="com.android.wizard"
                android:theme="@style/SetupWizardDisableAppStartingTheme"
                android:label="@string/wifi_setup_wizard_title"
                android:icon="@drawable/empty_icon"
                android:clearTaskOnLaunch="true"
                android:windowSoftInputMode="adjustNothing">
            <intent-filter android:priority="1">
                <action android:name="com.android.net.wifi.SETUP_WIFI_NETWORK" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                android:value="true" />
        </activity>

搜尋這些資訊發現SetupWizard的資源中並沒有找到,很鬱悶 ,沒辦法 唯一的思路不能斷呀,只能一路查詢它的父類 最後終於在WifiSettingsActivity 中找到了有用的資訊

<action android:name="android.settings.WIFI_SETTINGS" />

這裡寫圖片描述

開啟這兩個檔案檢視,基本類似的,只是一個多了user,不知道具體有什麼差別,但是通過對比發現 它們基本一樣 只是wizard_script比wizard_script_user多了好多頁面,但是明顯第一個有welcome的頁面,第二個沒有,所以最終決定在wizard_script新增我們的頁面。

<WizardAction wizard:uri="intent:#Intent;action=android.settings.SET_BLUOOBEKEEP;end" id="blu_oobekeep">
        <result wizard:action="restore_check" />
    </WizardAction>

好了 經過比較蛋疼的查詢後終於知道了要把新頁面新增到什麼地方, 接下來就是新增頁面了。

2、最後也決定把這個頁面寫到Setting中,具體的內容的話就要看各個需求了。

Settings中AndroidManifest新增配置

  <activity android:name="com.android.settings.wifi.BluOOBEKeepActivity"
                  android:theme="@style/SetupWizardTheme.Light"
                  android:taskAffinity="com.android.wizard">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.settings.SET_BLUOOBEKEEP" />
                <action android:name="android.settings.SET_BLUOOBE_NOT_ACCOUNTKEEP" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

原始碼