Activity详解-程序员宅基地

技术标签: android  

目录

 

Activity的生命周期

生命周期方法

Activity的启动模式

Activity之间的跳转与传值

Intent(Activity之间的跳转)

显式跳转

 

隐式跳转

Activity之间的传值

Activity之间的数据回传

activity调用传值实例

效果

界面


Activity的生命周期

生命周期方法

方法名称 方法作用
onCreate 表示Activity已经被创建,一般在这个方法中做一些初始化的工作,比如调用setContentView去加载布局资源或者初始化Activity所需的数据。
onStart 表示Activty已经被启动,已经可见,但是此时还处于后台,不能与用户进行交互。
onResume 表示Activty已经被启动,已经可见,但是此时还处于后台,不能与用户进行交互
onPause 当前Activity被其他活动的Activity覆盖时或锁屏时调用
onStop 在Activity对用户不可见时调用
onDestory

在Activity被销毁时调用;注意:在使用手机时会根据不同情况进行横竖屏切换。当手机横竖屏切换时,会根据清单文件AndroidManifest.xml文件中的configChanges属性不同而调用不同的生命周期

 

在使用默认属性时,调用的方法顺序依次时:onCreate,onStart,onResume

 

当进行横竖屏切换时,调用的方法依次时:onPause,onStop,onDestory,onCreate,onStart,onResume

onRestart 当从新启动的Activity返回原来的Activity时,原来的Activity会调用此方法。表示Activity正在重新启动。

Activity的启动模式

  众所周知当我们多次启动同一个Activity时,系统会创建多个实例,并把它们按照先进后出的原则一一放入任务栈中,当我们按back键时,就会有一个activity从任务栈顶移除,重复下去,直到任务栈为空,系统就会回收这个任务栈。但是这样以来,系统多次启动同一个Activity时就会重复创建多个实例,这种做法显然不合理,为了能够优化这个问题,Android提供四种启动模式来修改系统这一默认行为。

启动模式 作用 设置
standard  这个模式是默认的启动模式,即标准模式,在不指定启动模式的前提下,系统默认使用该模式启动Activity,每次启动一个Activity都会重写创建一个新的实例,不管这个实例存不存在,这种模式下,谁启动了该模式的Activity,该Activity就属于启动它的Activity的任务栈中。这个Activity它的onCreate(),onStart(),onResume()方法都会被调用。
<activity android:name=".standard.StandardActivity" android:launchMode="standard" > 

 

singleTop      这个模式下,如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent方法会被调用,通过此方法的参数我们可以去除当前请求的信息。如果栈顶不存在该Activity的实例,则情况与standard模式相同。需要注意的是这个Activity它的onCreate(),onStart()方法不会被调用,因为它并没有发生改变。
<activity android:name=".singletop.SingleTopActivity" android:launchMode="singleTop">

 

singleTask 这个模式十分复杂,有各式各样的组合。在这个模式下,如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,并且会回调该实例的onNewIntent方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。
<activity android:name=".singleTask.SingleTaskActivity" android:launchMode="singleTask" >

 

singleInstance    该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。
<activity android:name=".singleinstance.SingleInstanceActivity" android:launchMode="singleInstance" >

 

Activity之间的跳转与传值

Intent(Activity之间的跳转)

在Android系统中,每个应用程序通常都是由许多个界面组成,每个界面就是一个Activity,在这些界面进行跳转时,实际上也就是Activity之间的跳转,Activity之间的跳转需要使用到Intent组件

显式跳转

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创建intent对象,参数1是当前activity的引用,参数2是要跳转的activity的类型
        Intent intent=new Intent(this,OtherActivity.class);
        // 跳转
        this.startActivity(intent);
    }


}

 

隐式跳转

隐式意图相比显式意图来说更为抽象,它并没有明确指定要开启那个控件,而是通过actioncategory等属性信息,系统根据这些信息来进行分析,然后寻找目标

