Activity详解

Posted 修心_666

tags:

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

Activity概述

​ 一个应用程序通常由多个彼此之间松耦合的Activity组成。通常,有一个Activity被指定为主Activity。当应用程序第一次启动的时候,该Activity会显示给用户。

​ 每个Activity都可以启动其他Activity用于执行不同的动作(功能)。当一个新的Activity启动的时候,先前的那个Activity就会停止,但是系统会在堆栈中保存该Activity。

​ 堆栈遵循后进先出的队列原则,因此,当用户使用完当前的Activity并按Back键时,该Activity将从堆栈中取出(并销毁,释放内存空间),然后先前的Activity恢复并获取焦点。

创建和配置Activity

​ 条件:

  1. 需要继承Activity基类或其子类

  2. 创建Activity需要实现一个或多个方法;

    其中最常见的就是**onCreate(Bundle status)**方法,该方法将会在Activity创建时被回调,并可调用setContentView(View view)方法来显示要展示的View。

//MainActivity.java
public class MainActivity extends AppCompatActivity {
    
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
}

//androidManifest.xml
<activity android:name=".MainActivity" //name : 指定Activity的实现类的类名(必须)
    android:label="@string/app_name" > //标题显示文字
    <intent-filter> //配置Activity过滤条件
     <action android:name="android.intent.action.MAIN" /> //设为主Activity
	
     <category android:name="android.intent.category.LAUNCHER" /> //设置附加信息
         					//决定最先运行的launcher中那个activity,该属性会最先调用
	</intent-filter>
</activity>

​ 当用户离开Activity时,系统将会自动调用onPause()方法,但这并不意味这该Activity被销毁了。在该方法中,应该实现一些需要持久化的功能,因为用户可能不会再返回该Activity,该进程可能会被杀死。

启动和关闭Activity

​ 一个Android应用通常只有一个Activity会作为程序的入口。而应用中的其他Activity,通常都由入口Activity启动,或由入口Activity启动的Activity启动。

​ Activity启动其他Activity的方法如下:

  1. startActivity(Intent intent):启动其他Activity;
  2. startActivityForResult(Intent intent,int requestCode):程序将会得到新启动Activity的结果(通过重写onActivityResult(…)方法来获取),requestCode参数代表启动Activity的请求码。这个请求码的值由开发者根据业务自行设置,用于标识请求来源。
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        intent.setClass(MainActivity.this,OtherActivity.class);
        //通过Intent对象将数据传送到相应的Activity
        MainActivity.this.startActivity(intent);
        MainActivity.this.finish();
    }
});

​ 结束Activity:

  1. finish():结束当前Activity;

  2. finishActivity(int requestCode):结束以startActivityForResult(Intent intent,int requestCode)方法启动的Activity。

    注意:大部分情况下,不建议显式调用这些方法关闭Activity。因为Android系统会为我们管理Activity的生命周期,调用这些方法可能会影响用户的预期体验。因此,只有当你不想用户再回到当前Activity的时候才去关闭它。

Activity的生命周期

(1) onCreate():创建Activity时被调用;

(2) onStart():启动Activity时被调用;

(3) onRestart():重新启动Activity时被调用;

(4) onResume():恢复Activity时被调用;

(5) onPause():暂停Activity时被调用;

(6) onStop():停止Activity时被调用;

(7) onDestory: 销毁Activity时被调用;

Activity的三个主要状态:

  1. Resumed:已恢复状态。此时Activity位于前台,并获得焦点,该状态也称为运行时状态。
  2. Paused:暂停状态。在该状态下,其他Activity获得焦点,该Activity仍可见,即仍存在于内存中,保存着自身状态,与窗口管理器保持联系,但如果系统内存极度匮乏时,可能会被杀死。
  3. Stopped:停止状态。在该状态下,该Activity完全被其他Activity覆盖,即仍存在于内存中,保存着自身状态,与窗口管理器失去联系, 系统在需要内存时,可以随时杀死该Activity。

Activity的生命周期的三个循环:

  1. 整个生命周期:OnCrete - onDestroy

    从onCreate()开始到onDestroy()结束。Activity在onCreate()进行初始化,设置所有的“全局”状态,在onDestory()释放所有的资源。

  2. 可见生命周期:OnStart - onStop

    从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个方法之间,需要保持显示给用户的UI数据和资源等。

  3. 前台生命周期:onResume - onPause

    从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。 Activity可以经常性地在resumed和paused状态之间切换

image-20210506211700004

Activity之间交换数据

​ 利用Intent组件

Intent提供了多个重载方法来存放需要携带的数据,格式如下:

  1. putExtras(String name,XXX data):其中XXX代表数据类型,如int,long,String等。
  2. putExtras(Bundle data):向intent中放入一个简单的数据携带包,该类提供了多个方法来存入数据。(查看Bundle)
//putExtra():

//MainActivity.java
button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				String str = edittext.getText().toString();
				Intent intent = new Intent();
				intent.setClass(MainActivity.this,OtherActivity.class);
				intent.putExtra("content",str);

				//通过Intent对象将数据传送到相应的Activity
				MainActivity.this.startActivity(intent);
				MainActivity.this.finish();
			}
		});

//OtherActivity.java
		Intent intent = this.getIntent();
		String res = intent.getStringExtra("content");
		textview.setText(res);

//putExtras(bundle):

//MainActivity.java
button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				String str1 = edittext1.getText().toString();
				String str2 = edittext2.getText().toString();
				Intent intent = new Intent();
				intent.setClass(MainActivity.this,OtherActivity.class);
				Bundle bundle = new Bundle();
				bundle.putString("name",str1);
				bundle.putString("pass",str2);
				intent.putExtras(bundle);

				//通过Intent对象将数据传送到相应的Activity
				MainActivity.this.startActivity(intent);
				MainActivity.this.finish();
			}
		});
//OtherActivity.java
		Intent intent = this.getIntent();
		Bundle bundle = intent.getExtras();
		String res = bundle.getString("name");
		String res1 = bundle.getString("pass");
		textview.setText(res + res1);

//OtherActivity.java
		Intent intent = this.getIntent();
		Bundle bundle = intent.getExtras();
		String res = bundle.getString("name");
		String res1 = bundle.getString("pass");
		textview.setText(res + res1);

如果觉得本文对你有帮助的话,不妨关注作者一波,小小的关注其实对我很重要。更多高质量内容与资料请访问:个人主页:修心的小屋

以上是关于Activity详解的主要内容,如果未能解决你的问题,请参考以下文章

片段 MyFragment 未附加到 Activity

将字符串数据从Activity发送到片段[关闭]

如何在 ViewPager 中从 Activity 移动到 Fragment?未找到片段 ID 的视图

片段 - 您是不是必须在包含整个 Activity 的片段周围使用 Activity Wrapper?

如何将片段中的 ListView 对象的数据传递给 Activity?

add application window with unknown token XXX Unable to add window;is your activity is running?(代码片段