一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,例如拨号、拍照、发送email、看地图。每一个activity被给予一个窗口,在上面可以绘制用户接口。窗口通常充满屏幕,但也可以小于屏幕而浮于其它窗口之上。
一个应用程序通常由多个activities组成。通常,一个应用程序中的都有一个mainactivity,相当于程序的入口。其他activity从这个activity启动。每一次一个activity启动,前一个activity就停止了,但是系统保留activity在一个栈上(“back stack”)。当一个新activity启动,它被推送到栈顶,取得用户焦点。Back Stack符合简单“后进先出”原则,所以,当用户完成当前activity然后点击back按钮,它被弹出栈(并且被摧毁),然后之前的activity恢复。
关于 android:icon="@drawable/ic_launcher"和android:label="主界面"属性,这两个属性可以在activity上添加,也可以在appliction上添加,两者的区别在于添加到application时,图片和文字是在系统的设置列表中,app目录下面.而在activity上是显示在某个具体的activity上的.
onCreate-->onStart-->onResume-->onPause-->onStop-->onDestory
一个应用程序通常由多个activities组成。通常,一个应用程序中的都有一个mainactivity,相当于程序的入口。其他activity从这个activity启动。每一次一个activity启动,前一个activity就停止了,但是系统保留activity在一个栈上(“back stack”)。当一个新activity启动,它被推送到栈顶,取得用户焦点。Back Stack符合简单“后进先出”原则,所以,当用户完成当前activity然后点击back按钮,它被弹出栈(并且被摧毁),然后之前的activity恢复。
当一个activity因新的activity启动而停止,它被通知这种状态转变通过activity的生命周期回调函数。有许多回调函数一个activity可能会收到,源于它自己的状态变化-无论系统创建它、停止它、恢复它、摧毁它-并且每个回调提供你完成适合这个状态的指定工作的机会。例如,当停止的时候,你的activity应该释放任何大的对象,例如网络数据库连接。当activity恢复,你可以重新获得必要的资源和恢复被中断的动作。这些状态转换都是activity的生命周期的部分.
一 创建一个activity
定义一个类继承activity类,并且在清单文件中注册这个类.新创建的activity,必须在清单文件中做配置,否则系统找不到,在显示时会直接报错.
1.定义一个类
public class SecondActivity extends Activity
2.在清单文件中注册这个类
<activity
android:name="com.itheima.createactivity.MainActivity"
android:icon="@drawable/photo3"
android:label="activity" ></activity>
关于 android:icon="@drawable/ic_launcher"和android:label="主界面"属性,这两个属性可以在activity上添加,也可以在appliction上添加,两者的区别在于添加到application时,图片和文字是在系统的设置列表中,app目录下面.而在activity上是显示在某个具体的activity上的.
一般地,每个apk都会有一个activity加上下面的过滤器,表示这个activity是程序的入口.就是打开app第一个进入的页面.
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
3.创建一个布局文件,并将这个布局文件设置给新建的activity
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
二 activty的生命周期
来看看谷歌官方的图片
简要概述如下:
void onCreate(): Activity已经被创建完毕
void onStart(): Activity已经显示在屏幕,但没有得到焦点
void onResume(): Activity得到焦点,可以与用户交互
void onPause(): Activity失去焦点,无法再与用户交互,但依然可见 比如第二个页面背景透明 还能看到第一个页面,但失去焦点,无法与用户交互
void onStop(): Activity不可见,进入后台
void onDestroy():Activity被销毁
void onRestart(): Activity从不可见变成可见时会执行此方法
完整生命周期(entire lifetime)
void onResume(): Activity得到焦点,可以与用户交互
void onPause(): Activity失去焦点,无法再与用户交互,但依然可见 比如第二个页面背景透明 还能看到第一个页面,但失去焦点,无法与用户交互
void onStop(): Activity不可见,进入后台
void onDestroy():Activity被销毁
void onRestart(): Activity从不可见变成可见时会执行此方法
onCreate-->onStart-->onResume-->onPause-->onStop-->onDestory
可视生命周期(visible lifetime)
onStart-->onResume-->onPause-->onStop
前台生命周期(foreground lifetime)
onResume-->onPause
onStart-->onResume-->onPause-->onStop
前台生命周期(foreground lifetime)
onResume-->onPause
注意:
* 内存不足时,系统会优先杀死后台Activity所在的进程,都杀光了,如果内存还是不足,那么就会杀死暂停状态的Activity所在的进程,如果还是不够,有可能杀死前台进程
* 如果有多个后台进程,在选择杀死的目标时,采用最近最少使用算法(LRU)
* data 指定数据(操作什么内容) scheme的值可以随便写 不过用时intent.setData(Uri.parse("asd:qwe"));中的前缀asd必须相同。否则无法启动activity
如果不写scheme属性,直接写android:mimeType="aa/bb"在启动的时候要intent.setType("aa/bb");这样设置才能对应到android:mimeType="aa/bb"
intent.setType("aa/bb") 会清除掉intent.setData()里面设置的值。这两个API是不能共存的
* category 类别 (默认类别,机顶盒,车载电脑)
* 隐式意图启动Activity,需要为intent设置以上三个属性,且值必须与该Activity在清单文件中对三个属性的定义匹配
activity下的intent-filter节点及intent-filter其子节点都可以同时定义多个,隐式启动时只需与任意一个匹配即可启动这个activity
* 如果系统中存在多个Activity的intent-filter同时与你的intent匹配,那么系统会显示一个对话框,列出所有匹配的Activity,由用户选择启动哪一个
* 再启动效率上,隐式远远低于显式
* 内存不足时,系统会优先杀死后台Activity所在的进程,都杀光了,如果内存还是不足,那么就会杀死暂停状态的Activity所在的进程,如果还是不够,有可能杀死前台进程
* 如果有多个后台进程,在选择杀死的目标时,采用最近最少使用算法(LRU)
三 activity跳转
安卓利用Intent(意图)来沟通组件,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。activity跳转分为显示跳转和隐式跳转.
3.1显式意图跳转
通过设置Activity的包名和类名实现跳转,称为显式意图.如下:
* 跳转至同一项目下的另一个Activity,直接指定该Activity的字节码即可
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);
startActivity(intent);
* 跳转至其他应用中的Activity,需要指定该应用的包名和该Activity的类名
//显示跳转到拨号器
Intent intent = new Intent();
//启动系统自带的拨号器应用
intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
startActivity(intent);
3.2隐式意图跳转
就是通过设置意图的action进行跳转
* 隐式意图跳转至指定Activity
Intent intent = new Intent();
//启动系统自带的拨号器应用
intent.setAction(Intent.ACTION_DIAL);
startActivity(intent);
自定义activity进行隐式跳转.要让一个Activity可以被隐式启动,需要在清单文件的activity节点中设置intent-filter子节点.在跳转时startactivity(intent)时查清单文件搜索action的name值 和category的值是否匹配,匹配就跳转.
<intent-filter >
//name值随便写,大概写成包名就可以了 为这个activity定义一个动作名
//name 的值就是动作名,需要动作名时写这个
<action android:name="com.itheima.second"/>
//必须要写,不写跳不过来
<category android:name="android.intent.category.DEFAULT"/>
//mineType可以自己定义 如:text/username
//要想完全匹配这样2个属性的节点 代码中必须intent.setDataAndType(Uri.parse("asd:qwe123"), "aa/bb");这样写
<data android:scheme="asd" android:mimeType="aa/bb"/>
</intent-filter>
* action 指定动作(可以自定义,可以使用系统自带的)
* data 指定数据(操作什么内容) scheme的值可以随便写 不过用时intent.setData(Uri.parse("asd:qwe"));中的前缀asd必须相同。否则无法启动activity
如果不写scheme属性,直接写android:mimeType="aa/bb"在启动的时候要intent.setType("aa/bb");这样设置才能对应到android:mimeType="aa/bb"
intent.setType("aa/bb") 会清除掉intent.setData()里面设置的值。这两个API是不能共存的
* category 类别 (默认类别,机顶盒,车载电脑)
* 隐式意图启动Activity,需要为intent设置以上三个属性,且值必须与该Activity在清单文件中对三个属性的定义匹配
activity下的intent-filter节点及intent-filter其子节点都可以同时定义多个,隐式启动时只需与任意一个匹配即可启动这个activity
<activity>
可以都多个,只要匹配其中一个就能启动这个activity
<intent-filter ></intent-filter >
<intent-filter ></intent-filter >
<intent-filter ></intent-filter >
<intent-filter ></intent-filter >
</activity>
3.3显式意图和隐式意图的应用场景
* 显式意图用于启动同一应用中的Activity, 隐式意图用于启动不同应用中的Activity* 如果系统中存在多个Activity的intent-filter同时与你的intent匹配,那么系统会显示一个对话框,列出所有匹配的Activity,由用户选择启动哪一个
* 再启动效率上,隐式远远低于显式
3.4 跳转activity时携带数据
* Activity通过Intent启动时,可以通过Intent对象携带数据到目标Activity
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("maleName", maleName);
intent.putExtra("femaleName", femaleName);
startActivity(intent);
* 在目标Activity中取出数据
Intent intent = getIntent();
String maleName = intent.getStringExtra("maleName");
String femaleName = intent.getStringExtra("femaleName");
3.5跳转一个activity并返回一个结果
从A界面打开B界面, B界面关闭的时候,返回一个数据给A界面
步骤:
1. 开启activity并且获取返回值
startActivityForResult(intent, 0);
2. 在新开启的界面里面实现设置数据的逻辑
Intent data = new Intent();
data.putExtra("phone", phone);
//设置一个结果数据,数据会返回给调用者
setResult(0, data);
finish();//关闭掉当前的activity,才会返回数据
3. 在开启者activity里面实现方法
onActivityResult(int requestCode, int resultCode, Intent data)
通过data获取返回的数据
4. 根据请求码和结果码确定业务逻辑
步骤:
1. 开启activity并且获取返回值
startActivityForResult(intent, 0);
2. 在新开启的界面里面实现设置数据的逻辑
Intent data = new Intent();
data.putExtra("phone", phone);
//设置一个结果数据,数据会返回给调用者
setResult(0, data);
finish();//关闭掉当前的activity,才会返回数据
3. 在开启者activity里面实现方法
onActivityResult(int requestCode, int resultCode, Intent data)
通过data获取返回的数据
4. 根据请求码和结果码确定业务逻辑