【Activity】安卓Android开发中的Activity、Fragment、Adapter

本文介绍了Android开发中Activity的基础概念,包括其在界面呈现、生命周期管理、启动和销毁、布局与资源管理、回退栈与任务、状态保存与恢复以及Fragment的使用。详细讲解了Activity的重要性和关键方法,对于初学者理解和实践Android开发有很大帮助。
摘要由CSDN通过智能技术生成

我最近刚刚接触Android开发,对这个方面的开发可以说是一无所知,所以想着尝试开始理解。

在这段时间的摸爬滚打里面,我发现了其中Activity、Fragment、Adapter三种非常常用,所以在这里进行一下我自己的理解。

一、Activity

在安卓开发中,Activity是一个非常重要的概念,它代表着应用程序中的一个单独的屏幕或界面,用户可以与之交互。

1、界面呈现

Activity是安卓应用程序用户界面的主要组成部分之一。每个Activity通常都对应着应用程序中的一个屏幕,它可以包含各种UI元素,如按钮、文本框、列表等,以及与用户交互的逻辑。

2、生命周期管理

Activity具有丰富的生命周期方法,允许开发者在不同的生命周期阶段执行特定的操作,如初始化界面、响应用户输入、保存和恢复状态等。生命周期方法包括onCreate、onStart、onResume、onPause、onStop、onDestroy等。

在这里提到了生命周期方法,所以还是要说一下常用的生命周期方法:

  1. onCreate()

    • 这是Activity被创建时调用的第一个方法。
    • 在这个方法中,通常进行一些初始化操作,如设置布局、绑定数据、初始化变量等。
  2. onStart()

    • 当Activity变得可见但没有获得焦点时调用。
    • 在这个方法中,通常执行一些准备工作,如启动动画、注册广播接收器等。
  3. onResume()

    • 当Activity获得焦点并开始与用户交互时调用。
    • 在这个方法中,通常执行与界面更新相关的操作,如启动动画、开始播放视频等。
  4. onPause()

    • 当Activity失去焦点但仍然可见时调用,通常是因为新的Activity被启动或者某个对话框被弹出。
    • 在这个方法中,通常执行一些暂停或保存状态的操作,如暂停动画、保存用户输入数据等。
  5. onStop()

    • 当Activity不再可见时调用,通常是因为新的Activity完全遮挡了当前Activity。
    • 在这个方法中,通常执行一些释放资源或者停止服务的操作,如停止播放音乐、取消网络请求等。
  6. onDestroy()

    • 当Activity即将被销毁时调用,通常是因为用户手动结束了Activity或者系统需要回收内存。
    • 在这个方法中,通常执行一些清理工作,如释放资源、取消注册监听器等。
  7. onRestart()

    • 当Activity由停止状态变为运行状态时调用,即重新启动之前被停止的Activity。
    • 在这个方法中,通常执行一些恢复状态或者重新初始化的操作,以便重新显示Activity。

3、启动和销毁

开发者可以通过Intent来启动其他Activity,并可以在需要时销毁当前Activity。Activity之间的切换和交互是安卓应用程序的重要组成部分。

下面进行介绍一下如何通过Intent来启动其他Activity

通过Intent来启动其他Activity

(1)创建Intent对象:

如果要使用Intent来启动其他的Activity,首先要创建一个Intent对象,并且指定要启动的Activity的类名或者Action。

// 创建一个Intent对象,传入其他的Activity的类名字
Intent intent = new Intent(this, TargetActivity.class);
// 创建一个Intent对象,并指定Action为ACTION_VIEW,用于查看网页
Intent intent = new Intent(Intent.ACTION_VIEW);
(2)设置Intent的附加数据(可选):

如果需要向目标Activity传递额外的数据,可以使用Intent的putExtra()方法添加数据。

intent.putExtra("key", value);
(3)启动目标Activity

最后,调用startActivity()方法启动目标Activity。

startActivity(intent);

如果希望在启动Activity后等待返回结果,可以使用startActivityForResult()方法,并在目标Activity中通过setResult()方法设置返回结果。

startActivityForResult(intent, requestCode);

4、布局和资源管理

开发者可以使用XML文件定义Activity的布局结构,并使用Java(或Kotlin)代码与之关联。Activity可以访问应用程序的资源,如字符串、图像等,并将它们用于界面呈现。

下面介绍一下如何使用XML文件定义Activity的布局结构,并使用Java代码与之关联。

XML文件定义布局

4.1、定义布局XML文件

首先,在res/layout目录下创建一个XML文件,用于定义Activity的布局结构。可以使用各种布局容器和UI组件来构建界面,如LinearLayout、RelativeLayout、TextView、Button等。例如,创建一个名为activity_main.xml的布局文件:

<!-- activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
<!-- 一个文本 -->
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello, World!" />
<!-- 一个按钮 -->
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me" />

</LinearLayout>
4.2、关联XML布局文件

在Activity的onCreate()方法中使用setContentView()方法将XML布局文件与Activity关联起来,使之成为Activity的界面。

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

这样,当MainActivity被创建时,系统会加载并显示activity_main.xml中定义的布局。

4.3、访问布局中的UI组件

可以在Activity的Java代码中通过findViewById()方法访问布局中的UI组件,并对其进行操作。

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

        // 获取布局中的TextView和Button
        TextView textView = findViewById(R.id.textView);
        Button button = findViewById(R.id.button);

        // 设置按钮的点击事件监听器
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 点击按钮时的操作
                textView.setText("Button Clicked");
            }
        });
    }
}

