Activity详解

    xiaoxiao2025-09-15  213

    简介:

    Activity是一个应用组件,用户可与其提供的屏幕进行交互。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。

    一个应用通常由多个彼此松散联系的 Activity 组成。 一般会指定应用中的某个 Activity 为“主” Activity,即首次启动应用时呈现给用户的那个 Activity。 而且每个 Activity 均可启动另一个 Activity,以便执行不同的操作。 每次新 Activity 启动时,前一 Activity 便会停止,但系统会在堆栈(“返回栈”)中保留该 Activity。 当新 Activity 启动时,系统会将其推送到返回栈上,并取得用户焦点。 返回栈遵循“后进先出”堆栈机制,因此,当用户完成当前 Activity 并按“返回” 按钮时,系统会从堆栈中将其弹出(并销毁),然后恢复前一 Activity。

    创建:

    创建类,让其继承自Activity相关类

    在清单manifest中声明Activity:

    必须在清单文件中声明该Activity,系统才能访问到它

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.m.myapplication"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> action:应用的“主”入口点

    category:此Activity应列入系统的启动器内(以便用户启动该Activity)

    生命周期:

    Activity基本以三种状态存在:

    已继续:

    此Activity位于屏幕前台并具有用户焦点(有时也将此状态称作“运行中”)

    已暂停:

    另一个Activity位于屏幕前台并具有用户焦点,但此Activity仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 已暂停的 Activity 处于完全 Activity 状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接),但在内存极度不足的情况下,可能会被系统终止。

    已停止

    该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。 已停止的 Activity 同样仍处于 Activity 状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,但与窗口管理器连接)。 不过,它对用户不再可见,在他处需要内存时可能会被系统终止。

    如果 Activity 处于暂停或停止状态,系统可通过要求其结束(调用其 finish() 方法)或直接终止其进程,将其从内存中删除。(将其结束或终止后)再次打开 Activity 时,必须重建。

    onCreate():

    创建Activity;setContentView定义用户界面布局;初始化Android的必须组件

    onStart():

    在Activity即将对用户可见之前调用

    onResume():

    在Activity即将与用户进行交互之前调用,此时,Activity处于Activity栈顶,并具有用户输入焦点

    当电话结束,需要回到播放音乐的界面时,那么需要在此页面进行重新返回前台时,继续播放上次暂停位置的音乐

    onPause():

    当系统即将开始继续另一个Activity时调用。用户离开Activity的第一个信号

    保存当前Activity的状态信息。通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗CPU的内容。它应该非常迅速的执行所需操作,因为它返回后,下一个Activity才能继续执行。

     eg:当正在播放音乐的时候,突然电话进入,那么播放音乐的activity势必要onPause(让音乐暂停;保存当前音乐播放的位置等各种相关信息),然后再进入电话Activity

    onStop():

    对用户不再可见时调用

    onDestory():

    在Activity被销毁前调用

    释放所有保存的资源

    onRestart()

    回调函数详解如下:

    运行项目:(项目代码在本文最后)

    onCreate---onStart---onResume

    点击Back:

    onPause---onStop---onDestroy

    点击home:

    onPause---onStop

    长按home清除项目:

    onDestroy

    不finish当前ActivityA,通过Activity的按钮组件,跳转到另外一个ActivityB

    onPause(A)---onCreate(B)---onStart(B)---onResume(B)---onStop(A)

    需要ActivityB启动后ActivityA才Stop原因是:如果ActivityA直接进行onPause--onStop,然而ActivityB并没有启动成功,将会出现黑屏的不友好界面

    finish当前ActivityA,通过Activity的按钮组件,跳转到另外一个ActivityB

    onPause(A)---onCreate(B)---onStart(B)---onResume(B)---onStop(A)---onDestroy(A)

    关于A出栈的问题,请参考:http://blog.csdn.net/qq_34206198/article/details/52241424

    点击另一个ActivityB的back键,回到上一个ActivityA(都不finish当前Activity)

    onPause(B)---onRestart(A)---onStart(A)---onResume(A)---onStop(B)---onDestroy(B)

    处于运行状态锁屏

    onPause---onStop

    解锁回到Activity页面

    onRestart---onStart---onResume

    多个Activity栈管理方式:

    多个 Activity 之间采用的是栈道管理方式, 当用户启动新的 Activity 时, 新启动的 Activity 位于栈顶,当用户按后退按钮时, 栈顶的 Activity 被推出栈道并销毁, 如下图所示:

    启动Activity:

    startActivity();

    启动已知Activity

    Intent intent = new Intent(this, SignInActivity.class); startActivity(intent);

    不过,您的应用可能还需要利用您的 Activity 数据执行某项操作,例如发送电子邮件、短信或状态更新。 在这种情况下,您的应用自身可能不具有执行此类操作所需的 Activity,因此您可以改为利用设备上其他应用提供的 Activity 为您执行这些操作。 这便是 Intent 对象的真正价值所在—您可以创建一个 Intent 对象,对您想执行的操作进行描述,系统会从其他应用启动相应的 Activity。 如果有多个 Activity 可以处理 Intent,则用户可以选择要使用哪一个。 例如,如果您想允许用户发送电子邮件,可以创建以下 Intent 对象:

    Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); startActivity(intent);

    添加到 Intent 中的 EXTRA_EMAIL extra 是一个字符串数组,其中包含应将电子邮件发送到的电子邮件地址。 当电子邮件应用响应此 Intent 时,它会读取 extra 中提供的字符串数组,并将它们放入电子邮件撰写窗体的“收件人”字段。 在这种情况下,电子邮件应用的 Activity 启动,并且当用户完成操作时,您的 Activity 会恢复执行。

    启动Activity以获得结果:

    startActivityForResult();

    有时,您可能需要从启动的 Activity 获得结果。在这种情况下,请通过调用 startActivityForResult()(而非 startActivity())来启动 Activity。 要想在随后收到后续 Activity 的结果,请实现 onActivityResult() 回调方法。 当后续 Activity 完成时,它会使用 Intent 向您的onActivityResult() 方法返回结果。

    结束Activity:

    finish():结束当前Activity

    finishActivity():结束之前启动的另一个Activity

    注:在大多数情况下,您不应使用这些方法显式结束 Activity。 正如下文有关 Activity 生命周期的部分所述,Android 系统会为您管理 Activity 的生命周期,因此您无需完成自己的 Activity。 调用这些方法可能对预期的用户体验产生不良影响,因此只应在您确实不想让用户返回此 Activity 实例时使用。

    MainActivity内容如下:

    package com.example.m.myapplication; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("info", "MainActivity onCreate()"); Button button = (Button) findViewById(R.id.tv); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); finish(); } }); } @Override protected void onStart() { super.onStart(); Log.i("info", "MainActivity onStart()"); } @Override protected void onResume() { super.onResume(); Log.i("info", "MainActivity onResume()"); } @Override protected void onPause() { super.onPause(); Log.i("info", "MainActivity onPause()"); } @Override protected void onStop() { super.onStop(); Log.i("info", "MainActivity onStop()"); } @Override protected void onDestroy() { super.onDestroy(); Log.i("info", "MainActivity onDestroy()"); } @Override protected void onRestart() { super.onRestart(); Log.i("info", "MainActivity onRestart()"); } } SecondActivity内容如下:

    package com.example.m.myapplication; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("info", "SecondActivity onCreate()"); } @Override protected void onStart() { super.onStart(); Log.i("info", "SecondActivity onStart()"); } @Override protected void onResume() { super.onResume(); Log.i("info", "SecondActivity onResume()"); } @Override protected void onPause() { super.onPause(); Log.i("info", "SecondActivity onPause()"); } @Override protected void onStop() { super.onStop(); Log.i("info", "SecondActivity onStop()"); } @Override protected void onDestroy() { super.onDestroy(); Log.i("info", "SecondActivity onDestroy()"); } @Override protected void onRestart() { super.onRestart(); Log.i("info", "SecondActivity onRestart()"); } }

    转载请注明原文地址: https://ju.6miu.com/read-1302682.html
    最新回复(0)