一、Diving In
1. 一個典型的Android APP組成:Layouts—頁面版保,XML格式摇幻;Activity—定義了APP行為,Java code編寫顷锰;extra resources柬赐,APP使用的一些外部組員,如聲音官紫、圖像文件等肛宋。
2.Android平臺結(jié)構(gòu)州藕,從下往上。
Linux Kernel酝陈,提供驅(qū)動床玻、安全和內(nèi)存管理等功能。
C和C++ libraries沉帮,提供上層framwork支持
Android Runtime锈死,運行java程序的虛擬機,每個app一個進程穆壕。
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文件包含了一個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>來表示列表及皂。
3.編寫activity
1. layout的button標(biāo)簽中加上android:onClick="onClickName"甫男,這里的onClickName實際上是activity中click button動作后實現(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使用哪個layout
----}
}
3.添加一個onClickName函數(shù)去實現(xiàn)點擊按鈕后的動作
public void onClickName(View view){//onClickName是layout中button標(biāo)簽中onClick元素值
}
4.使用findViewById()獲取layout中“@+id/xx”對應(yīng)元件中的值,如TextView brands = (TextView) findViewById(R.id.brands);
三验烧、State Your Intent
講述建立多個layout的APP如何實現(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">表示這個activity可以用來啟動APP
2.使用intent去start另一個activity碍拆。
import android.content.Intent;
Intent intent = new Intent(Source.this, Target.class);
startActivity(intent);
3.兩個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.每個app響應(yīng)intent:android從每個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來操作多個線程直砂,schedule code,且不會block主thread浩习。
2.解決手機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);
}
使用時,在onCreate開頭谱秽,setContentView后洽蛀,
if(savedInstanceState != null){
----typevalue = savedInstanceState.getType("typevalue");
}
十三、At your service
1.兩種類型的service疟赊,
1. Started service郊供,運行到操作結(jié)束,即使activity destroy自己后近哟,仍會運行驮审。如大文件的下載等。使用時繼承IntentService類吉执。
2. Bound service疯淫,運行周期在bound activity時,可以和activity進行交互戳玫。使用時繼承Service類熙掺。