第一章:Android入门
Android系统架构图。
Android四大组件
- Activity
- Service
- Broadcast
- Receiver
《第一行代码:Android》中沿用的是传统的Eclipse+ADT的开发模式。笔者自行百度了解到,谷歌自2013年推出Android的专属开发工具Android Studio,这套开发环境起初并不是很稳定,加上很多Android还是习惯使用Eclipse+ADT的传统开发方式,所以这本书并没有选用。
另外笔者课余时间逛知乎,发现很喜欢的一家公司——小米——内部自2014年开始,也把开发工具换到Android Studio,所以建议新入门的同学使用Android Studio作为开发工具,相对于Eclipse来说 ,Android Studio有诸多的好处,至于好在哪里,可以百度出来一大堆。
开发工具:
- JDK1.8(接触过Java的电脑上都应该已经安装)
- Android SDK——谷歌为开发者封装好的各种类库、API
- ADT(Android Developer Tools)
作为一个Android菜鸟,相信接触的第一个Android程序就是HelloWorld吧!我也不例外。直接根据树上的介绍,ADT会自动帮你创建一个HelloWorld的Android程序,打开上面安装的安卓虚拟机AVD(Android Vitural Device),右键Android项目目录,运行程序,你就会在AVD上看到效果,有木有很激动?
第二章:探究Activity
手动创建Android项目
1. src目录下,建包,包下创建MainActivity的Java类,让该类继承Activity.
2. 在MainActivity类中重写onCreate()方法
3. 创建布局文件layout.xml 布局文件中可以添加Button、TextView等标签
4. 在MainActivity类中的onCreate()方法体中加载layout.xml布局文件。加载布局文件需用setConntentView()方法,将layout.xml作为参数传入setContentView()方法中
5. 在AndroidManifest.xml文件中注册MainActivity.注册标签<activity></activity>
应该在<application></application>
内部来看看Eclipse下和Android下,Android项目目录
对比发现这两张目录结构,第二张的结构明显优于第一张。这里附上一篇很好的Android Document。作者是GitHub大神,膜拜吧!https://github.com/futurice/android-best-practices
Android是使用Task来管理Activity的。一个Task就是一组存放在栈里的Activity集合,这个栈就被称为返回栈(Back Task)。其实这个过程可以理解为,当我们用浏览器打开网页时,按返回键,就会回到上一个未关闭的网页。
Activity在onCreate()和onDestory()之间所经历的是完整生存期,在onStart()和onStop()之间所经历的是可见生存期,在onResume()onPause()之间所经历的是前台生存期。见下图
涉及到Activity的七个方法,其实接触后你会发现,这些方法的用法与Java里面的基本用法并无二致,在创建事件时传入一个匿名内部类、方法重写等。
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroy()
- onRestart()
一个Activity在其生命周期中有四种状态
- 运行状态:当一个Activity位于栈顶时,这是Activity就处于运行状态
- 暂停状态:当一个Activity不在处于栈顶位置,但仍然可见时,这是Activity就进入了暂停状态
- 停止状态:当一个Activity不再处于栈顶位置,并且完全不可见时,这是Activity就进入了停止状态
- 销毁状态:当一个Activity从返回栈中移除后就变成了销毁状态
下面用代码实现,在LogCat
打印日志,以便观察Activity的运行过程。创建一个Android Project,在src目录下建包,在包下分别创建MainActivity、NormalActivity、DialogActivity三个Activity.代码如下
MainActivity
package com.example.activitylifecycletest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
public class MainActivity extends Activity {
public static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);
Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);
startNormalActivity.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, NormalActivity.class );
startActivity(intent);
}
});
startDialogActivity.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DialogActivity.class );
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
}
NormalActivity
package com.example.activitylifecycletest;
import com.example.activitylifecycletest.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
@SuppressLint("SuspiciousImport")
public class NormalActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.normal_layout);
}
}
DialogActivity
package com.example.activitylifecycletest;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
public class DialogActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.dialog_layout);
}
}
紧接着定义这三个Activity的布局xml文件,代码如下
dialog_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This Is A Dialog Activity"
/>
</LinearLayout>
normal_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This Is A Normal Activity"
/>
</LinearLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/start_normal_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start NormalActivity"
/>
<Button
android:id="@+id/start_dialog_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start DialogActivity"
/>
</LinearLayout>
最后,把这三个Activity在AndroidManifest.xml文件中注册,代码如下
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitylifecycletest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity android:name=".MainActivity">
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".NormalActivity">
</activity>
<activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog">
</activity>
</application>
</manifest>
运行程序,LogCat
中就会打印出日志,可以看到点击按钮后,上述七个方法的运行情况。