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.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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)创建及生命周期的更多相关文章

  1. 浅谈Android的Activity运行流程(生命周期)

    关于Android的Activity运行流程,我们可以写一些程序来直观的查看Activity的运行流程.在这里我们使用Log工具来获取Activity运行日志.假如我们新建一个Android项目,Pr ...

  2. Android活动和碎片的生命周期及addToBackStack()方法

    开始学了Android活动的生命周期后又到了碎片的生命周期,就开始有点乱了.又看了一些总结的文章有一个挺详细的:https://blog.csdn.net/lecepin/article/detail ...

  3. Android Small插件化框架解读——Activity注册和生命周期

    通过对嵌入式企鹅圈原创团队成员degao之前发表的<Android Small插件化框架源码分析>的学习,对Android使用的插件化技术有了初步的了解,但还是有很多需要认真学习的地方,特 ...

  4. Android中各组件的生命周期

    1.Activity生命周期图 二.activity三种状态 (1)active:当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于活动状态,同一个 ...

  5. Activity完整的生命周期

    首语:群里看到一位网友说:你能说出Activity的完整生命周期吗?看到这句话,我也在反思自己,我也是个fresh,所以想找个时间仔细的扒一扒Activity生命周期. 首先拿一张简单而又复杂的生命周 ...

  6. Android 页面跳转之生命周期调用顺序问题

    Android Activity 常用技巧 Android Activity 启动模式和任务栈 Android 页面跳转之生命周期调用顺序问题 一.页面跳转逻辑分析 1.1 跳转逻辑分析 Androi ...

  7. Android React Native组件的生命周期及回调函数

    熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开 ...

  8. iOS viewController 和 view 的创建消失生命周期总结

    控制器创建的生命周期 1. 如果从stroryBoard 中产生一个controller,那么会先调用initWithCoder:, awakeFromNib, loadView,viewDidLoa ...

  9. 多个Activity交互的生命周期:

    一.多个Activity交互的生命周期: A Activity打开B Activity的时候:        A Activity                    B Activity     ...

随机推荐

  1. EXPLAIN说明

    列名 类型 解释 id   SELECT语句的ID编号,优先执行编号较大的查询,如果编号相同,则从上向下执行 select_type SIMPLE 一条没有UNION或子查询部分的SELECT语句 P ...

  2. smobiler介绍(二)

    类似开发WinForm的方式,使用C#开发Android和IOS的移动应用?听起来感觉不可思议,那么Smobiler平台到底是如何实现的呢,这里给大家介绍一下. 客户端 Smobiler分为两种客户端 ...

  3. php如何定义数组常量

    是这样吗?<?php define('BEST_PHPER',array('name'=>'巩文','address'=>'china')); My God,明确告诉你不可以:原因是 ...

  4. Python的空行

    函数之间或类的方法之间用空行分隔,表示一段新的代码的开始.类和函数入口之间也用一行空行分隔,以突出函数入口的开始. 空行与代码缩进不同,空行并不是Python语法的一部分.书写时不插入空行,Pytho ...

  5. Azkaban Flow 2.0 使用简介

    官方建议使用Flow 2.0来创建Azkaban工作流,且Flow 1.0将被弃用 目录 目录 一.简单的Flow 1. 新建 flow20.project 文件 2. 新建 .flow 文件 3. ...

  6. RabbitMQ windows 安装后 此时不应有 \RabbitMQ。

    在安装过程中,如果细心实际上在安装的细节显示starting Service后就已经提示这个问题,实际上就是没有注册到RabbitMQ这个服务. 在研究了很久之后才发现原来是安装路径的问题,原先是安装 ...

  7. scrapy实战3利用fiddler对手机app进行抓包爬虫图片下载(重写ImagesPipeline):

    关于fiddler的使用方法参考(http://jingyan.baidu.com/article/03b2f78c7b6bb05ea237aed2.html) 本案例爬取斗鱼 app 先利用fidd ...

  8. C# 中奇妙的函数–6. 五个序列聚合运算(Sum, Average, Min, Max,Aggregate)

    今天,我们将着眼于五个用于序列的聚合运算.很多时候当我们在对序列进行操作时,我们想要做基于这些序列执行某种汇总然后,计算结果. Enumerable 静态类的LINQ扩展方法可以做到这一点 .就像之前 ...

  9. VS2013日常使用若干技巧+快捷键

    1.注释的方法 1)sqlserver中,单行注释:— —   多行注释:/* 代码  */ 2)C#中,单行注释://    多行注释:/* 代码  */ 3)C#中多行注释的快捷方式:先选中你要注 ...

  10. Linux 文件系统的基本结构

    Linux文件系统为一个倒置的树状结构,所有文件或文件夹均包含在一个根目录/中. Linux系统严格区分大小写所以在Linux中:一个名为“A”的文件夹和一个名为“a”的文件夹是不同的两个文件夹,这点 ...