一般我么可以通过设置Intent组件的action属性,来打开android内置的一些软件,例如:相机,浏览器,等等

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent=new Intent();
        // 设置action动作,该动作要和清单文件中设置的一样
        intent.setAction("android.intent.action.MAIN");
        this.startActivity(intent);
    }


}

 

 

Activity之间的传值

通过Intent组件附带参数实现传值

// 创建Intent对象
Intent intent=new Intent(occurpy,CaculateActivity.class);
// 携带数据
intent.putExtra("data","content");
// 跳转
startActivity(intent);

Intent对象提供了很多重载的方法供我们使用

 

获取跳转页面附带的参数

// 获取intent信息
Intent intent=getIntent();
// 里面附带的参数
String data = intent.getStringExtra("data_name");

 

Activity之间的数据回传

在Activity中,使用Intent 既可以将数据传给下一个Activity,还可以将数据回传给上一个Activity。通过查阅API文档可以发现,Activity中提供了一个startActivityForResult(Intent intent,int requestCode)方法,该方法也用于启动Activity,并且这个方法可以在当前Activity 销毁时返回一个结果给上一个 Activity。这种功能在实际开发中很常见,例如发微信朋友圈时,进入图库选择好照片后,会返回到发表状态页面并带回所选的图片信息。

 

startActivityForResult(Intent intent,int requestCode)方法接收两个参数,第1个参数是Intent对象,第2个参数是请求码,用于判断数据的来源,输入一个唯一值即可。

 


在Activity01里面跳转至Activity02

// 创建Intent信息
Intent intent=new Intent(occurpy,CaculateActivity.class);
// 使用activtiy的startActivityForResult方法跳转,第二参数是请求码,第二方数据回传时我们通过requestCode来判断是哪个页面
startActivityForResult(intent,100);

接下来在Activity中添加返回数据的示例代码:

// 创建一个Intent对象,附加返回数据
Intent intent=new Intent();
intent.putExtra("extra_data","hello activity");
// 返回数据,第一个参数是响应码,一般是"0 或者 1",参数2是把带有参数的Intent传递进去
setResult(1,intent);
// 只有在被调用的activity被销毁的时候,才会触发本来的activity的方法,所以我们需要手动调用一finish
finish();

在Activity01中重写onActivityResult方法来得到返回数据,因为在Activtiy02被销毁时会回调Activity01的onActivityResult方法

 

 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // 通过判断请求码以判断是从哪个activity传递回来
        // 因为通常我们会调用很多不同的页面,而被调用的页面最终传递数据都会回调当前方法
        if(requestCode==100){
            if(resultCode==1){
                String result=data.getStringExtra("result");
                edit02.setText(result);
            }
        }

       
    }

 

activity调用传值实例

1.我们使用Intent进行传值,传输数据给第二个页面,第二个页面计算完再返回第一个页面

2.调用系统相机拍照,显式在当前页面

 

效果

 

界面

源码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

   <EditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:hint="输入一些数字,用空格隔开"
       android:layout_marginTop="60dp"
       android:id="@+id/edit01"></EditText>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_below="@+id/edit01"
        android:id="@+id/line01"
        android:gravity="center_horizontal">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="点击求取平均值"
            android:id="@+id/btn01"></Button>

    </LinearLayout>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="计算的结果将显式在这里"
        android:layout_marginTop="60dp"
        android:id="@+id/edit02"
        android:layout_below="@+id/line01"></EditText>

    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:id="@+id/img01"
        android:layout_below="@+id/edit02"
        android:src="@color/colorPrimary"
        android:layout_centerHorizontal="true"></ImageView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_below="@+id/img01"
        android:id="@+id/line02"
        android:gravity="center_horizontal">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="点击拍照"
            android:layout_marginTop="20dp"
            android:id="@+id/btn02"></Button>

    </LinearLayout>

</RelativeLayout>

MainActivity

public class MainActivity extends AppCompatActivity {

    // 声明
    private AppCompatActivity occurpy;

