我最近刚刚接触Android开发,对这个方面的开发可以说是一无所知,所以想着尝试开始理解。
在这段时间的摸爬滚打里面,我发现了其中Activity、Fragment、Adapter三种非常常用,所以在这里进行一下我自己的理解。
一、Activity
在安卓开发中,Activity是一个非常重要的概念,它代表着应用程序中的一个单独的屏幕或界面,用户可以与之交互。
1、界面呈现:
Activity是安卓应用程序用户界面的主要组成部分之一。每个Activity通常都对应着应用程序中的一个屏幕,它可以包含各种UI元素,如按钮、文本框、列表等,以及与用户交互的逻辑。
2、生命周期管理:
Activity具有丰富的生命周期方法,允许开发者在不同的生命周期阶段执行特定的操作,如初始化界面、响应用户输入、保存和恢复状态等。生命周期方法包括onCreate、onStart、onResume、onPause、onStop、onDestroy等。
在这里提到了生命周期方法,所以还是要说一下常用的生命周期方法:
-
onCreate():
- 这是Activity被创建时调用的第一个方法。
- 在这个方法中,通常进行一些初始化操作,如设置布局、绑定数据、初始化变量等。
-
onStart():
- 当Activity变得可见但没有获得焦点时调用。
- 在这个方法中,通常执行一些准备工作,如启动动画、注册广播接收器等。
-
onResume():
- 当Activity获得焦点并开始与用户交互时调用。
- 在这个方法中,通常执行与界面更新相关的操作,如启动动画、开始播放视频等。
-
onPause():
- 当Activity失去焦点但仍然可见时调用,通常是因为新的Activity被启动或者某个对话框被弹出。
- 在这个方法中,通常执行一些暂停或保存状态的操作,如暂停动画、保存用户输入数据等。
-
onStop():
- 当Activity不再可见时调用,通常是因为新的Activity完全遮挡了当前Activity。
- 在这个方法中,通常执行一些释放资源或者停止服务的操作,如停止播放音乐、取消网络请求等。
-
onDestroy():
- 当Activity即将被销毁时调用,通常是因为用户手动结束了Activity或者系统需要回收内存。
- 在这个方法中,通常执行一些清理工作,如释放资源、取消注册监听器等。
-
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交互。安卓系统定义了四种启动模式:
-
standard:默认的启动模式。每次启动都会创建一个新的Activity实例,不管任务栈中是否已经存在该Activity的实例。
-
singleTop:如果启动的Activity已经位于任务栈的顶部(栈顶),则不会创建新的实例,而是重新使用已存在的实例。如果Activity不在栈顶,则会创建新的实例。
-
singleTask:在一个新的任务栈中创建Activity的实例,并且每个任务栈中只有一个该Activity的实例。如果启动的Activity已经存在于其他任务栈中,则会将该任务栈移动到前台,并且将Activity置于栈顶。
-
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是安卓开发中的核心概念之一,它负责管理应用程序的界面和用户交互,并提供了丰富的生命周期方法和功能,使开发者能够构建出丰富、灵活和交互性强的安卓应用程序。