Activity是Android的门面,可以与用户进行互动的重要模块,凡是在应用中可以看到的东西,都是放在活动中的。
在学习新的技术时,我喜欢将需要学习的技术与自己懂得技术进行类似比较,而活动(Activity)在Java实现上与多线程是类似的,它的一些方法与生命周期都与多线程相似,这会在后面讲,而Layout布局及组价与GUI界面编程类似,组件与事件,而事件就可以理解为活动的一部分。
1:创建Activity:
开始实践。
右键包->new->Activity->Empty Activity 创建一个空活动模板。
Activity Name为活动名称,Generate Layout File勾选自动创建这个活动的Layout布局文件,Layout Name 为布局文件名称,使用默认。
创建完成后的MainActivity活动Java代码。
package com.example.yangchaojie.createactivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
创建完成后的layout/activity_main.xml代码:
<?xml version="1.0" encoding="utf-8"?>
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.yangchaojie.createactivity.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
任何活动创建都需要在app/src/main/AndroidManifest.xml这个XML文件中注册,否则是无法使用的,而使用AndroidStudio进行开发的话,在Activity创建完成时,就已经帮我们自动创建了。
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
其中
<activity android:name=".MainActivity">
activity标签中制定了name .MainActivity是当前活动名称,这里是已包名在定义的,而其中的开头的.就是所有包名的缩写。
先写一个简单的Toast提醒,它可以在应用中向用户显示一些简短的消息。
比如在活动页面中增加一个按钮,让点击按钮之后显示消息。
先在res->Layout->layout/activity_main.xml增加一个按钮。
<Button
android:id="@+id/button_1"
android:text="Click Me!"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
这里指定了这个按钮的id,在接下来会用到。
这是MainActivity活动的代码。
先将Button这个按钮找到,并赋给button,而查找就类似JavaScript中的Document.getElementById。
findViewById顾名思义,是通过ID在视图中查找,返回的是找到的按钮实例。
package com.example.yangchaojie.createactivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button_1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"OK!",Toast.LENGTH_SHORT).show();
}
});
}
}
接着是绑定事件,让按钮点了之后会有反馈。
button.setOnClickListener 表示给按钮注册一个监听器,点击按钮就会执行监听器中的Onclick方法。
Toast的静态方法makeText创建一个文本Toast,由于活动本身就是一个Context对象,所以直接传入MainAvtivity.this,第二个参数便是消息的内容,第三个是显示时长,有两个可以选择,最后.show()方法展示。
运行一下。
2:在活动之间传值
新建活动:Main2Activity 。
现在有两个活动,Main1和Main2,现在想让在Main1的的数据传递到Main2。
修改主活动Main1代码如下:
package com.example.yangchaojie.createactivity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button_1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Toast.makeText(MainActivity.this,"OK!",Toast.LENGTH_SHORT).show();
String name = "ZhagShan";
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("name",name);
startActivity(intent);
}
});
}
}
Intent这个对象很重要,他可以完成很多在关于活动互动的功能。
代码中,Intent对象创建了实例,Main1 和Mian2,很明显了,当前的活动已经与Mian2相关联了。
定义一个字符串,putExtra可以将数据以KV形式存储,和HashMap的put一样的,现在已经将name保持在了Intent中,启动活动。
再看Main2代码:
package com.example.yangchaojie.createactivity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Intent intent = getIntent();
String name = intent.getStringExtra("name");
Log.d("Main2", name);
Toast.makeText(Main2Activity.this,name,Toast.LENGTH_SHORT).show();
}
}
这个里Intent并没有像Main1那样new一个对象,因为Intent在Main1和Main2关联,而在Main2中可以直接获取在Main1中的实例。
接着通过getStringExtra("name")方法,传入键获取值。
log.d打印一下,再用Toast显示一下,活学活用。
结果:
3:返回数据给上一个活动
返回上一个活动需要按下Back键,并没有一个用于启动活动的Intent来传递数据。
在Activity中有一个startActivityForResult()方法,这个方法在活动销毁时能够返回一个结果给上一个活动。
修改Main1代码如下:
package com.example.yangchaojie.createactivity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 1:
if(resultCode == RESULT_OK){
String returnData = data.getStringExtra("data_return");
Toast.makeText(MainActivity.this,returnData,Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button_1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Toast.makeText(MainActivity.this,"OK!",Toast.LENGTH_SHORT).show();
// String name = "ZhagShan";
// Intent intent = new Intent(MainActivity.this,Main2Activity.class);
// intent.putExtra("name",name);
// startActivity(intent);
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
startActivityForResult(intent,1);
}
});
}
}
在按钮被点击时,启动Main2活动。
Main2:
package com.example.yangchaojie.createactivity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class Main2Activity extends AppCompatActivity {
@Override
public void onBackPressed() {
Intent intent =new Intent();
intent.putExtra("data_return","HelloWorld");
setResult(RESULT_OK,intent);
finish();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
// Intent intent = getIntent();
// String name = intent.getStringExtra("name");
// Log.d("Main2", name);
// Toast.makeText(Main2Activity.this,name,Toast.LENGTH_SHORT).show();
Button button = (Button)findViewById(R.id.button_2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putExtra("data_return","HelloWorld");
setResult(RESULT_OK,intent);
finish();
}
});
}
}
Main2中,点击按钮会将Intent放进去一个字符串,setResule是很重要的一个步骤,用来设置返回的数据,将当前的Intent传进去,接着销毁当前活动Main2。
可以看到Main1重载了onActivityResult方法,在此方法中:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 1:
if(resultCode == RESULT_OK){
String returnData = data.getStringExtra("data_return");
Toast.makeText(MainActivity.this,returnData,Toast.LENGTH_SHORT).show();
}
}
}
有三个形参,requestCode主要用来判断数据来源,resultCode即在返回数据是传入的处理结果,Intent 结果。
switch中的requestCode就是Main1中传入的1。
接着用过resultCode的值来判断处理结果是否成功。
返回成功。
如果要在点击Back按键是也返回数据的话,在Main2中重载onBackPressed方法,重新把Intent设置一遍销毁就可以了。
@Override
public void onBackPressed() {
Intent intent =new Intent();
intent.putExtra("data_return","HelloWorld");
setResult(RESULT_OK,intent);
finish();
}
4:活动的生命周期
Android程序是通过Task来管理活动的,准确说是Stack,栈数据结构,是一种后进先出的数据结构。
每个活动生命周期最多有四种状态。
1:运行状态:
当活动压栈到栈顶时,会执行栈顶活动,这个活动此时就是运行状态。
2:暂停状态:
当活动不在栈顶时,但任然可见,处于暂停状态的活动也是系统不希望回收的。
3:停止状态
当活动不在栈顶时,并且完全不可见的时候,就会进入停止状态,系统会为这种活动保存响应的状态和成员变量,有可能被系统回收。
4:销毁状态
当活动从返回栈中移除的时候,便处于销毁状态,系统会回收这种活动,已释放手机内存。
5:活动的生存期
Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节。
onCreate()。顾名思义,在活动创建时调用,比如加载布局,绑定事件。
onStart()。这个方法在活动由可见到不可见时吊桶。
onResume().这个方法在活动准备好与用户交互时调用,活动必须在栈顶,且处于运行状态。
onPause()。这个方法在系统准备启动和恢复另一个活动是调用,通常会在这个方式里面将消耗CPU的资源释放掉,保存关键数据。
onStop()。这个方法会在活动完全不可见时调用,和onPause()方法的主要区别在于,如果启动的新活动,是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法不会。
onDestroy()。这个方法在活动销毁之前调用,之后活动的状态变为销毁状态。
onRestart()。这个方法在活动由停止状态变为运行状态是调用。
6:顺便说一下standard和singleTop
Standard是活动的默认启动方式,比如当前的Main1活动在返回栈中已经存在,那么再次创建Main1的时候系统还是会创建新的活动在返回栈。
Single Top启动模式,如果指定活动为Single Top启动,那么在如果栈顶已经是该活动,则可以直接使用它,不会创建新的活动实例。
- 浅谈Android的Activity运行流程(生命周期)
关于Android的Activity运行流程,我们可以写一些程序来直观的查看Activity的运行流程.在这里我们使用Log工具来获取Activity运行日志.假如我们新建一个Android项目,Pr ...
- Android活动和碎片的生命周期及addToBackStack()方法
开始学了Android活动的生命周期后又到了碎片的生命周期,就开始有点乱了.又看了一些总结的文章有一个挺详细的:https://blog.csdn.net/lecepin/article/detail ...
- Android Small插件化框架解读——Activity注册和生命周期
通过对嵌入式企鹅圈原创团队成员degao之前发表的<Android Small插件化框架源码分析>的学习,对Android使用的插件化技术有了初步的了解,但还是有很多需要认真学习的地方,特 ...
- Android中各组件的生命周期
1.Activity生命周期图 二.activity三种状态 (1)active:当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于活动状态,同一个 ...
- Activity完整的生命周期
首语:群里看到一位网友说:你能说出Activity的完整生命周期吗?看到这句话,我也在反思自己,我也是个fresh,所以想找个时间仔细的扒一扒Activity生命周期. 首先拿一张简单而又复杂的生命周 ...
- Android 页面跳转之生命周期调用顺序问题
Android Activity 常用技巧 Android Activity 启动模式和任务栈 Android 页面跳转之生命周期调用顺序问题 一.页面跳转逻辑分析 1.1 跳转逻辑分析 Androi ...
- Android React Native组件的生命周期及回调函数
熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开 ...
- iOS viewController 和 view 的创建消失生命周期总结
控制器创建的生命周期 1. 如果从stroryBoard 中产生一个controller,那么会先调用initWithCoder:, awakeFromNib, loadView,viewDidLoa ...
- 多个Activity交互的生命周期:
一.多个Activity交互的生命周期: A Activity打开B Activity的时候: A Activity B Activity ...
随机推荐
- Ruby系列文章
安装Ruby.多版本Ruby共存.Ruby安装慢问题 Ruby语言的一些杂项 Ruby中的常量:引号.%符号和heredoc Ruby中的数值 Ruby字符串(1):String基本用法 Ruby字符 ...
- 异常:Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]
内容中包含 base64string 图片造成字符过多,拒绝显示
- 一套简单的web即时通讯——第一版
前言 我们之前已经实现了 WebSocket+Java 私聊.群聊实例,后面我们模仿layer弹窗,封装了一个自己的web弹窗 自定义web弹窗/层:简易风格的msg与可拖放的dialog,生成博客园 ...
- flask 高级编程 上下文与栈(转)
转: https://www.cnblogs.com/wangmingtao/p/9372611.html 22.上下文与出入栈 22.1 请求过程 请求过来,flask会实例化一个Request C ...
- c++ 函数知识点汇总
c++ 函数知识点汇总 swap函数 交换两个数组元素 比如 swap(a[i],a[j]); 就是交换a[i] 和 a[j] 的值 strcpy() 复制一个数组元素的值到另一个数组元素里 strc ...
- 小程序组件-swipe多页切换,并支持下拉刷新,上拉加载,menu动态联动切换
前言 最近一个小程序项目中遇到一个需求,就是实现类似资讯类app的多页面切换的那种效果, 如下图: 最终效果: 1.功能分析 首先实现这个功能分为三步: 实现顶部menu菜单 实现多页面滑动切换 支持 ...
- 基于SpringCloud的Microservices架构实战案例
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- Centos7.4 的yum源库配置。
http://mirrors.163.com/.help/centos.html https://www.cnblogs.com/mchina/archive/2013/01/04/2842275.h ...
- CAD2014学习笔记-常用绘图命令和工具
基于 虎课网huke88.com CAD教程 圆的绘制 快捷键c:选定圆心绘制半径长度的圆 快捷键c + 命令行输入 3p(三点成圆) 2p(两点成圆) t(选定两个圆的切点绘制与两圆相切的圆,第三部 ...
- Neo4j配置文件neo4j.conf
机器配置为256G内存,48核(物理核24)cpu,4T SAS盘(建议磁盘使用SSD) 图数据库Neo4j配置文件neo4j.conf 中常用参数: dbms.active_database=gra ...