    private Button btn_caculate;
    private Button btn_camera;

    private EditText edit01;
    private EditText edit02;

    private ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 绑定
        occurpy=this;
        btn_caculate=this.findViewById(R.id.btn01);
        btn_camera=this.findViewById(R.id.btn02);
        edit01=this.findViewById(R.id.edit01);
        edit02=this.findViewById(R.id.edit02);
        img=this.findViewById(R.id.img01);

        btn_caculate.setOnClickListener(new View.OnClickListener() {

            // 请求跳转其他界面进行运算
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(occurpy,CaculateActivity.class);
                Log.i("cn.liuhao.application",edit01.getText().toString());
                intent.putExtra("data",edit01.getText().toString());
                occurpy.startActivityForResult(intent,200);
            }
        });

        btn_camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent=new Intent();
                intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
                occurpy.startActivityForResult(intent,300);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // 在其他activity回显数据时,会使用到onActivityResult
        if(requestCode==200){
            if(resultCode==200){
                String result=data.getStringExtra("result");
                edit02.setText(result);
            }
        }

        if(requestCode==300){
            Bundle extras=data.getExtras();
            Bitmap photo=extras.getParcelable("data");
            img.setImageBitmap(photo);

            try {
                FileOutputStream out=openFileOutput("a.jpeg", Activity.MODE_PRIVATE);
                photo.compress(Bitmap.CompressFormat.JPEG,75,out);
                out.close();
            }catch (Exception e){
                e.printStackTrace();
            }


        }
    }
}

 

caculateActivity

public class CaculateActivity extends AppCompatActivity {

    private TextView txt01;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_caculate);

        // 接受数据
        Intent intent=getIntent();
        String data = intent.getStringExtra("data");
        Log.i("cn.liuhao.application",data);
        txt01=this.findViewById(R.id.txt01);

        // 分隔字符串
        String[] split = data.split("\\s+");
        double sum=0;
        for(String item : split)
        {
            txt01.setText(txt01.getText()+"+"+item);
            // 计算
            sum+=Double.parseDouble(item);
        }

        Intent re=new Intent();
        re.putExtra("result",String.valueOf(sum));
        this.setResult(200,re);
        this.finish();

    }
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42418169/article/details/115090626

智能推荐

最长上升子序列&&最长不下降子序列-程序员宅基地

文章浏览阅读99次。百练2757: 题目描述: 对于给定的序列,求出最长上升子序列的长度。题目链接:http://bailian.openjudge.cn/practice/2757解题思路一、动态规划 1. 找子问题错误找法: “求序列的前n个元素的最长上升子序列的长度”是个子问题,但这样分解子问题,不具有“无后效性” 假设F(n) = x,但可能有多个序列满足F(n)..._. s,c; xm,xadnn/ or 0

NetWork——描述一次完整的网络请求过程_浏览器network发起请求历程-程序员宅基地

文章浏览阅读4.9k次。想拥有自己的服务器?价钱太贵,便宜的配置太低。。。总是处于各种原因,现在特大好消息,阿里云服务器活动,价钱低到爆,快来了解下,2核4G,3年低至699,时间有限,还剩10天,快来选购吧,地址:https://promotion.aliyun.com/ntms/act/vm/aliyun-group/buy.html?group=IAq264WFLl当我们在浏览器的地址栏输入 www.lin..._浏览器network发起请求历程

分享几个好用到爆的 Python 内置模块_python内置模块-程序员宅基地

文章浏览阅读1.9k次。今天介绍几个好用到爆的Python内置库,相信大家看过之后会对今后的Python编程帮助多多,喜欢记得收藏、点赞、关注。argparsePython当中的argparse模块主要用于命令行的参数解析,可以帮助用户轻松地编写命令行接口,我们先来看一个例子import argparse# 解析参数parser = argparse.ArgumentParser()parser.add_argument("name")args = parser.parse_args()# 打印结果print_python内置模块

