Activity详解

简介:

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.youkuaiyun.com/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()");
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值