Activity详解与实现

一、Activity介绍

Activity是Android应用的四大组件之一(另外三个是Service、BroadcastReceiver和Comtenprovider),而Activity是Android应用最常见的组件之一。一个Android应用往往包括多个Activity,不同的Activity向用户呈现不同的操作界面。Android应用的多个Activity组成Activity栈,当前活动的Activity位于栈顶。
Activity是Android应用中负责与用户交互的组件——大致上可以把它想象成Swing编程中的JFrame控件。不过它与JFrame控件的区别在于:JFrame控件本身可以设置布局管理器,不断向JFrame中添加组件,但Activity只能通过setContentView(View)来显示指定组件。

二、创建Activity

1、新建类继承Activity或其子类

import androidx.appcompat.app.AppCompatActivity;
//创建ActivityTest继承AppCompatActivity
public class ActivityTest extends AppCompatActivity {
}

2 在AndroidManifest.xml中声明新建的Activity

<activity android:name=".ActivityTest"></activity>

3 创建布局并在Activity的OnCreate中设置

创建布局在这里插入图片描述

public class ActivityTest extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置布局
        setContentView(R.layout.activity_test);
    }
}

三、Activity生命周期

当Activity处于Android应用中运行时,它的活动状态有Android以Activity栈的形式管理,当前活动的Activity位于栈顶。随着不同应用的运行,每个Activity都有可能从活动状态转入非活动转态,也可能从非活动转态转入活动转态。

1、Activity生命周期运行过程

从左往右诠释了Activity从创建到运行再到销毁
在这里插入图片描述

  • 在Activity的整个生命周期发生在第一次调用onCreate方法到最后一次调用onDestroy之间。一个Activity将在onCreate方法中完成所有“全局”状态的设置,并在onDestroy方法中释放所有剩余的资源。

  • 在Activity的visible生命周期发生在onStart方法到onStop方法之间相应调用。这两种方法之间,可以维护向用户显示Activity所需的资源。

  • Activity的foreground生命周期发生在onResume方法和onPause方法之间。Activity通常在这两个方法可以在恢复状态和暂停状态之间进行切换。

2、Activity生命周期中方法调用

  • onCreate(Bundle saveStatus):创建Activity时被回调。该方法只会被调用一次。
  • onStart():启动Activity时被回调
  • onRestart():重新启动Activity时被回调。在onStart()方法后一定会回调onResume()方法。
  • onPause():暂停Activity时回调
  • onStop():停止Activity时回调
  • onDestory():销毁Activity时被回调。该方法只会被调用一次
public class ActivityTest extends AppCompatActivity {

    //创建Activity
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        System.out.println("onCreate");
}

    @Override
    protected void onStart() {
        super.onStart();
        System.out.println("onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        System.out.println("onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        System.out.println("onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        System.out.println("onStop");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        System.out.println("onRestart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println("onDestroy");
    }
}

四、Activity的跳转和数据传递

1、显式跳转和隐式跳转

通过Intent(意图)实现Activity的显式跳转和隐式跳转

1.1 显式跳转

显式跳转有四种格式

	//显式跳转
        Intent intent = new Intent(this, BActivity.class);
		startActivity(intent);
		
		//显示跳转		
//        Intent intent = new Intent();
//        intent.setClass(this, BActivity.class);
//        startActivity(intent);

	//通过设置setClassName实现显式跳转,需要传入完整的Activity地址
//        Intent intent = new Intent();
//        intent.setClassName(this, "com.example.test.jump.BActivity");
//        startActivity(intent);

		//通过设置Component实现显式跳转,需要传入完整的Activity地址
//        Intent intent = new Intent();
//        intent.setComponent(new ComponentName(this, "com.example.test.jump.BActivity"));
//        startActivity(intent);

1.2 隐式跳转

1.2.1 隐式Intent图解
在这里插入图片描述
1.2.1 隐式Intent实现
在通过隐式调用时,需要在AndroidManifest中设置对应Activity的action

 <activity android:name=".jump.BActivity">
            <intent-filter>
                <action android:name="com.example.test.jump.BActivity" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
	//隐式调用
      Intent intent = new Intent();
      intent.setAction("com.example.test.jump.BActivity");
      startActivity(intent);

2、Activity之间的数据传递

Activity之间数据的传递可以通过Intent中的putExtra方法传值

 intent.putExtra("szh",1);

也可以通过实例化Bundle类,然后通过Bund的put方法设置自己想要的值,在通过putExtra方法传值

 Bundle bundle = new Bundle();
 bundle.putString("name","szh");
 intent.putExtras(bundle);

五、Activity启动模式

Activity有四种启动模式,在AndroidManifest中设置Activity的android:launchMode属性,设置Activity的启动模式。
android:launchMode属性:

  • standard:标准模式,默认
  • singleTop:Task栈顶复用模式
  • singleTask:Task栈内复用模式
  • singleInstance:全局单例模式

1、standard:

  • Activity是由任务栈管理的,每启动一个Activity,就会被放入栈中,按返回键,就会从栈顶移除一个Activity。
  • standard是默认的启动模式,即标准模式。没启动一个Activity,都会创建一个新的实例
<activity 
            android:name=".jump.BActivity"
            android:launchMode="standard">
            <intent-filter>
                <action android:name="com.example.test.jump.BActivity" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

2、singleTop

  • 当要启动的目标Activity已经位于栈顶时,不会创建新的实例,会复用栈顶的Activity,并且其onNewIntent方法会被调用;如果目标Activity不在栈顶,则跟standard一样创建新的实例。
<activity
            android:name=".jump.BActivity"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="com.example.test.jump.BActivity" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

3、singleTask

  • 在同一个任务栈中,如果要启动的目Activity已经在栈中,则会复用该Activity,并且该Activity上面的Activity会被清除;如果栈中没有,则创建新的实例
<activity
            android:name=".jump.BActivity"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="com.example.test.jump.BActivity" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

4、singleInstance

  • 全局复用,不管哪个Task栈,只要存在目标Activity,就复用。每个Activity占有一个新的Task栈。
<activity
            android:name=".jump.BActivity"
            android:launchMode="singleInstance">
            <intent-filter>
                <action android:name="com.example.test.jump.BActivity" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

作者:沈镇海
原文地址:https://blog.csdn.net/szhjww/article/details/106380987

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值