什么是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. ubuntu16上部署confluence-6.14.5的迁移

    author:headsen chen date:  2019-10-18  15:02:06 notice :created  by  headsen chen himself and not al ...

  2. IDEA 加载maven工程时

    IDEA首次加载maven文件时,会无法编译,需要更新maven版本才行. 此处选择“add as maven project”. 然后点击maven对话框中的同步按钮,若仍无法更新,需要删除原有配置 ...

  3. Spring cloud微服务安全实战-7-3prometheus环境搭建

    Prmetheus 主要用来做来Metrics的监控和报警,这张图是官方的架构图. 这是他的核心 它的作用是根据我们的配置去完成数据的采集.服务的发现,以及数据的存储. 这是服务的发现,通过Servi ...

  4. 日志分类以及TFIDF

    TF的概念是Term Frequent,是一个单词出现的频率,是一个局部概念,就是这个单词在指定文件中出现的频率,公式如下: 但是呢,这个TF其实很没有说服力,比如the,a之类的频率很高,但是其实不 ...

  5. EasyNVR摄像机网页H5全平台无插件直播流媒体播放服务二次开发之接口鉴权示例讲解

    背景需求 EasyNVR的使用者应该都清楚的了解到,EasyNVR一个强大的功能就是可以进行全平台的无插件直播.主要原因在于rtsp协议的视频流(默认是需要插件才可以播放的)经由EasyNVR处理可以 ...

  6. bitmap以及异或运算法

    一 有40亿个整数,再给一个新的整数,需要判断新的整数是否在1亿个整数中. 此处需要用到bitmap方法,每个整数用一个bit表示,1表示存在,0表示不存在.因此一个4字节的int=32个bit也就是 ...

  7. 系统运维工程师装逼完全指南(转载Mark)

    1.全球化的认证有助于提升逼格,什么OCM.CCIE.RHCA.CISSP等等能考都考,再不济,也要有一张系统架构设计师或者网络规划设计师的信产部认证.每过一个认证,逼格提升一档. 2.TCP/IP协 ...

  8. [LeetCode] 500. Keyboard Row 键盘行

    Given a List of words, return the words that can be typed using letters of alphabet on only one row' ...

  9. golang高级用法总结

    sync.WaitGroup add()  done()  wait() 相当于计数器,done会减一,wait会等待所有线程都执行完才执行下面代码 sync.pool 用来封装连接池

  10. 什么是 Web server

    前端开发人员应该对 Web 开发中的基本概念有一些了解,请简述 什么是 Web 服务器 Web 服务器能做什么 首先我们来了解什么是服务器(server) 一般来说,server 有两重意思 有时候 ...