概述

本文以一个简单的小例子,简述Android开发中Activity的相关知识,仅供学习分享使用。

什么是Activity?

Activity是一个应用程序组件,通常显示为一个页面,用户可以通过Activity进行交互,Activity窗口通常是满屏的,但有时也会比屏幕小。一个App通常有多个Activity组成,但是只有一个Main类型的Activity,作为程序的入口。每次有一个新的Activity启动时,前一个Activity会停止并且被压入堆栈中,因此当用户按下【回退】键时,当前Activity就会从堆栈中弹出并销毁,前一个Activity会恢复显示在当前窗口中。

当一个Activity因为新Activity的启动而停止时,它会通过Activity生命周期的回调函数通知状态的变更。由于某个Activity的状态发生变化,可能接收到多个回调方法,您就可以在各个不同的回调方法中做适合于此状态的工作。如当Activity停止时,应当释放一些占用内存的资源,当活动恢复时,应该重新获取资源,并恢复被阻止的操作。这些都是生命周期的一部分。

涉及知识点

  1. this.findViewById(R.id.bn_click_me) 通过此函数获取页面上的控件,参数为控件ID。
  2. startActivityForResult(intent,REQCODE);  启动Activity并带请求标识符。
  3. onActivityResult(int requestCode, int resultCode, Intent data); 通过重写此方法处理回调程序。
  4. setResult(int resultCode, Intent data) 调用此方法设置返回信息到调用方。
  5. finish() 调用此方法关闭Activity。
  6. setContentView(R.layout.activity_main2); 通过此方法加载Activity对应的资源文件。

Activity的组成

一个新的Activity包含四个组成部分:

  1. 必需继承自Activity或Activity的子类。
  2. 必需重写onCreate(Bundle savedInstanceState) 方法。
  3. 必需有对应的资源布局文件,并在onCreate 方法中,通过 setContentView 方法进行加载。
  4. 必需在App的资源程序清单【AndroidManifest.xml】中进行注册。

如下图所示:

Activity的生命周期

Activity的生命周期,是指一个Activity从创建到消亡的过程。如下图所示,就像人的生命周期一样,只有了解了生命周期的不同阶段,才能在对应的时间节点,做对应的事情。

Activity的整个生命周期,都是发生在Activity launched 和Activity shut down之间,从回调函数上看,发生在 onCreate() 和 onDestroy()之间,如下图所示:

Activity的状态转换如下:

单个Activity的运行日志如下:

 05-25 23:33:18.863 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onCreate----------------
05-25 23:33:18.978 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onStart----------------
05-25 23:33:18.983 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onResume----------------
05-25 23:33:32.810 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onPause----------------
05-25 23:33:33.420 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onStop----------------
05-25 23:33:33.420 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onDestroy----------------

两个Activity运行状态日志如下:

 //显示第一个Activity
05-25 23:35:59.279 16770-16770/? I/DemoActivity: -----------1-----onCreate----------------
05-25 23:35:59.409 16770-16770/? I/DemoActivity: -----------1-----onStart----------------
05-25 23:35:59.413 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onResume----------------
05-25 23:36:04.367 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onPause----------------
//进入第二个Activity
05-25 23:36:04.391 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onCreate----------------
05-25 23:36:04.413 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onStart----------------
05-25 23:36:04.417 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onResume----------------
05-25 23:36:04.855 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onStop----------------
//点击返回键,返回第一个Activity
05-25 23:36:06.872 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onPause----------------
05-25 23:36:06.889 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onRestart----------------
05-25 23:36:06.889 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onStart----------------
05-25 23:36:06.890 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onResume----------------
05-25 23:36:07.181 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onStop----------------
05-25 23:36:07.182 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onDestroy----------------
//再次点击返回键,退出程序
05-25 23:36:08.762 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onPause----------------
05-25 23:36:09.296 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onStop----------------
05-25 23:36:09.296 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onDestroy----------------

Activity之间的传值

Activity之间的传值方式:

  1. Activity之间通过Intent传值。
  2. Activity之间通过Bundle传值。
  3. Activity之间使用Application全局对象传值。
  4. 启动Activity回传对象传值。

Activity之间通过Intent传值,主要用于传递简单类型的数据。

发送方如下:

 Intent intent =new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("Name","张三");
intent.putExtra("Age",30);
startActivity(intent);

接收方如下:

 Intent intent=getIntent();//获取当前Activity对应的Intent
String name= intent.getStringExtra("Name");//获取Intent中存储的值
int age =intent.getIntExtra("Age",0);
tvValue.setText("Name="+name+",Age="+age);//将获取的值显示在TextView中

Activity之间通过Bundle传值

主要用于传递稍微复杂类型的值,具体如下:

发送方:

 Intent intent =new Intent(MainActivity.this,Main2Activity.class);
Bundle bundle=new Bundle();
bundle.putString("Name","张三");
bundle.putInt("Age",30);
intent.putExtras(bundle);
startActivity(intent);

接收方:

 Intent intent=getIntent();//获取当前Activity对应的Intent
Bundle bundle=intent.getExtras();
String name=bundle.getString("Name","");
int age=bundle.getInt("Age",0);
tvValue.setText("Name="+name+",Age="+age);//将获取的值显示在TextView中

Activity之间通过Application全局变量进行传值。

步骤如下:

自定义MyApp类,继承自Application类,自定义两个变量并进行封装成属性。如下所示:

 /**
* Created by Administrator on 2019/5/26.
* 右键Refactor(重构)-->encapsulate Fields (封装属性)
*/
public class MyApp extends Application { private String name; private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

发送方:

