Android Activity组件及其生命周期

Posted 大雪初晴丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Activity组件及其生命周期相关的知识,希望对你有一定的参考价值。

Activity是什么?

Activity 是用户接口程序,几乎所有的 Activity 都要和用户打交道。

每个 Activity 都提供一个用户界面窗口,一般情况下,该界面窗口会填满整个屏幕,但是也可以比屏幕小,或者浮在其他的窗口之上。

Activity的四种状态,运行状态,暂停状态,停止状态,销毁状态。

Activity的生命周期

名称调用时间
onCreate(Bundle savedInstanceState) 创建 Activity 时调用。

设置在该方法中,还以 Bundle 的形式提供对以前储存的任何状态的访问。其中参数 savedInstanceState 对象是用于保存 Activity 的对象的状态。
onStart() Activity 变为在屏幕上对用户可见时调用。
onResume() Activity 开始与用户交互时调用(无论是启动还是重启一个活动,该方法总是被调用)。
onPause() android 系统要激活其他 Activity 时,该方法被调用,暂停或收回 CPU 和其他资源时调用。
onStop() Activity 被停止并转为不可见阶段时调用。
onRestart() 重新启动已经停止的 Activity 时调用。
onDestroy() Activity 被完全从系统内存中移除时调用。

该方法被调用可能是因为有人直接调用 finish() 方法或者系统决定停止该活动以释放资源。

 

 activity的创建,启动,关闭

1、创建

① 创建继承自Activity的Activity

② 重写需要回调的方法

③ 设置要显示的视图

但这些还不够,我们还要在AndroidManifest.xml文件中对建立的 Activity 进行注册,即在 <application> 标签下添加 <activity> 标签。

对于主 Activity(即入口Activity),还要为其添加 <intent-filter> 标签。(intent是很重要的概念,Activity通过Intent来表达自己的意图)

2、启动

Activity分为入口Activity和其他Activity,他们的启动方式是不同的。

对于入口Activity,只需在AndroidManifest.xml中配置即可。

对于其他Activity,可以添加按钮点击事件,进行跳转,跳转代码如下。

intent = new Intent(MainActivity.this, DemorActivity.class);
startActivity(intent);

3、关闭

在单击事件中添加 finish()方法即可。

对于其他Activity,关闭后返回上一个Activity,若是入口Activity,则会退出程序,返回主屏幕。

平常我们用到刷新功能,可用如下代码完成。

onCreat(null);

多个Activity的使用

 Activity 数据传递共有三种:

  1. 通过 Intent 传递一些简单的数据。
  2. 通过 Bundle 传递相对复杂的数据或者对象。
  3. 通过 startActivityForResult 可以更方便地进行来回传递,当然前两种方法也可以来回传递。

通过bundle在两个Activity传递数据。

package com.example.project_1;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //取值
                String site1 = ((EditText)findViewById(R.id.et_site1)).getText().toString();
                String site2 = ((EditText)findViewById(R.id.et_site2)).getText().toString();
                String site3 = ((EditText)findViewById(R.id.et_site3)).getText().toString();
                String name = ((EditText)findViewById(R.id.et_name)).getText().toString();
                String phone = ((EditText)findViewById(R.id.et_phone)).getText().toString();
                if(!"".equals(site1)&&!"".equals(site2)&&!"".equals(site3)&&!"".equals(name)&&!"".equals(phone)){
                    Intent intent = new Intent(MainActivity.this,AddressActivity.class);
                    //创建Bundle对象,保存输入的信息
                    Bundle bundle = new Bundle();
                    bundle.putCharSequence("name",name);
                    bundle.putCharSequence("phone",phone);
                    bundle.putCharSequence("site1",site1);
                    bundle.putCharSequence("site2",site2);
                    bundle.putCharSequence("site3",site3);
                    intent.putExtras(bundle);
                    startActivity(intent);//传递到AddressActivity中
                }else{
                    Toast.makeText(MainActivity.this,"请将收货地址填写完整",Toast.LENGTH_SHORT).show();
                }
            }
        });

    }
}
View Code
package com.example.project_1;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class AddressActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_address);
        //接收传来的bundle值
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        String name = bundle.getString("name");
        String phone = bundle.getString("phone");
        String site = bundle.getString("site1")+bundle.getString("site2")+bundle.getString("site3");
        TextView tv_name = findViewById(R.id.name);
        TextView tv_phone = findViewById(R.id.phone);
        TextView tv_site = findViewById(R.id.address);
        //输出在xml文件中
        tv_name.setText("姓名:"+name);
        tv_phone.setText("电话:"+phone);
        tv_site.setText("地址:"+site);
    }
}
View Code

 调用另一个Activity并返回结果

实例:选择头像功能。

(在当前Activity点击选择头像按钮,跳转到头像列表Activity,选好后退出该Activity,并将选择结果呈现在主Activity)

package com.example.project_1;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class HeadActivity extends AppCompatActivity {
    //头像资源
    private int[] imageId = new int[]{R.drawable.img01,R.drawable.img02,R.drawable.img03,R.drawable.img04,R.drawable.img05};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_head);
        GridView gridView = findViewById(R.id.grideview);
        BaseAdapter adapter = new BaseAdapter() {//重写监听器方法
            @Override
            public int getCount() {
                return imageId.length;
            }

            @Override
            public Object getItem(int position) {
                return position;
            }

            @Override
            public long getItemId(int position) {
                return position;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ImageView imageView;
                if(convertView==null){
                    imageView = new ImageView(HeadActivity.this);
                    imageView.setAdjustViewBounds(true);
                    imageView.setMaxHeight(150);
                    imageView.setMaxWidth(158);
                    imageView.setPadding(5,5,5,5);
                }else{
                    imageView = (ImageView)convertView;
                }
                imageView.setImageResource(imageId[position]);
                return imageView;
            }
        };
        gridView.setAdapter(adapter);
        //选项被点击的监听器
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = getIntent();
                Bundle bundle = new Bundle();
                bundle.putInt("imageId",imageId[position]);
                intent.putExtras(bundle);
                setResult(0x11,intent);
                finish();
            }
        });
    }
}
View Code

 接下来引入Fragment

Fragment介绍

Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段!想想,如果一个很大的界面,我们 就一个布局,写起界面来会有多麻烦,而且如果组件多的话是管理起来也很麻烦!而使用Fragment 我们可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理!从而可以更加方便的在 运行过程中动态地更新Activity的用户界面!另外Fragment并不能单独使用,他需要嵌套在Activity 中使用,尽管他拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响,比如Activity 被destory销毁了,他也会跟着销毁!

Fragment生命周期:

在Activity中添加Fragment

1、直接在布局文件中添加,用<Fragment></Fragment>组件完成。

2、当Activity运行时添加。

以上是关于Android Activity组件及其生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Android11.4 Fragment及其生命周期

深入剖析Android四大组件——Activity生命周期具体解释

Activity的生命周期

四大组件:Activity生命周期-Android12

四大组件:Activity生命周期-Android12

Android四大组件之Activity的生命周期