Activity详解

目录

 

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();

    }
}

 

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java 中,ActivityAndroid 应用程序的核心组件之一。它代表了用户与应用程序交互的一个屏幕,类似于 Windows 中的窗口。Activity 提供了一个用户界面,用于显示应用程序的内容,并处理用户输入。在本文中,我们将详细介绍 Java 中的 Activity。 1. Activity 的生命周期 Activity 的生命周期是指从创建到销毁的整个过程。Activity 的生命周期可以分为以下几个部分: 1.1. 创建阶段 在创建阶段,Activity 将完成以下几个步骤: 1.1.1. onCreate():当 Activity 被创建时,系统会调用 onCreate() 方法。在此方法中,开发者可以初始化 Activity 的布局、绑定事件等。 1.1.2. onStart():当 Activity 准备好与用户进行交互时,系统会调用 onStart() 方法。在此方法中,开发者可以完成一些初始化工作,例如开始动画。 1.1.3. onResume():当 Activity 成为用户焦点并可以与用户进行交互时,系统会调用 onResume() 方法。在此方法中,开发者可以开始处理用户输入事件。 1.2. 运行阶段 在运行阶段,Activity 将完成以下几个步骤: 1.2.1. onPause():当 Activity 失去焦点并不再与用户进行交互时,系统会调用 onPause() 方法。在此方法中,开发者可以停止处理用户输入事件。 1.2.2. onStop():当 Activity 不再可见时,系统会调用 onStop() 方法。在此方法中,开发者可以完成一些清理工作,例如停止动画。 1.3. 销毁阶段 在销毁阶段,Activity 将完成以下几个步骤: 1.3.1. onDestroy():当 Activity 被销毁时,系统会调用 onDestroy() 方法。在此方法中,开发者可以完成一些清理工作,例如释放资源。 2. Activity 的启动方式 在 Java 中,可以通过以下方式启动一个 Activity: 2.1. 显式启动 显式启动是指通过明确指定要启动的 Activity 的类名来启动 Activity。例如: ```java Intent intent = new Intent(this, AnotherActivity.class); startActivity(intent); ``` 2.2. 隐式启动 隐式启动是指通过指定 Action、Category、Data 等信息来启动 Activity,系统将根据这些信息匹配合适的 Activity。例如: ```java Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.example.com")); startActivity(intent); ``` 3. Activity 的传值 在 Java 中,可以通过 Intent 对象来传递数据到另一个 Activity。具体步骤如下: 3.1. 在发送 Intent 时,通过 putExtra() 方法来添加数据: ```java Intent intent = new Intent(this, AnotherActivity.class); intent.putExtra("name", "张三"); intent.putExtra("age", 18); startActivity(intent); ``` 3.2. 在接收 Intent 时,通过 getIntent() 方法获取 Intent 对象,并通过 getXXXExtra() 方法获取数据: ```java Intent intent = getIntent(); String name = intent.getStringExtra("name"); int age = intent.getIntExtra("age", 0); ``` 4. Activity 的返回值 在 Java 中,可以通过 startActivityForResult() 方法启动一个 Activity,并在该 Activity 中设置 setResult() 方法来返回数据。具体步骤如下: 4.1. 在发送 Intent 时,通过 startActivityForResult() 方法启动另一个 Activity: ```java Intent intent = new Intent(this, AnotherActivity.class); startActivityForResult(intent, REQUEST_CODE); ``` 4.2. 在接收 Intent 时,通过 onActivityResult() 方法获取返回的数据: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { String result = data.getStringExtra("result"); } } ``` 4.3. 在被返回的 Activity 中,通过 setResult() 方法设置返回的数据: ```java Intent intent = new Intent(); intent.putExtra("result", "返回数据"); setResult(RESULT_OK, intent); finish(); ``` 以上就是 Java 中 Activity详解,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值