發表文章

確認 APK 檔案是否為 release 版的方式

使用 aapt aapt list -v -a app-name.apk | grep “android:debuggable” 如果結果是 0 則為 release 版 apk,否則為 debug 版 apk 2. 使用 jarsigner jarsigner -verify -certs app-name.apk | grep “CN” 如果是 debug 版 apk,CN 的值是 Android Debug 3. 使用 apksigner apksigner verify [options] app-name.apk https://developer.android.com/studio/command-line/apksigner#usage-verify

Android shared element transition

圖片
Shared Element 什麼是共享元素?從單一意義上講,共享元素是在兩個不同 Activity 或 Fragment 中存在的一對 View。這些 View 顯示相同的信息,例如文字或圖像,但它們在螢幕上的大小或位置可能不同。為了在切換畫面期間有保留視圖的錯覺,可以使用過渡來移動和重塑第一個 View,使其“成為”第二個 View。由於共享元素實際上包含兩個不同的視圖,實際上來講,並不是真正的共享它們。 現在,可以使用共享元素轉換來實現;但是這裡有個限制。此過渡效果僅在運行在Lollipop(Android 5.0 – API級別21)及更高版本上的設備上可用。 Android 5.0中引入了共享元素過渡,讓跨螢幕的 View 過渡更加無縫且易於實現。使用此過渡,“Activity”或“Fragment”之間的切換似乎更加自然且不受約束。 現在,讓我們來看看如何實現共享元素過渡 Step 1:Enable Window Content Transitions in styles.xml <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- enable window content transitions --> <item name="android:windowContentTransitions">true</item> </style> Step 2: Set a Common Transition Name for Respective Views on Both Screens 在兩個佈局中的共享元素設定一個共同的 transitionName,View不必具有相同的 id,只需要transitionName 相同 在activity_home.xml中: <LinearLayout ...> <ImageView android:id="@+id/iv_list_object_image

透過Postman測試Android接收推播訊息

圖片
前言 推播問題多,透過Postman能快速自我驗證,釐清問題 測試步驟 首先請安裝Postman。Postman: a Google chrome extension. Postman設定 Request Type: POST URL: https://android.googleapis.com/gcm/send Header   Authorization :  key=your key  //Google API KEY   Content-Type :  application/json Body JSON (raw) : 請照自己的發送格式 {   "to":"token",   "data": {     "message" : "Test測試"   } } 確認回應訊息,當success的值大於0,表示成功發送幾個

AndroidX 和 Android Support 相容問題

圖片
Run App時發生的問題: Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91 is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory). Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:36:5-364:19 to override. Sol: project目錄按下右鍵 -> Refactor -> Migrate to AndroidX Android Studio會幫你先壓一個zip,避免壞掉

Android Navigation 學習筆記

圖片
為什麼要用Navigation? 當你專案中的頁面越來越多,Fragment和Activity之間的跳轉越來越繁雜,是不是搞得你一團亂呢?你是否羨慕Xcode中能將頁面跳轉視覺化的Storyboard呢? Xcode Storyboard 好在Google終於提供了Navigation套件來幫我們處理這些問題,讓我們一起來試玩看看吧。 Android Navigation Graph 環境設定 如果你的Android Studio版本是3.2的話,必須到Setting將Navigation Editor打開,3.3以上版本無需此動作 enable Navigation Editor dependencies 首先設定module層的build.gradle,我的Demo會用androidx的版本示範 androidx version dependencies { implementation "androidx.navigation:navigation-fragment:2.0.0" implementation "androidx.navigation:navigation-ui:2.0.0" } 新建三個Fragment class MainPage1Fragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return inflater.inflate(R.layout.fragment_main_page1, container, false) } } class MainPage2Fragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,

Kotlin - dagger 2

Dependencies Project build.gradle buildscript { ext.dagger_version = '2.5' } App build.gradle apply plugin: 'kotlin-kapt' dependencies { implementation "com.google.dagger:dagger:$dagger_version" kapt "com.google.dagger:dagger-compiler:$dagger_version" } 下面我們直接來看一個範例: 我這邊使用四個Model,分別為Model A B C D ModelA 裡面包含了 B跟C ModelC 裡面包含了 D 先看ModelA: class ModelA @Inject constructor(val context: Context, var modelB: ModelB, var modelC: ModelC){ var somethingData: String = "modelA haha " fun print() { Log.d("ModelA", somethingData + modelB.somethingData + modelC.somethingData) } } 傳入的context,實際上沒用到只是純粹練習  print()  會印出ModelA的data,data會將ABC的data加起來 ModelB: class ModelB @Inject constructor(){ var somethingData: String = "modelB haha " } ModelC: class ModelC @Inject constructor(modelD: ModelD){ var somethingData: String = "modelC haha " + modelD.somethingData

Kotlin - 實現Android中的Parcelable

圖片
使用 Parcelable 的最基本用例是當我們需要將模型從一個活動傳遞到另一個活動時。當傳遞原始類型時,很簡單,但是當我們想要傳遞自己的對象時,我們需要對它們做一些事情: class ActivityA : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val intent = Intent(this, ActivityB::class.java) val person = Person("name", 32, "email@email.com", 1234) intent.putExtra("A_STRING", "some string") intent.putExtra("A_NUMBER", 1234) intent.putExtra("AN_OBJECT", person) // compilation error startActivity(intent) } } 如果我們認為我們使用的 Person 對象與上一篇文章相同,則會在第11行收到編譯錯誤,因為我們無法照原樣傳遞 Person 模型。 我們的模型不符合以上任何條件,因此我們需要對此做些事情,我們有一些選擇: Implement Serializable: 希望您不再這樣做,儘管它有效且易於實施,但由於它基於反射,因此性能相當差。 Json String representation : 您也可以這樣做,並將模型作為String傳遞。同樣,這也非常簡單,特別是如果您已經Gson在項目中使用了類似功能,但又不是最佳選擇。 Implement Parcelable: 這顯然是正確的答案。根據官方文檔,這是推薦的方式。它也適用於   marshalling/unmarshallingJava 對象,例如序列化,但性能更高。 因此,Parcelable是最好