 Intent intent =new Intent(MainActivity.this,Main2Activity.class);
myapp= (MyApp) getApplication();
myapp.setName("张三");
myapp.setAge(30);
startActivity(intent);

接收方:

 //通过Application进行传值
MyApp myapp= (MyApp) getApplication();
String name=myapp.getName();
int age=myapp.getAge();
tvValue.setText("Name="+name+",Age="+age);//将获取的值显示在TextView中

通过Application的方式进行传值,需要在AndroidManifest.xml中进行注册,如下图所示:

通过回调函数传值

发送方:

 //定义一个静态变量REQCODE作为标识符,通过startActivityForResult进行调用。
Intent intent =new Intent(MainActivity.this,Main2Activity.class);
startActivityForResult(intent,REQCODE); /**
*通过重写父类的onActivityResult方法接收并处理回传信息
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK){
if(requestCode==REQCODE){
String Res=data.getStringExtra("Res");
Toast.makeText(MainActivity.this,"Res="+Res,Toast.LENGTH_SHORT).show();
}
}
}

接收方:通过调用setResult方法,回传信息

 tvInfo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent1=new Intent();
intent1.putExtra("Res","我是第二个传过来的");
Main2Activity.this.setResult(RESULT_OK ,intent1);
Main2Activity.this.finish();
}
});

备注

纸上得来终觉浅,绝知此事要躬行。

一起学Android之Activity的更多相关文章

  1. Android开发学习之路-该怎么学Android(Service和Activity通信为例)

    在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通 ...

  2. Android 中Activity生命周期分析(二):从AActivity 到BActivity过程分析

    如果你没有动手去演示的话,你一定要去动手试试看,这个东西非学容易出错,面试中经常出现,好了,上代码: package com.king.review.base; import android.app. ...

  3. 学Android开发 这19个开发工具助你顺风顺水

    学Android开发 这19个开发工具助你顺风顺水 要想快速开发一个Android应用,通常会用到很多工具,巧妙利用这些工具,能让我们的开发工作事半功倍,节省大量时间,下面大连Android开发培训小 ...

  4. 一步一步学android控件(之十五) —— DegitalClock & AnalogClock

    原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...

  5. 一步一步学android控件(之十六)—— CheckBox

    根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...

  6. 从零開始学android<数据存储(1)SharedPreferences属性文件.三十五.>

    在android中有五种保存数据的方法.各自是: Shared Preferences Store private primitive data in key-value pairs. 相应属性的键值 ...

  7. 【凯子哥带你学Framework】Activity界面显示全解析(下)

    咱们接着上篇继续讲,上篇没看的请戳:[凯子哥带你学Framework]Activity界面显示全解析(上) 如何验证上一个问题 首先,说明一下运行条件: //主题 name="AppThem ...

  8. 一步一步学android控件(之六) —— MultiAutoCompleteTextView

    今天学习的控件是MultiAutoCompleteTextView . 提到MultiAutoCompleteTextView 我们就自然而然地想到AutoCompleteTextView ,就想知道 ...

  9. 从0系统学Android--2.6 Activity 的最佳实践

    从0系统学Android--2.6 Activity 的最佳实践 本系列文章目录:更多精品文章分类 本系列持续更新中.... 实践中的技巧 2.6.1 知晓当前是在哪个 Activity 这个其实很简 ...

随机推荐

  1. JQUERY多选框,单选框,检查选中的值

    var str=""; $(":checkbox:checked").each(function(){ if($(this).attr("checke ...

  2. ORA-07445 第一參数为:kkqljpmpr

      在版本号11.2.0.1.0上,在pl/sql developer中运行一条SQL会导致连接中断,这样的错误要到trace文件夹下找到错误日志文件,再定位.查了一下资料,是这个版本号的bug. D ...

  3. CentOS笔记-磁盘管理

    Linux磁盘管理常用三个命令为df.du和fdisk. df:列出文件系统的整体磁盘使用量 du:检查磁盘空间使用量 fdisk:用于磁盘分区 df [-ahikHTm] [目录或文件名] -a : ...

  4. hadoop-client

    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --> <dependency> ...

  5. How MySQL Opens and Closes Tables refuse connections 拒绝连接的原因 file descriptors

    MySQL :: MySQL 5.7 Reference Manual :: 8.4.3.1 How MySQL Opens and Closes Tables https://dev.mysql.c ...

  6. Delphi如何实现多国语言

    Delphi里的多语言处理方法都一样, 都是通过资源DLL的形式进行加载处理. Delphi在加载form数据的时候会判断当前的系统语言,然后根据语言加载不同的资源dll, 来实现多国语言的功能. 下 ...

  7. iOS开发UIScrollView常见属性和方法

    一.ScrollView常用方法和属性 @property(nonatomic)CGPoint contentOffset; 设置滚动的偏移量 @property(nonatomic)CGSize c ...

  8. atomic_cmpxchg()/Atomic_read()/Atomic_set()/Atomic_add()/Atomic_sub()/atomi

    [ 1.atomic_read与atomic_set函数是原子变量的操作,就是原子读和原子设置的作用.2.原子操作,就是执行操作的时候,其数值不会被其它线程或者中断所影响3.原子操作是linux内核中 ...

  9. bzoj4149: [AMPPZ2014]Global Warming

    头都烂了怎么头疼啊 考虑先做出对于一个位置以它作为唯一最小值的最远区间,这个可以单调栈上二分搞出来 那么对于一个位置这个区间而言,一定是选择这个区间的最大数是作为最终的唯一最大数最优的 为什么呢?我们 ...

  10. HDU1693 Eat the Trees —— 插头DP

    题目链接:https://vjudge.net/problem/HDU-1693 Eat the Trees Time Limit: 4000/2000 MS (Java/Others)    Mem ...