@stepbystep
2015-01-24T14:26:37.000000Z
字数 13002
阅读 3561
Android
本课程知识点
android:layout_width="match_parent":当前控件的布局宽度(layout_width)为匹配父容器(match_parent)
android:layout_height="match_parent":当前控件的布局高度(layout_height)为匹配父容器(match_parent)
android:layout_width="wrap_content":当前控件的布局宽度为包裹内容(内容有多宽,这个控件就多宽)
android:layout_height="wrap_content":当前控件的布局高度为包裹内容(内容有多高,这个控件就多高)
<!-- @string/hello_world:代表引用R.java文件中的string静态内部类中的hello_world静态成员;
对应的资源在res/values/strings.xml中的
<string name="hello_world">Hello world!</string>
name="hello_world"这个键对应的内容:Hello world!
-->
<TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" />
/*
* 将Activity到用户界面设定为R.layout.activity_main,即
* res/layout/activity_main.xml
* 可在build/generated/source/r/debug/com../R.java下查看layout静态内部类中的activity_main的静态成员
* 对应的是res/layout/activity_main.xml*/
setContentView(R.layout.activity_main);
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
简单的说:Activity就是布满整个窗口或者悬浮于其他窗口上的交互界面。在一个应用程序中通常由多个Activity构成,这每个Activity都需要在AndroidManifest.xml中进行配置,否则会出现无法启动Activity的错误,其中,默认启动的主Activity需要在其<activity> </activity>
标签中加上如下设置
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
当程序第一次运行时用户就会看这个Activity,这个Activity可以通过启动其他的Activity进行相关操作。 注:每个Activity都可以启动一个或多个Activity,而每一个启动的Activity都可以向它的Activity返回信息。
android:theme
activity的样式主题, 如果没有设置,则activity的主题样式从属于应用程序, 参见元素的theme属性
android:name
activity的类名, 必须指定
android.icon
,android:label
等
图解如下:
说明,为了熟悉整个流程,本次实验采用全部手写,不用系统生成功能
本实验需要三个Activity,MainActivity,DialogActivity,CoverActvity
新建工程ActivityLifeCycle, 在Add an Activity to Mobile页面时选择No Activity,进入主界面。
选择Project视图
输入layout_main_activity.xml 选择根节点为LinearLayout
打开layout_maain_activity.xml (app/src/main/res/layout/layout_main_activity.xml)
新建后结果如下
修改内容如下:
app/src/main/res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 什么是线性布局?
线性布局分两种,一种是垂直式,每一行只有一个元素,另一种是水平式,每一列只有一个元素
用android:orientation属性来表示,LinearLayout默认是水平布局。
因此,此时要注意,android:orientation="vertical" 必须要加上-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- Button是一个按钮的控件, text属性表示按钮上显示的文字-->
<Button
android:id="@+id/btn_cover"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="completely cover open"
/>
<Button
android:id="@+id/btn_dialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="dialog mode open"
/>
</LinearLayout>
app/src/main/res/layout/activity_cover.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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="I am CoverActiviy!"/>
</LinearLayout>
<?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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="30dp"
android:text="I am DialogActiviy!"/>
</LinearLayout>
package com.example.shiyanlou.activitylifecycle;
import android.app.Activity;
import android.os.Bundle;
/**
* Created by shiyanlou on 15-1-16.
*/
public class CoverActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cover);
}
}
package com.example.shiyanlou.activitylifecycle;
import android.app.Activity;
import android.os.Bundle;
/**
* Created by shiyanlou on 15-1-16.
*/
public class DialogActitivy extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
}
}
package com.example.shiyanlou.activitylifecycle;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
/**
* Created by shiyanlou on 15-1-16.
*/
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activiy_main);
System.out.println("MainActivity-> onCreate()");
findViewById(R.id.btn_cover).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, CoverActivity.class);
startActivity(intent);
}
});
findViewById(R.id.btn_dialog).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DialogActitivy.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
System.out.println("MainActivity-> onStart()");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("MainActivity-> onStop()");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("MainActivity-> onPause()");
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("MainActivity-> onRestart()");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("MainActivity-> onResume()");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("MainActivity-> onDestroy()");
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.shiyanlou.activitylifecycle">
<application android:allowBackup="true" android:label="@string/app_name"
android:icon="@drawable/ic_launcher" android:theme="@style/AppTheme">
<!-- 注册activity-->
<activity android:name=".MainActivity"
android:label="ActivityLifeCycle">
<intent-filter>
<action android:name="android.intent.action.MAIN"></action>
<category android:name="android.intent.category.LAUNCHER"></category>
</intent-filter>
</activity>
<!-- 注册activity-->
<activity android:name=".CoverActivity"
android:label="CoverActivity">
</activity>
<!-- 注册activity
设置theme为Dialog样式-->
<activity android:name=".DialogActitivy"
android:label="DialogActitivy "
android:theme="@style/Theme.AppCompat.Dialog">
</activity>
</application>
</manifest>
最后的工程结构如下图:
为了方便在logcat查看输出内容,我们先编辑滤器,前面已经讲过。
此后我们可以看到logcat中已经过滤了信息,同时我们将界面返回到home界面(一直按返回键),并清空信息
将logcat拉大,方便查看
运行结果截图: 此处的AcitivityLifeCycle对应Manifest.xml文件中的lable
<!-- 注册activity-->
<activity android:name=".MainActivity"
android:label="ActivityLifeCycle">
点击进入与MainActivity界面,如下:
查看logcat
在Activity启动时函数的调用过程:onCreate--->onStart()--->onResume();
按手机上的返回键(主动销毁当前的Activity)后函数的调用过程:onPause()-->onStop()-->onDestroy();
(如果点击不灵,可以按键盘的Esc键,效果一样)
此处列举一下模拟器和键盘的按键对应关系
键盘按键 | 模拟器对应键 |
---|---|
Home | Home key Home键 |
ESC | Back Key 后退键 |
F2 | Menu key 菜单键 |
F3 | Call key 发送拨号键 |
F4 | End Call key 结束通话或者说 红键 |
上下左右 | 方向键 |
Enter | 确定键 |
Activity的完整声明周期的函数调用过程:
onCreate()-->onStart()-->onResume()--->onPause()-->onStop()--->onDestroy();
启动Activity: onCreate()-->onStart()--->onResume();
按手机上的Home键(返回手机的桌面)调用的方法:onPause()-->onStop();
单击手机上这个程序的桌面图标(重新启动Activity)的函数调用过程:onRestart()-->onStart()-->onResume();
Activity可视生命周期函数的调用过程:onPause()--->onStop()--->onRestart()--->onStart()--->onResume();
Activity启动调用的方法:onCreate()-->onStart()-->onResume();
点击第二个按钮以对话框方式打开新的Activity
效果如下:此处的间隔就是因为padding=30dp
语句的作用
logcat 截图:
此时按手机上的返回键(销毁当前的对话框):
Activity的前台生命周期的调用过程:onPause()---->onResume();
为了测试方便需要修改代码如下:
修改CoverActivity.java如下
package com.example.shiyanlou.activitylifecycle;
import android.app.Activity;
import android.os.Bundle;
/**
* Created by shiyanlou on 15-1-16.
*/
public class CoverActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cover);
System.out.println("CoverActivity -> onCreate()");
}
@Override
protected void onStart() {
super.onStart();
System.out.println("CoverActivity -> onStart()");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("CoverActivity -> onStop()");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("CoverActivity -> onPause()");
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("CoverActivity -> onRestart()");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("CoverActivity -> onResume()");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("CoverActivity -> onDestroy()");
}
}
package com.example.shiyanlou.activitylifecycle;
import android.app.Activity;
import android.os.Bundle;
/**
* Created by shiyanlou on 15-1-16.
*/
public class DialogActitivy extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
System.out.println("DialogActitivy -> onCreate()");
}
@Override
protected void onStart() {
super.onStart();
System.out.println("DialogActitivy -> onStart()");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("DialogActitivy -> onStop()");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("DialogActitivy -> onPause()");
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("DialogActitivy -> onRestart()");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("DialogActitivy -> onResume()");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("DialogActitivy -> onDestroy()");
}
}
重新运行程序
点击第一个按钮 completely cover open(以完全覆盖的方式打开一个新的ActivityB--CoverActivity)
ActivityA.onCreate()--->ActivityA.onStart()--->ActivityA.onResume();
ActivityA.onPause()--->ActivityB.onCreate()-->ActivityB.onStart()--->ActivityB.onResume()--->ActivityA.onStop();
ActivityB.onPause()---->ActivityA.onRestart()--->ActivityA.onStart()-->ActivityA.onResume()--->ActivityB.onStop()-->ActivityB.onDestroy();
点击第二个按钮 打开新的Activity - DialogActivity
- 启动ActivityA:ActivityA.onCreate()--->ActivityA.onStart()--->ActivityA.onResume();
- 以对话框的形式打开ActivityB的函数调用过程:
ActivityA.onPause()-->ActivityB.onCreate()-->ActivityB.onStart()-->ActivityB.onResume();
按手机上的返回键(销毁ActivityB):ActivityB.onPause()--->ActivityA.onResume()--->ActivityB.onStop()--->ActivityB.onDestroy();
如果在按返回键前按手机上的Home键(返回桌面)
ActivityB.onPause()-->ActivityA.onStop()-->ActivityB.onStop();
此时如果点击桌面上的快捷方式后的调用过 程:ActivityA.Restart()-->ActivityA.start()--->ActivityB.onRestart()--->ActivityB.onStart()--->ActivityB.onResume();
Activity启动方式有四种,分别是:
可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题。
设置Activity的启动模式,只需要在AndroidManifest.xml里对应的标签设置android:launchMode属性,例如:
<activity
android:name=".ActivityName"
android:launchMode="standard" />
下面是这四种模式的作用:
参考:http://blog.csdn.net/shinay/article/details/7898492
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。当用户单击多次后会生成很多相同的Activity,造成性能下降
例如:
若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……
点back键会依照栈顺序依次退出。
可以有多个实例,但是不允许多个相同Activity叠加。在每次启动ActivityA时,会首先检查Activity的栈顶是否已经存在ActivityA,如果存在,则重用栈顶的Activity, 不会让新的ActivityA再次入栈.但会首先让栈顶的ActivityA处于暂停状态(onPause()
),之后会调用ActivityA的onNewIntent()
方法,之后栈顶的ActivityA会再次处于运行状态(onResume()
); 当用户多次单击后感觉不清楚
只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。