Activity基本概念

Activity概念

Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。

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

当一个 Activity 因某个新 Activity 启动而停止时,系统会通过该 Activity 的生命周期回调方法通知其这一状态变化。Activity 因状态变化—系统是创建 Activity、停止 Activity、恢复 Activity 还是销毁 Activity— 而收到的回调方法可能有若干种,每一种回调都会为您提供执行与该状态变化相应的特定操作的机会。 例如,停止时,您的 Activity 应释放任何大型对象,例如网络或者数据库的连接。 当 Activity 恢复时,您可以重新获取所需资源,并恢复执行中断的操作。 这些状态转变都是 Activity 生命周期的一部分。

创建Activity

要创建 Activity,您必须创建 Activity 的子类(或使用其现有子类)。您需要在子类中实现 Activity 在其生命周期的各种状态之间转变时(例如创建 Activity、停止 Activity、恢复 Activity 或销毁 Activity 时)系统调用的回调方法。 两个最重要的回调方法是:
onCreate()
您必须实现此方法。系统会在创建您的 Activity 时调用此方法。您应该在实现内初始化 Activity 的必需组件。 最重要的是,您必须在此方法内调用 setContentView(),以定义 Activity 用户界面的布局。(注意:此处调用的setContentView()方法是父类中的方法,会根据布局填充器进行填充布局)
onPause()
系统将此方法作为用户离开 Activity 的第一个信号(但并不总是意味着 Activity 会被销毁)进行调用。我们通常应该在此回调方法中写一些保存数据的操作(因为用户可能不会返回或者系统因为内存不足而干掉处于onPause状态的方法)。
您还应使用几种其他生命周期回调方法,以便提供流畅的 Activity 间用户体验,以及处理导致您的 Activity 停止甚至被销毁的意外中断。 后文的管理 Activity 生命周期部分对所有生命周期回调方法进行了阐述

在清单文件中配置Activity

必须在清单文件中声明 Activity,这样系统才能访问它。 要声明您的 Activity,请打开清单文件,并将 <activity> 元素添加为 <application> 元素的子项。例如:
<manifest...>
   <application...>
        <activity android:name=".MainActivity">
	...
        </activity>
	...
    </application>
</manifest>
可能有的小伙伴会见到这种配置:
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
这样的 Activity 包含一个 Intent 过滤器,其中声明了该 Activity 响应“主”操作且应置于“launcher”类,launcher类涉及到底层,我们日后再说。目前可以理解成,这是程序的一个入口即可。<action> 元素指定这是应用的“主”入口点。<category> 元素指定此 Activity 应列入系统的应用启动器内(以便用户启动该 Activity)。

启动Activity

您可以通过调用 startActivity(),并将其传递给描述您想启动的 Activity 的 Intent 来启动另一个 Activity。Intent 对象会指定您想启动的具体 Activity 或描述您想执行的操作类型(系统会为您选择合适的 Activity,甚至是来自其他应用的 Activity)。 Intent 对象还可能携带少量供所启动 Activity 使用的数据。(可能很多小伙伴不知道intent是什么,这个后文有详解)
在应用中我们一般会通过显示intent来启动activty,例如以下代码可以用来启动一个activty:
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);

启动Activty并获取结果

有时,我们可能需要从启动的 Activity 获得结果。在这种情况下,请通过调用 startActivityForResult()(而非 startActivity())来启动 Activity。 要想在随后收到后续 Activity 的结果,需要实现 onActivityResult() 回调方法。 当后续 Activity 完成时,它会使用 Intent 向您的 onActivityResult() 方法返回结果。
首先我们需要在第一个activty中的按钮触发事件中写如下代码:
    public void ck(View view) {
        Intent intent = new Intent(this, City.class);
        startActivityForResult(intent, REQUEST_CODE);
    }
还需要重写onActivityResult()方法:
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
            String adress = data.getStringExtra("adress");
            adress_et.setText(adress);
        }
在第二个activity也就是它通过显示intent启动的activity中写如下代码:
        //实例化listview
        listView = (ListView) findViewById(R.id.listview);
        //给listview设置条目点击事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //获取点击的listview中条目的组件
                TextView textView = (TextView) view;
                //获取条目中的文本
                String adress = textView.getText().toString();
                Intent intent = new Intent();
                intent.putExtra("adress", adress);
                //通过设置响应码,并将数据通过intent带回
                City.this.setResult(RESULT_OK, intent);
                City.this.finish();
            }
        });

结束Activity

我们可以通过调用 Activity 的 finish() 方法来结束该 Activity。还可以通过调用 finishActivity() 结束您之前启动的另一个 Activity。其中结束我们启动的前一个activity的源码如下:
    public void finishActivity(int requestCode) {
        if (mParent == null) {
            try {
                ActivityManagerNative.getDefault()
                    .finishSubActivity(mToken, mEmbeddedID, requestCode);
            } catch (RemoteException e) {
                // Empty
            }
        } else {
            mParent.finishActivityFromChild(this, requestCode);
        }
    }
(注:这里是根据requestCode(即:请求码)来结束前一个activity
注:在大多数情况下,您不应使用这些方法显式结束 Activity。 正如下文有关 Activity 生命周期的部分所述,Android 系统会为您管理 Activity 的生命周期,因此我们无需结束自己的 Activity。 








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值