發表文章

如何讓Android App按Home鍵之後再次開啟仍在之前的頁面

通常在Android的世界裡,只要按下App的 icon都會從程式進入的第一個頁面(以下簡稱首頁)啟動,所以不論當你操作App進入到了哪一層、哪個頁面,只要是在桌面再次按下了App的icon就會又回到首頁。 上述的流程可以透過開啟App進入到某一層之後,按Android手機的Home鍵,再按下App icon,就會了解發生了什麼事。 按下App icon就是開啟首頁對於Android使用者一直以來是再習慣也不過的事,但對於iOS的使用者就覺得不對勁了。 原來在iOS的世界裡,App開啟之後,如果按了Home鍵,下次再按了桌面上的icon還是會停留在A pp上次最後的頁面,除非iOS的使用者透過切換程式的方式把該App刷掉(關掉),下次按下icon才會開啟App的首頁。 那麼,如果有天Android工程師收到的需求就是要如同iOS的行為一樣時,該怎麼辦呢? 上網查了一下,解決的方法只要在Activity的onCreate()生命週期裡加入下面的程式碼即可以解決 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { finish(); return; } //其他原本在此生命週期執行的程式碼... //... //... } Reference: How to return to the latest launched activity when re-launching application after pressing HOME?

Android如何實作強制App版本更新

App上架了一段時間,透過Google Play Console常常會發現有不少的使用者仍然一直停留在舊版本不更新,雖然Android預設會自動更新用戶安裝的App版本,但也是會有使用者把自動更新的功能關閉,如此便會造成App加了新功能用戶無法體驗到或是當初沒考慮到的漏洞沒辦法補起來,基於此,強烈建議App在規劃的初期就要把「強制使用者更新App」的功能實作之後才上架。 實作的方式不難,大致上依照以下幾個流程即可達成: App開啟時檢查版本與Google Play上的版本是否一致 如果不一致就彈出對話框讓使用者執行前往該App的Google Play連結 限制使用者企圖操作不進行版本更新的行為 本例以Volley實作,所以在Callback的部份加上判斷版本是否相符的程式碼: StringRequest appVersion = BaseApi.appVersion(new ResponseListener() { @Override public void onError(VolleyError error) { super.onError(error); intoNextPage(); //有可能網路出錯但仍需讓使用者可以進入下一個頁面 } @Override public void onResponse(String str) { super.onResponse(str); Pattern pattern = Pattern.compile("\"softwareVersion\"\\W*([\\d\\.]+)"); Matcher matcher = pattern.matcher(str); if (matcher.find()) { if (!ValueUtility.getCurrentVersionName().equals(matcher.group(1))) { newVersionDialog.show(); } else { ...

Eclipse專案移植到Android Studio時發生META-INF/LICENSE.txt與suport-library-v4/v7內容重覆的問題

當我們想把使用Eclipse寫的code移植到Android Studio來開發,如果有當初在Eclipse把整個專案包成別的專案可以使用的Library(在Properties設定為"is Library"),整合之後程式碼都沒有出錯,但要Build apk時就有可能會看到類似的錯誤訊息: Error:Execution failed for task ':library:tools:transformResourcesWithMergeJavaResForRelease'. > com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/LICENSE.txt File1:~/…/[ProjectName]/library/tools/libs/httpcore-4.1.4.jar File2:~/…/[ProjectName]/library/tools/libs/httpclient-4.1.3.jar File3:~/…/[ProjectName]/library/tools/libs/httpmime-4.1.3.jar 解決的方法是在Gradle裡面加上: packagingOptions { exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' } 但是要看發生重覆的檔案位置在哪,本例在Android Studio建立一個Library Project來放置當初在Eclipse的is Library Project,而出現重覆的地方是訊息指出的那三個jar檔,也是在Android Studio的Library專案(...

升級SDK Build-tools 23.0.2之後會與Multidex發生衝突

當升級SDK Platform API 23之後,發現已經有Build-tools Version 23.0.2,想說就順便升級一下,結果就發生... Error:Execution failed for task ':app:transformClassesWithDexForDebug'. > com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java'' finished with non-zero exit value 3 查詢的結果發現是與 Multidex 發生衝突了。由於之前在Build-tools 22.0.1就已經有使用了Multidex了,因此建議如果有要使用Multidex就先不要把Build-tools升級到23.0.2,就用Build-tools 22.0.1就好。在此提供升級SDK為23且可以使用Multidex在gradle的設定: android { compileSdkVersion 23 buildToolsVersion ' 22.0.1 ' defaultConfig { applicationId "com.ingree.cwwebsite" minSdkVersion 15 targetSdkVersion 23 // Enabling multidex support. multiDexEnabled true } dependencies { compile ' com.android.support:multidex:1.0.1 ' } 雖然在 Multidex 的Googl...

在Android Studio加入第三方Library專案,以ViewPagerIndicator為例

圖片
ViewPagerIndicator 是一個可以很快實作在ViewPager滑動換頁的頁面下方指示點的open source library。但由於ViewPagerIndicator沒有出jar檔,也沒有提供直接在gradle加上dependencies 就能直接引入使用,所以只能把整包library download下來之後,放到專案的目錄裡,定義為library使用。 而在把此library引入的過程有發現一些問題,此篇也是作為其他把整個完整的library程式碼專案包到自己要開發的專案裡的方法。 1.先建立一個名為”library”的資料夾,用來做為放置library的目錄  在專案按右鍵 > New > Directory, 命名為library(名稱可以自訂) 2.複製ViewPagerIndicator到剛剛建立的library目錄裡 3.修改專案的settings.gradle include ':app' ,':library:ViewpagerIndicator' 4.修改app module裡的build.gradle dependencies { compile project(' :library:ViewpagerIndicator ') } 5.在library裡建立一個build.gradle檔案   apply plugin: 'android-library' android { sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } ...

Mac使用Android Studio整合Git,以bitbucket為例

圖片
1. 在Bitbucket上建立新專案 2. 新增 SSh key 到帳號裡(Add an SSH key to an account) 使用終端機程式切換到.ssh目錄下輸入: ssh-keygen -C "E-mail" -t rsa 將上述的"E-mail"輸入電子郵件信箱,然後就會發現該目錄底下多了 id_rsa 與 id_rsa.pub 這兩個檔案 複製id_rsa.pub的內容, 在終端機程式輸入: pbcopy < ~/.ssh/id_rsa.pub 到Bitbucket後台設定的Add an SSH key to an account的Key欄位貼上,Label可以隨意填寫 3. 建立本地端的儲存庫(Repository) 在Android Studio的工具列選擇 VCS > Import into Version Control > Create Git Repository 4.新增遠端Repository 使用終端機程式切換到project已建立git的目錄下輸入: git remote add origin ssh://git@bitbucket.org/帳號名稱/專案名稱.git 5. 加入當前目錄下的所有檔案到stage git add . 6. 提交檔案加入文字資訊 git commit -am "init" 7.上傳到遠端儲存庫 git push origin master 如果沒有執行步驟2,會因為沒有權限而無法上傳檔案 如果有執行步驟2,就會得到下面的成功畫面 8.回到Bitbucket就可以看到上傳成功的畫面