誤入Android系列篇章:從開發環境開始
前言
這一陣子在做flutter的過程中,遇到蠻多Android的問題,但無奈本人過去是iOS開發者,轉為Flutter後,遇到跟Android底層相關的資訊,不過也不確定從哪個地方開始research,所以目前可能會依照可能可以走的roadMap來進行知識的攝取,而參考目前的roadMap如下:
https://roadmap.sh/android
想想在iOS面向先熟悉整個APP的做法大概是先從整個APP的起始點開始。那在這邊也會從這個角度開始熟悉:
- 熟悉Android Studio
- 熟悉Kotlin或Java的使用
- 熟悉Android 相關框架
正文
如何開始一個Android專案?
我想這邊就不教怎麼從brew install一個Android Studio了,我們直接以有Android Studio的方式來開始一個專案:
由於Android可以創建兩種不一樣性質的專案:Futter 或 Native Android
所以你會在右上角的欄位看到兩種不一樣的New Project鍵,那麼,我今天會創建的是Native專案,所以會點擊右上角的New Project。
然後左邊的側邊欄位有四個項目,Project我們已經知道了,主要是創建專案的入口
Project

Customize

Plugin

Learn Android Studio
這邊主要就是一些介紹Android Studio的相關reference,也可以藉由這邊的連結進行了解:

點擊New Project後,接下來來實際New一個project:

這邊可以選擇這個APP最初始的樣貌模板,這點iOS的開發不會這麼親切的告訴你可以怎麼做,不過可以注意的事情是,由於我們現在主要開發的產品是Phone,所以在這方面應該就很好處理了,我們就是直接選Phone and Tablet就可以了。

Android Studio介面介紹
Project頁籤
這邊其實也跟Xcode、VSCode差不了多少,就是一些檔案放置的位置,可以很直觀地看到專案結構:

Structure
左下角可能會看到的是一個專案某個內部物件的一些方法,以下是隨意點了下MainActivity得到的methods:

BookMarks
這邊主要是有一些註解可能就可以在這邊使用,不過聽我Android開發的同事,感覺好像都沒有特別使用過這部分,就算有TODO的註解,也都是直接在最下面那一排直接看,所以,使用的部分好像見仁見智。

Build Variant
這邊主要是環境的切換點,你可以在build.gradle裡面切換環境

舉個例子:
android {
...
buildTypes {
getByName("debug") {...}
getByName("release") {...}
}
// Specifies the flavor dimensions you want to use. The order in which you
// list the dimensions determines their priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions += listOf("api", "mode")
productFlavors {
create("demo") {
// Assigns this product flavor to the "mode" flavor dimension.
dimension = "mode"
...
}
create("full") {
dimension = "mode"
...
}
// Configurations in the "api" product flavors override those in "mode"
// flavors and the defaultConfig block. Gradle determines the priority
// between flavor dimensions based on the order in which they appear next
// to the flavorDimensions property, with the first dimension having a higher
// priority than the second, and so on.
create("minApi24") {
dimension = "api"
minSdk = 24
// To ensure the target device receives the version of the app with
// the highest compatible API level, assign version codes in increasing
// value with API level.
versionCode = 30000 + (android.defaultConfig.versionCode ?: 0)
versionNameSuffix = "-minApi24"
...
}
create("minApi23") {
dimension = "api"
minSdk = 23
versionCode = 20000 + (android.defaultConfig.versionCode ?: 0)
versionNameSuffix = "-minApi23"
...
}
create("minApi21") {
dimension = "api"
minSdk = 21
versionCode = 10000 + (android.defaultConfig.versionCode ?: 0)
versionNameSuffix = "-minApi21"
...
}
}
}
...
上面的設定在buildTypes的地方就會有兩個環境可以設定。寫的時候可能可以參考一些reference。
然後再來就是進到程式的主要入口點
MainActivity.java
package com.example.myapplication;
import android.os.Bundle;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import com.example.myapplication.databinding.ActivityMainBinding;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
private AppBarConfiguration appBarConfiguration;
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
binding.fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
return NavigationUI.navigateUp(navController, appBarConfiguration)
|| super.onSupportNavigateUp();
}
}
等等要確定這就是入口點餒!怎麼確定呢?請打開你的AndriodManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.Demo"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.Demo.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
上面載明了.MainActivity就是入口,所以囉!
小結
這篇小小的探索了一下Android Studio的整個創建專案的流程跟基本的GUI介面的Know how,接下來的部分可能會先以Kotlin的使用為主,慢慢的把開發的技能樹點齊。