什么是Activity

Activity是一种包含用户界面的组件,主要用于和用户进行交互,一个APP通常由多个Activity组成。

每个Activity都对应一个布局文件,通过setContentView()方法来载入布局文件。并且通过用户对布局文件中的组件所发出的事件来做出相应的反映。

Activity的四种状态

1)激活状态,此时activity运行在屏幕前台

2)暂停状态,此时activity失去焦点,但是用户仍然可以看到(例如这个activity上遮盖了一个透明的或者非全屏的activity)

3)停止状态,此时activity被其他activity完全覆盖

4)销毁状态,此时activity将会被系统清理出内存

Activity的回调方法

onCreate()                     创建,activity初次创建时被调用,该方法中一般进行一些静态设置。

onStart()                        运行,activity对用户即将可见的时候调用

onResume()    获取焦点,当activity将要与用户进行交互时候调用

onPause()                      失去焦点,当系统要启动一个其他的activity时调用(在其他activity显示之前调用)

onStop()                         暂停,当另外一个activity恢复并遮盖当前activity,导致其对用户不可见时调用。

onDestroy()    销毁,在activity被销毁前所调用的最后一个方法

onRestart()      重新启动

这七个方法贯穿整个Activity的生命周期。

Activity的生命周期

activity的生命周期可以根据不同的标准分为完整生命周期、可见生命周期和前台生命周期。

完整生命周期:onCreate()创建→onStrart()启动→onResume()获取焦点→onPause()失去焦点→onStop()暂停→onDestroy()销毁

可见生命周期: onStrart()启动→onResume()获取焦点→onPause()失去焦点→onStop()暂停

前台生命周期: onResume()获取焦点→onPause()失去焦点

Activity的启动模式

Activity有四种启动模式:standardsingleTopsingleTasksingleInstance

standard默认启动方式,每开启一个新的activity,就在返回栈的顶端添加一个新的Activity实例,退出时依次退出。

singleTop在启动的时候,如果发现栈顶上是要启动的Activity,则系统不在创建新的Activity。

singleTask在启动的时候,会扫描整个返回栈,如果发现栈中有要启动的Activity,则把这个Activity上所有的Activity统统出栈。

              singleInstance有一个单独的栈来管理这个Activity,不管哪个程序访问这个Activity,都会共同使用这个栈。

Activity值传递

传递值

使用putExtra()方法传递数据,该方法的第一个参数是键,第二个参数是要传递的数据,接收的Activity通过一系列getXXXExtra()方法将值取出使用。

传递对象

intent可以传递Serializable或者Parcelable对象,要传递的对象实现Serializable或者Parcelable接口,就可以将对象传入到一个Bundle中,然后使用intent的putExtra()方法将对象传递过去,接收的Activity通过getSerializableExtra或者getParcelableExtra方法获得对象。

MainActivity.java

package cn.lixyz.activitydemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity { private Button to_activity_button; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
to_activity_button = (Button) findViewById(R.id.to_activity_button);
to_activity_button.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Student student = new Student();
student.setId(10);
student.setName("韩梅梅"); Teacher teacher = new Teacher();
teacher.setId(101);
teacher.setName("王老师"); intent.putExtra("studentBundle", teacher);
intent.putExtra("teacherBundle", student); startActivity(intent); }
});
}
}

SecondActivity.java

package cn.lixyz.activitydemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView; public class SecondActivity extends Activity { private TextView text; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second); Intent intent = getIntent();
Teacher teacher = (Teacher) intent.getSerializableExtra("studentBundle");
Student student = intent.getParcelableExtra("teacherBundle"); Log.d("TTTT", "老师:id=" + teacher.getId() + ",name=" + teacher.getName());
Log.d("TTTT", "学生:id=" + student.getId() + ",name=" + student.getName()); } }

Teacher.java

package cn.lixyz.activitydemo;

import java.io.Serializable;

public class Teacher implements Serializable {
private int id;
private String name; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }

Student.java

package cn.lixyz.activitydemo;

import android.os.Parcel;
import android.os.Parcelable; public class Student implements Parcelable { private int id;
private String name; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public static final Parcelable.Creator<Student> CREATOR = new Creator<Student>() { public Student createFromParcel(Parcel source) {
// TODO Auto-generated method stub
Student stu = new Student();
stu.name = source.readString();
stu.id = source.readInt();
return stu;
} public Student[] newArray(int size) {
// TODO Auto-generated method stub
return new Student[size];
} }; @Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeString(name);
dest.writeInt(id);
} }

  运行结果:

传递值给上一个activity

可以使用startActivityForResutlt()方法来启动另一个activity,而在另外一个activity中,新建一个Intent将要传递的值使用putExtra方法存放到intent中,并且setResult为RESULT_OK,这样,在第一个activity的onActivityResult方法中就可以获取到返回来的值了。

MainActivity.java

package cn.lixyz.activitydemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity { private Button to_activity_button;
public static final int RESULT_CODE = 1; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
to_activity_button = (Button) findViewById(R.id.to_activity_button);
to_activity_button.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Student student = new Student();
student.setId(10);
student.setName("韩梅梅"); Teacher teacher = new Teacher();
teacher.setId(101);
teacher.setName("王老师"); intent.putExtra("studentBundle", teacher);
intent.putExtra("teacherBundle", student); // startActivityForResult(intent, RESULT_CODE);
startActivity(intent);
}
});
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
Log.d("TTTT", "onActivityResult方法运行了");
if (resultCode == -1) {
String resultData = data.getStringExtra("return_data");
Log.d("TTTT", resultData);
}
}
}

SecondActivity.java

package cn.lixyz.activitydemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class SecondActivity extends Activity { private Button button; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second); button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("return_data", "HelloWorld");
setResult(RESULT_OK, intent);
finish();
}
}); } }