python代码基础知识总结(一)(python高阶函数与格式化输出)_python f ' {app_type}-{region}-程序员宅基地

文章浏览阅读1.3k次。机器视觉python代码基础知识总结(一)一、理论简述个人认为机器视觉可以作为人工智能的一大分支,尤其是随着深度学习、卷积神经网络、残差网络的出现,导致机器对图像识别精度高于了人类。因此,可以说机器视觉是人工智能的目前相对十分成熟的应用。下面的表格从IPO层面介绍了各种领域之间的关系,这里分别包含的有数据图像处理(Digital Image Processing)、计算机视觉(Computer Vision)、计算机图形学(Computer Graphics)、人工智能(Artificial Inte_python f ' {app_type}-{region}

New的VC编译器实现_编译器new实现-程序员宅基地

文章浏览阅读2.2k次。当我们调用 new 的时候,例如 int *p = new int; 时,编译器到底作了什么工作呢?跟进断点看一看。 (在vc debug模式下)double *p1 = new double;00411A6E push 8 00411A70 call _编译器new实现

最强大脑玲珑拼图游戏 java编程_最强大脑游戏代码-程序员宅基地

文章浏览阅读171次。java编程解决最强大脑玲珑拼图_最强大脑游戏代码

随便推点

matlab如何解不等式,如何用MATLAB求解不等式组的所有可能解-程序员宅基地

文章浏览阅读2k次。太多了吧:No. a b c d1 4 86 17 652 13 96 20 873 5 97 56 544 4 32 14 ..._matlab 不等式组求解

2022年09月 Scratch图形化(三级)真题解析#中国电子学会#全国青少年软件编程等级考试_2022年9月scratch三级真题-程序员宅基地

文章浏览阅读273次,点赞4次,收藏4次。所以,答案D是错误的。两个角色小猫和小狗,给小猫创建一个仅适用于当前角色的变量“奔跑速度”,给小狗也创建一个仅适用于当前角色的变量“奔跑速度”,小猫和小狗程序如下图所示,点击绿旗,按下两次空格键,小猫和小狗的奔跑速度都变为7。运行程序后角色将从(0,0)点开始移动,x和y坐标的增加值均在1至10之间,因此,移动后的位置为点(1,1),(1,10),(10,1)和(10,10)所围成的四边形中。D:“我的变量”和计时器一起增加,当“我的变量”大于15时,计时器会归零,“我的变量”会随着计时器重新开始增加。_2022年9月scratch三级真题

Spring Security 如何实现身份认证和授权?_spring security认证和授权流程-程序员宅基地

文章浏览阅读2.7k次,点赞5次,收藏6次。Spring Security 是一个非常强大的安全框架,可以为 Spring Boot 应用提供完整的身份认证和授权功能。本文介绍了 Spring Security 如何实现身份认证和授权,并提供了示例代码。使用 Spring Security 可以非常方便地保护应用程序,防止恶意攻击和数据泄露。_spring security认证和授权流程

Linux Imagemagick 安装_linux imagemagick 安装目录-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏16次。ImageMagick 是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布。它遵守GPL许可协议。它可以运行于大多数的操作系统。ImageMagick的大多数功能的使用都来源于命令行..._linux imagemagick 安装目录

Android官方文档—APP清单(permission-group)_android permission-group-程序员宅基地

文章浏览阅读908次。&lt;permission-group&gt;语法:&lt;permission-group android:description="string resource" android:icon="drawable resource" android:label="string resource" ..._android permission-group

centos8显示磁盘占满,但实际磁盘未占满(服务器BUG问题)_centos本机磁盘满了 实际占用比没那么多-程序员宅基地

文章浏览阅读688次。今天阿里云的一台centos8服务器的出现了显示磁盘占满,但实际磁盘未占满的问题,截了一些相关的图片阿里云监控截图个人解决方法:查了一些网上的说法,使用重启服务器的方法,解决了这个问题,但不太明白产生这个问题的原因。..._centos本机磁盘满了 实际占用比没那么多