在这个例子中,通过findViewById()方法获取了布局中的TextView和Button,并为按钮设置了点击事件监听器,在点击按钮时改变了TextView的文本内容。

这就是使用XML文件定义Activity的布局结构,并使用Java代码与之关联。

5、回退栈和任务

Activity在安卓系统中被管理着一个回退栈(Back Stack),用户可以通过回退按钮返回到之前打开的Activity。此外,Activity还可以属于一个任务(Task),多个Activity可以组成一个任务,用户可以在任务之间进行切换。

意思就是说有一个栈(先进后出)比如你打开了一个页面,然后在这个页面中又打开了一个页面,系统第一个页面放进栈里,随之将打开的第二个页面放进栈里,然后点击返回按钮的时候,拿出了最后放进栈里的页面(第二个页面),当然现在呈现的就是第一个页面了。这样,通过回退栈,系统实现了简单而方便的页面导航和回退操作。

6、状态保存和恢复

Activity可以保存其状态的信息,如用户的输入、滚动位置等,在Activity重新创建时恢复这些状态信息,以确保用户体验的连续性。

Activity可以通过几种方式来保存和恢复其状态信息,以确保用户在Activity重新创建时能够继续之前的操作和状态。以下是常用的方法:

6.1、onSaveInstanceState()和onRestoreInstanceState()方法

  • 当Activity即将被销毁时,系统会调用onSaveInstanceState()方法,开发者可以在这个方法中保存Activity的状态信息到Bundle对象中。
  • 当Activity重新创建时,系统会调用onRestoreInstanceState()方法,并将之前保存的状态信息传递给它,开发者可以在这个方法中恢复Activity的状态。
  • @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("key", value);
    }
    
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        String value = savedInstanceState.getString("key");
    }
    

6.2、使用Bundle保存状态信息

  • 在Activity重新创建时,可以使用Bundle对象保存和恢复状态信息。可以将Bundle对象作为参数传递给setContentView()方法,或者在onCreate()方法中获取已保存的Bundle对象。
  • @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        if (savedInstanceState != null) {
            String value = savedInstanceState.getString("key");
        }
    }
    

6.3、使用SharedPreferences保存状态信息

  • 可以使用SharedPreferences对象将状态信息保存在持久化存储中,以便在Activity重新创建时恢复。
  • SharedPreferences preferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString("key", value);
    editor.apply();
    
    // 在Activity重新创建时恢复状态信息
    SharedPreferences preferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
    String value = preferences.getString("key", defaultValue);
    

保存/恢复实例状态

  • 当Activity由于配置更改(如屏幕旋转)而重新创建时,系统会自动保存和恢复Activity的实例状态,例如EditText中的文本内容、ListView中的滚动位置等。

通过以上方法,可以有效地保存和恢复Activity的状态信息,确保用户在Activity重新创建时能够继续之前的操作和状态。选择合适的方式取决于数据的类型、大小和持久性要求。

7、启动模式和标志

开发者可以通过设置启动模式标志来调整Activity的行为,如指定Activity的启动模式(standard、singleTop、singleTask、singleInstance)、设置Intent的标志(FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_CLEAR_TOP等)等。

启动模式(Launch Mode)

启动模式指定了Activity在启动时如何与任务栈中已存在的Activity交互。安卓系统定义了四种启动模式:

  1. standard:默认的启动模式。每次启动都会创建一个新的Activity实例,不管任务栈中是否已经存在该Activity的实例。

  2. singleTop:如果启动的Activity已经位于任务栈的顶部(栈顶),则不会创建新的实例,而是重新使用已存在的实例。如果Activity不在栈顶,则会创建新的实例。

  3. singleTask:在一个新的任务栈中创建Activity的实例,并且每个任务栈中只有一个该Activity的实例。如果启动的Activity已经存在于其他任务栈中,则会将该任务栈移动到前台,并且将Activity置于栈顶。

  4. singleInstance:类似于singleTask,但是这个Activity会独占一个任务栈,不会与其他Activity共享任务栈。

标志(Flags)

Intent对象的标志用于指定Activity的启动行为和操作,可以在Intent对象中设置。常用的标志包括:

  • FLAG_ACTIVITY_NEW_TASK:将Activity置于一个新的任务栈中启动。
  • FLAG_ACTIVITY_CLEAR_TOP:如果目标Activity已经在任务栈中存在,将目标Activity之上的所有Activity移除,并将目标Activity置于栈顶。

下面介绍一个用例示例

singleTask的用法: 假设应用程序有一个主页Activity(MainActivity),用户从其他应用程序或者系统的Launcher启动应用时,希望始终只有一个MainActivity实例存在。可以将MainActivity的启动模式设置为singleTask,这样每次启动应用程序时,系统都会检查任务栈中是否已存在MainActivity的实例,如果存在则将其移到栈顶,如果不存在则创建一个新的实例。

<activity
    android:name=".MainActivity"
    android:launchMode="singleTask">

使用标志启动新任务栈: 如果需要从一个Activity启动一个新的任务栈,可以在Intent对象中设置FLAG_ACTIVITY_NEW_TASK标志。

Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

8、Fragment的使用

Activity可以包含一个或多个Fragment,Fragment是Activity界面的可重用部分,可以在Activity中动态添加、移除或替换,提高了应用程序的灵活性和可维护性。

总的来说,Activity是安卓开发中的核心概念之一,它负责管理应用程序的界面和用户交互,并提供了丰富的生命周期方法和功能,使开发者能够构建出丰富、灵活和交互性强的安卓应用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值