Activity详解
Posted 修心_666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity详解相关的知识,希望对你有一定的参考价值。
Activity概述
一个应用程序通常由多个彼此之间松耦合的Activity组成。通常,有一个Activity被指定为主Activity。当应用程序第一次启动的时候,该Activity会显示给用户。
每个Activity都可以启动其他Activity用于执行不同的动作(功能)。当一个新的Activity启动的时候,先前的那个Activity就会停止,但是系统会在堆栈中保存该Activity。
堆栈遵循后进先出的队列原则,因此,当用户使用完当前的Activity并按Back键时,该Activity将从堆栈中取出(并销毁,释放内存空间),然后先前的Activity恢复并获取焦点。
创建和配置Activity
条件:
-
需要继承Activity基类或其子类
-
创建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的方法如下:
- startActivity(Intent intent):启动其他Activity;
- 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:
-
finish():结束当前Activity;
-
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的三个主要状态:
- Resumed:已恢复状态。此时Activity位于前台,并获得焦点,该状态也称为运行时状态。
- Paused:暂停状态。在该状态下,其他Activity获得焦点,该Activity仍可见,即仍存在于内存中,保存着自身状态,与窗口管理器保持联系,但如果系统内存极度匮乏时,可能会被杀死。
- Stopped:停止状态。在该状态下,该Activity完全被其他Activity覆盖,即仍存在于内存中,保存着自身状态,与窗口管理器失去联系, 系统在需要内存时,可以随时杀死该Activity。
Activity的生命周期的三个循环:
-
整个生命周期:OnCrete - onDestroy
从onCreate()开始到onDestroy()结束。Activity在onCreate()进行初始化,设置所有的“全局”状态,在onDestory()释放所有的资源。
-
可见生命周期:OnStart - onStop
从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个方法之间,需要保持显示给用户的UI数据和资源等。
-
前台生命周期:onResume - onPause
从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。 Activity可以经常性地在resumed和paused状态之间切换
Activity之间交换数据
利用Intent组件
Intent提供了多个重载方法来存放需要携带的数据,格式如下:
- putExtras(String name,XXX data):其中XXX代表数据类型,如int,long,String等。
- 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详解的主要内容,如果未能解决你的问题,请参考以下文章
如何在 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?(代码片段