Activity基础

四大组件之一

Activity Service服务 ContentProvider内容提供者 BroadcastReceiver广播接收器

概要

  • Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。
  • Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。
  • 在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

声明

用于呈现在用户面前的Activity,一定要在AndroidManifest.xml中进行声明,否则程序会崩溃,假如你创建了个SecondActivity,那你可以这样进行简单声明。

<activity android:name=".SecondActivity"/>

打开一个Activity

以下所有的演示中,总共只有两个活动,第一个是MainActivity,第二个是SecondActivity。打开SecondActivity代码如下

Intent i = new Intent(MainActivity.this, SecondActivity.class);
startActivity(i);

也可以打开一些标准活动,比如打开拨号界面

Intent i = new Intent(Intent.ACTION_DIAL);
startActivity(i);

常见的其他标准活动如下,在执行相应的操作时,记得要添加权限

ACTION_MAIN APP的入口
ACTION_VIEW 用于显示用户的数据。比较通用,会根据用户的数据类型打开相应的Activity。比如`Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(“http://www.google.com”));`这样就会打开浏览器
ACTION_GET_CONTACT 允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音)
ACTION_CALL 呼叫指定的电话号码
ACTION_DIAL 调用拨号面板
ACTION_SEND 实现分享功能
ACTION_SENDTO 发送一条消息给由数据指定的人
ACTION_ANSWER 处理呼入的电话
ACTION_ATTACH——DATA 别用于指定一些数据应该附属于一些其他的地方,例如,图片数据应该附属于联系人
ACTION_CHOOSER 显示一个activity选择器

向下一个Activity传递数据

假如要把MainActivity的数据传递给SecondActivity,那么在MainActivity写好要传递的数据

String data="Hello";
Intent i=new Intent(MainActivity.this,SecondActivity.class);
i.putExtra("isHello",data);

在SecondActivity进行接收

Intent i=getIntent();
String data=i.getStringExtra("isHello");

当然还有其他数据类型的接收方式,getIntExtra()、getBooleanExtra()、getDoubleExtra()…


返回数据给上一个活动

数据可以传递给下一个活动,也可以返回数据给上一个活动。返回上一个活动只需要按一下Back键就可以了,并没有一个用于启动活动的Intent来传递数据。这里需要使用startActivityForResult (Intent intent,int requestCode)方法,第二个参数请求码,用于在之后的回调中判断数据的来源。

首先在MainActivity用startActivityForResult() 方法打开SecondActivity

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent,1);

然后在SecondActivity设置一些数据准备传给MainActivity,setResult接收两个参数,第一个用于向上一个活动返回处理结果,一般使用RESULT_OKRESULT_CANCELED,第二个参数就是要传递的数据。

Intent intent = new Intent();
intent.putExtra("data_return","给MainActivity的数据");
setResult(RESULT_OK,intent);

因为我们是使用startActivityForResult()方法启动的SecondActivity,所以当SecondActivity销毁时会回调上一个活动的onActivityResult()方法,因此我们需要在MainActivity中重写onActivityResult()方法。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch (requestCode){
        case 1:
            if(resultCode==RESULT_OK){
                //这里就拿到了数据
                String returnedData=data.getStringExtra("data_return");
            }
            break;
        default:
    }
}

如果用户不是通过按钮返回的上一个活动,而是通过Back键进行返回的,那么可以重写onBackPressed()方法,如果是finish()也是可以的,但是用startActivity()跳转回去就不行了。

@Override
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("data_return","给MainActivity的数据");
    setResult(RESULT_OK,intent);     
    finish();
}

生命周期

1.活动状态(4种)

运行状态 当活动处于返回栈栈顶时。
暂停状态 不处于栈顶,但是仍然可见,比如被对话框形式的活动遮盖了部分。内存极低时,系统可能回收。
停止状态 不处于栈顶,并且完全不可见。当其他地方需要内存时,系统可能回收。
销毁状态 活动从返回栈移除后,系统最容易回收这种活动,保证内存充足

2.活动的生存期
Activity类中有7个回调方法

onCreate() 活动第一次创建时调用。
onStart() 活动由不可见变为可见的时候调用
onResume() 准备好和用户进行交互的时候调用。
onPause() 在系统准备去启动或恢复另一个活动时调用,这个方法执行速度一定要快,不然会影响新的栈顶活动。
onStop() 活动完全不可见的时候调用。
onDestroy() 活动销毁前调用。
onRestart() 由停止状态变为运行状态之前调用。

3.在MainActivity中打印7个回调方法,当第一次打开页面的时候
onCreate->onStart->onResume
这里写图片描述

现在跳转到第二个页面
onPause->onStop
这里写图片描述

返回到第一个页面
onRestart->onStart->onResume
这里写图片描述

再按一次返回键,退出程序
onPause->onStop->onDestory
这里写图片描述

如果第二个Activity没有完全遮挡住第一个Activity,那么会执行onPause

这里写图片描述


启动模式launchMode(4种)

可以在AndroidManifest.xml通过给< activity >标签指定android:launchMode属性来选择启动模式

standard 是活动的默认启动模式,使用返回栈来管理活动,每当启动一个新的活动,它就在返回栈中入栈,处于栈顶位置。系统不在乎这个活动是否已经在返回栈中存在,每次启动都会创建改活动的一个实例
singleTop 在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动
singleTask 可以让某个活动在整个应用程序的上下文只存在一个实例,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有则创建一个新的实例
singleInstance 假设我们的程序有一个活动时允许其他程序调用的,前3种启动模式都做不到,因为每个程序都有自己的返回栈,同一个活动在不同的返回栈必然是创建了不同的实例。而singleInstance模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都公用一个返回栈,也就解决了共享活动实例的问题

猜你喜欢

转载自blog.csdn.net/weixin_37418246/article/details/82353742