一、Diving In
1. 一个典型的Android APP组成:Layouts—页面,XML格式;Activity—定义了APP行为,Java code编写;extra resources,APP使用的一些外部组员,如声音、图像文件等。
2.Android平台结构,从下往上。
Linux Kernel,提供驱动、安全和内存管理等功能。
C和C++ libraries,提供上层framwork支持
Android Runtime,运行java程序的虚拟机,每个app一个进程。
Application Framework,提供上层APP接口
Application,上层APP
3.APP结构
root folder就是project名,主要关注的是app folder。
app/build是android studio创建。
app/build/generated/source/r/debug/com.xx.xx/R.java文件,Android使用该文件trackapp的资源内容。
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文件结构
<RelativeLayout></RelativeLayout>标签告诉android按格式显示其中内容。
<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表示将内容显示的big enough。
2.下拉菜单spinner
layout中,使用spinner标签<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标签中加上android:onClick="onClickName",这里的onClickName实际上是activity中click button动作后实现的程序内容的函数名
2. activity初始的函数
public class MainActivity extends Activity{
----protected void onCreate(Bundle savedInstanceState){
--------super.onCreate(savedInstanceState);
--------setContentView(R.layout.activity_main);//告诉android使用哪个layout
----}
}
3.添加一个onClickName函数去实现点击按钮后的动作
public void onClickName(View view){//onClickName是layout中button标签中onClick元素值
}
4.使用findViewById()获取layout中“@+id/xx”对应元件中的值,如TextView brands = (TextView) findViewById(R.id.brands);
三、State Your Intent
讲述建立多个layout的APP如何实现。
1.AndroidManifest.xml文件,所有的acitivy都应该在其中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响应intent:android从每个app的AndroidManifest.xml中查找相应的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>标签中加入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,运行到操作结束,即使activity destroy自己后,仍会运行。如大文件的下载等。使用时继承IntentService类。
2. Bound service,运行周期在bound activity时,可以和activity进行交互。使用时继承Service类。