当Activity被意外回收时,数据该怎么办?

当一个Activity被pause或者stop的时候,这个Activity的对象实际上还是保存在内存中,因此这个Activity中的信息(成员和状态信息)还可以重新获取到.

如果系统为了整理内存而销毁了整个Activity对象时,系统没法简单的原封不动地恢复先前的Activity对象及其状态信息.

从android手册上来看,Activity中提供了一个方法:onSavedInstanceState(Bundle outState).当系统销毁一个Activity时,会将Activity的状态信息已键值对形式存放在bundle对象中.

第一次启动Activity时,这个bundle对象是空的,null.如果Activity被系统销毁了,然后用户要回退回去看的话,系统会调用这个 Activity的onCreate方法,并把bundle对象传递过去.

这个函数有默认的行为,因此就算你不覆盖它,它在Activity中也有实现.

这回我总算明白了为什么onCreate方法的定义是"protected void onCreate (Bundle savedInstanceState)"这个样子的了.

另外,刚才查看了一下Activity的源码,发现Activity还有个onRestoreInstanceState(Bundle outState)方法.这个方法的描述中也写到在Activity恢复先前保存的状态时会被调用.

Activity转跳之显式Intent和隐式Intent

显式Intent就是我们之前经常使用的直接指定转跳目标的形式,然后我们使用startActivity方法将intent传入就会转跳到我们向要的Activity中去

隐式Intent并不明确的指定我们想要启动哪个Activity,而是指定了一些列的action和category等信息,然后让系统去分析这个intent并找到合适的activity进行转跳。

Android笔记(五十八)Android总结:四大组件——Activity篇的更多相关文章

  1. Android笔记(六十八) Fragment总结

    Fragment的产生: 为了适应各种尺寸的屏幕,谷歌推出Fragment,可以把Fragment成Activity的一个组成部分,它拥有自己的生命周期.可以接收并处理用户的各种事件,还可以动态的增删 ...

  2. Android笔记(十八) 下拉列表(Spinner)

    App中常用的控件——下拉列表(Spinner),提供特定选择供用户选择 Spinner每次只能选择一个部件,它的选项来自于与之相关联的适配器(apater)中. MainActivity.java ...

  3. Android笔记二十四.Android基于回调的事件处理机制

        假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...

  4. Android笔记(六十六) android中的动画——XML文件定义属性动画

    除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在 ...

  5. Android笔记(六十四) android中的动画——补间动画(tweened animation)

    补间动画就是只需要定义动画开始和结束的位置,动画中间的变化由系统去补齐. 补间动画由一下四种方式: 1.AplhaAnimation——透明度动画效果 2.ScaleAnimation ——缩放动画效 ...

  6. Android笔记(十) Android中的布局——表格布局

    TableLayout运行我们使用表格的方式来排列控件,它的本质依然是线性布局.表格布局采用行.列的形式来管理控件,TableLayout并不需要明确的声明包含多少行多少列,而是通过添加TableRo ...

  7. 论文阅读笔记五十八:FoveaBox: Beyond Anchor-based Object Detector(CVPR2019)

    论文原址:https://arxiv.org/abs/1904.03797 摘要 FoveaBox属于anchor-free的目标检测网络,FoveaBox直接学习可能存在的图片种可能存在的目标,这期 ...

  8. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

  9. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    LinearGradient 线性渐变渲染器 LinearGradient中文翻译过来就是线性渐变的意思.线性渐变通俗来讲就是给起点设置一个颜色值如#faf84d,终点设置一个颜色值如#CC423C, ...

随机推荐

  1. ubuntu18.04 无法连接有线

    突然发现Ubuntu无法连接有线,插上网线后还是显示 Cable unplugged. 参考这篇文章:https://zhuanlan.zhihu.com/p/32924819 因为我无线网卡正常工作 ...

  2. ISO/IEC 9899:2011 条款5——环境

    5.环境 1.一个实现在两个不同的数据处理系统环境下分别翻译C源文件与执行C程序,在本国际标准中分别称为翻译环境和执行环境.它们的特征定义并包含了根据顺从标准实现的语法及语义规则所构造的顺从标准的C程 ...

  3. osg::Node位置移动

    osg::Node节点移动的时候,可以使用osg::Matrix::translate  来完成 osg::Matrix::translate中的参数是  当前位置到目标位置需要改变的值,所以,传递参 ...

  4. Nginx 配置 stream SSL 第四层 代理

    场景:服务器F针对访问终端需要添加白名单操作,由到终端数量较多,所以用了一台代理服务器 P,在服务F中添加 服务器P IP地址的白名单,所有终端访问服务器P 由于我已经安装过 Nginx 所以只需要添 ...

  5. c# 并行循环支持 async

    var bag = new ConcurrentBag<object>(); var tasks = myCollection.Select(async item => { // s ...

  6. 【Tools】Myeclise-2018.12.0 最新破解文件

    Myeclise-2018.12.0 最新破解文件. 最近在写android app登录块,需要用到这个工具,顺手就拿到了,发现资源太少.这里分享给大家. 有币高富帅打赏下载地址: https://d ...

  7. Python 内置函数--super()

    描述 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复 ...

  8. linux中安装python3.7

    linux中安装python3.7 1. 安装依赖包 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite- ...

  9. 21 javaweb开发--bug调试技巧

    1.当修改代码后,测试时没有任何效果 解决方案:换个浏览器试试,可能是浏览器缓存的原因.

  10. linux虚拟机IP发生变化之后上面Oracle数据库的处理

    1. 首先说明一下 centos 和 rhel 的关系 redhat是最大的开源软件公司(现在已经被IBM收购) 作为开源最大的受益者,  redhat 自己的 rhel(redhat enterpr ...