一、Diving In
1. 一個(gè)典型的Android APP組成:Layouts—頁(yè)面,XML格式;Activity—定義了APP行為,Java code編寫(xiě);extra resources,APP使用的一些外部組員,如聲音、圖像文件等。
2.Android平臺(tái)結(jié)構(gòu),從下往上。
Linux Kernel,提供驅(qū)動(dòng)、安全和內(nèi)存管理等功能。
C和C++ libraries,提供上層framwork支持
Android Runtime,運(yùn)行java程序的虛擬機(jī),每個(gè)app一個(gè)進(jìn)程。
Application Framework,提供上層APP接口
Application,上層APP
3.APP結(jié)構(gòu)
root folder就是project名,主要關(guān)注的是app folder。
app/build是android studio創(chuàng)建。
app/build/generated/source/r/debug/com.xx.xx/R.java文件,Android使用該文件trackapp的資源內(nèi)容。
app/src/main/java是activities所在。
app/src/main/res/layout是layouts文件所在。
app/src/main/res/values是資源文件,包括string等。
app/src/main/AndroidManifest.xml文件包含了一個(gè)app所需的信息,如包含的組件、需要的libraries和一些其他的聲明。
4.activity_main.xml文件結(jié)構(gòu)
<RelativeLayout></RelativeLayout>標(biāo)簽告訴android按格式顯示其中內(nèi)容。
<TextView />顯示text
5.layout文件包含的string放置在app/src/main/res/values/string.xml文件中,layout中引用使用"@sring/string_name"的方式。
這樣用的原因是方便global change。
<string name="string_name">string real name</string>
二、Apps That Do Something
1.layout中active_*.xml屬性
android:id="@+id/myid",components的id好,activity code中引用id操作該component。
android:text="Mytext",components顯示
android:layout_width="wrap_content"和android:layout_height="wrap_content"制定component的寬高,wrap_content表示將內(nèi)容顯示的big enough。
2.下拉菜單spinner
layout中,使用spinner標(biāo)簽<Spinner />,元素中包含android:entries="@array/beer_colors"。
string.xml中使用string-array,<string-array name="beer_colors"><item>xx</item></string-array>來(lái)表示列表。
3.編寫(xiě)activity
1. layout的button標(biāo)簽中加上android:onClick="onClickName",這里的onClickName實(shí)際上是activity中click button動(dòng)作后實(shí)現(xiàn)的程序內(nèi)容的函數(shù)名
2. activity初始的函數(shù)
public class MainActivity extends Activity{
----protected void onCreate(Bundle savedInstanceState){
--------super.onCreate(savedInstanceState);
--------setContentView(R.layout.activity_main);//告訴android使用哪個(gè)layout
----}
}
3.添加一個(gè)onClickName函數(shù)去實(shí)現(xiàn)點(diǎn)擊按鈕后的動(dòng)作
public void onClickName(View view){//onClickName是layout中button標(biāo)簽中onClick元素值
}
4.使用findViewById()獲取layout中“@+id/xx”對(duì)應(yīng)元件中的值,如TextView brands = (TextView) findViewById(R.id.brands);
三、State Your Intent
講述建立多個(gè)layout的APP如何實(shí)現(xiàn)。
1.AndroidManifest.xml文件,所有的acitivy都應(yīng)該在其中declared
<action android:name="android.intent.action.MAIN">指定APP的主activity
<category android:name="android.intent.category.LAUNCHER">表示這個(gè)activity可以用來(lái)啟動(dòng)APP
2.使用intent去start另一個(gè)activity。
import android.content.Intent;
Intent intent = new Intent(Source.this, Target.class);
startActivity(intent);
3.兩個(gè)activity之間傳遞消息
在傳遞者中,intent.putExtra("message", MessageText);
在接收者中,Intent intent = getIntent(); String messageText = intent.getStringExtra("message");
4.使用action在不同app間傳遞消息
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, message);
5.每個(gè)app響應(yīng)intent:android從每個(gè)app的AndroidManifest.xml中查找相應(yīng)的intent-filter
<intent-filter>
----<action android:name="android.intent.action.SEND" />
----<category android:name="android.intent.category.DEFAULT" />
----<data android:mimeType="*/*" />
</intent-filter>
四、Being an Activity
1.Hander來(lái)操作多個(gè)線程,schedule code,且不會(huì)block主thread。
2.解決手機(jī)rotated screen造成activity recreated的方法
1. AndroidManifest.xml中<activity>標(biāo)簽中加入android:configChanges="orientation|screenSize"
2. save current state,
public void onSaveInstanceState(Bundle savedInstanceState){
----savedInstanceState.putType("typevalue",typevalue);
}
使用時(shí),在onCreate開(kāi)頭,setContentView后,
if(savedInstanceState != null){
----typevalue = savedInstanceState.getType("typevalue");
}
十三、At your service
1.兩種類型的service,
1. Started service,運(yùn)行到操作結(jié)束,即使activity destroy自己后,仍會(huì)運(yùn)行。如大文件的下載等。使用時(shí)繼承IntentService類。
2. Bound service,運(yùn)行周期在bound activity時(shí),可以和activity進(jìn)行交互。使用時(shí)繼承Service類。