介绍

Activity是Android四大组件之一,也是最重要、最常见的应用组件,与用户进行交互(点击、滑动、长按等)的界面(注意:界面并非窗口Window,窗口是包含在Activity里面的)。

Activity是一种能够显示用户界面的组件,用户通过和Activity交互完成相关操作。

:::success 1. Activity用于显示用户界面,用户通过Activity交互完成相关操作
2. 一个App允许有多个Activity :::

image.png

组件注册

四大组件需要在AndroidManifest文件中配置否则无法使用,类似Activity无法启动,
一般情况下: 在新建一个activity后,为了使intent可以调用此活动,我们要在androidManifest.xml文件中添加一个标签,

标签的一般格式如下:

  1. <activity
  2. android:name=".MainActivity"
  3. android:label="@string/app_name">
  4. <intent-filter>
  5. <action android:name="android.intent.action.MAIN" />
  6. <category android:name="android.intent.category.LAUNCHER" />
  7. </intent-filter>
  8. </activity>

启动与参数传递

显式启动:通过包名来启动

  1. ①:常规跳转
  2. val intent = Intent(MainActivity.this,SecondActivity.class)
  3. startActivity(intent);
  4. ②:携带参数启动新Activity
  5. val intent = Intent(MainActivity.this,SecondActivity.class)
  6. intent.putExtra("extra_data", "extra_data")
  7. intent.putExtra("extra_int_data", 100)
  8. startActivity(intent);

期待从目标页获取数据:startActivityForResult——>比如启动相册获取图片

  1. ①假设从A--->B页面,以startActivityForResult方式启动
  2. val intent = Intent(MainActivity.this,SecondActivity.class)
  3. startActivityForResult(intent,100);
  4. ②如果B页面返回时,调用了
  5. setResult(Activity.RESULT_OK,resultIntent)
  6. finish()
  7. ③则A页面会回调下面的方法,在该回调里可以拿到返回的数据data
  8. onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)

2. 隐式启动

隐式 Intent 要比显示 Intent 含蓄的多,他并不明确指定要启动哪个 Activity,而是通过指定 action 和 category 的信息,让系统去分析这个 Intent,并找出合适的 Activity 去启动。

  1. <activity android:name=".SecondActivity">
  2. <intent-filter>
  3. <action android:name="com.example.firstapp.action.SecondActivity" />
  4. <category android:name="com.example.firstapp.category.SecondActivity" />
  5. <category android:name="android.intent.category.DEFAULT" /> // 一定要有
  6. </intent-filter>
  7. </activity>
  1. val intent = Intent()
  2. intent.setAction("com.example.firstapp.action.SecondActivity")
  3. intent.setCategory("com.example.firstapp.category.SecondActivity")
  4. intent.putExtra("extra_data", "extra_data")
  5. intent.putExtra("extra_int_data", 100)
  6. startActivity(intent);
  7. startActivityForResult(intent,100);

系统给我们提供的一些常见的Activtiy

:::success 拨打电话 :::

  1. Uri uri = Uri.parse("tel:10086");
  2. Intent intent = new Intent(Intent.ACTION_DIAL, uri);
  3. startActivity(intent);

:::success 发送短信 :::

  1. Uri uri = Uri.parse("smsto:10086");
  2. Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
  3. intent.putExtra("sms_body", "Hello");
  4. startActivity(intent);

:::success 打开浏览器 :::

  1. Uri uri = Uri.parse("http://www.baidu.com");
  2. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  3. startActivity(intent);

:::success 多媒体 :::

  1. Intent intent = new Intent(Intent.ACTION_VIEW);
  2. Uri uri = Uri.parse("file:///sdcard/foo.mp3");
  3. intent.setDataAndType(uri, "audio/mp3");
  4. startActivity(intent);

:::success 打开摄像头 :::

  1. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  2. startActivityForResult(intent, 0);
  3. >>> ActivityonActivityResult方法回调中取出照片数据
  4. Bundle extras = intent.getExtras();
  5. Bitmap bitmap = (Bitmap) extras.get("data");

进入手机无线网

  1. // 进入无线网络设置界面(其它可以举一反三)
  2. Intent intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
  3. startActivityForResult(intent, 0);

启动模式

standard

默认值,多实例模式。每启动一次,都会创建一个新的Activity实例。
启动的生命周期为:onCreate()->onStart()->onResume()
image.png

singleTop

栈顶复用模式
如果任务栈顶已经存在需要启动的目标Activity,则直接启动,并会回调onNewIntent()方法,生命周期顺序为: onPause() ->onNewIntent()->onResume()
如果任务栈上顶没有需要启动的目标Activity,则创建新的实例,此时生命周期顺序为: onCreate()->onStart()->onResume()
两种情况如下图,从图中可以看出,此模式下还是会出现多实例,只要启动的目标Activity不在栈顶的话。

singleTask

栈内复用模式,一个任务栈只能有一个实例。
有几种情况:

  • 当启动的Activity目标任务栈不存在时,则以此启动Activity为根Activity创建目标任务栈,并切换到前面
  • D为singleTask模式

当启动的Activity存在时,则会直接切换到Activity所在的任务栈,并且任务栈中在Activity上面的所有其他Activity都出栈(调用destroy()),此时启动的Activity位于任务栈顶,并且会回调onNewIntent()方法。

singleInstance

singleInstance名称是单例模式,即App运行时,该Activity只有一个实例。既然只有一个,那么也就说明很重要、很特殊,我们需要将其“保护起来”。单例模式的“保护措施”是将其单独放到一个任务栈中。。

image.png

Activity启动&销毁

2.1 startActivity

方法接口:

  • startActivity(Intent intent):不设置动画
  • startActivity(Intent intent, Bundle options):options指定如何启动Activity,即启动动画

示例:

  1. //显式启动
  2. Intent intent1 = new Intent(MainActivity.this,SecondActivity.class);
  3. startActivity(intent1);
  4. //隐式启动
  5. Intent intent2 = new Intent();
  6. intent2.setAction("actionStr");
  7. intent2.setCategory("categoryStr");
  8. startActivity(intent2);
  1. <activity android:name=".SecondActivity" android:icon="@drawable/app_icon">
  2. <intent-filter>
  3. <!--只能设置一个action,可以设置多个category,只有当action和category都匹配时才可以启动-->
  4. <action android:name="actionStr" />
  5. <category android:name="categoryStr" />
  6. </intent-filter>
  7. </activity>

注意:配置隐式Intent需要指定category,startActivity(intent)默认会添加一个default category


2.2 startActivityForResult

方法接口:

  • startActivityForResult(Intent intent, int requestCode):不设置动画
  • startActivityForResult(Intent intent, int requestCode, Bundle options):以指定的请求码(requestCode)启动Activity, 新的Activity结束后根据requestCode回调onActivityResult方法获取并处理返回结果

示例:

  1. //onCreate:
  2. findViewById(R.id.startActivityForResultBtn).setOnClickListener(v -> {
  3. Intent toFirstIntent = new Intent("first");
  4. Bundle data = new Bundle();
  5. data.putString("name","Mac");
  6. data.putInt("age",18);
  7. toFirstIntent.putExtra("person",data);
  8. startActivityForResult(toFirstIntent,0x1);
  9. });
  10. @Override
  11. protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  12. switch(requestCode){
  13. case 0x1:
  14. Log.d(TAG, "onActivityResult: "+data.getBundleExtra("person").getString("name"));
  15. Log.d(TAG, "onActivityResult: "+data.getStringExtra("result"));
  16. break;
  17. }
  18. super.onActivityResult(requestCode,resultCode,data);
  19. }

销毁Activity

  • finish():结束当前活动
  • finishActivity(intent, requestCode):结束使用startActivityForResult(intent,requestCode)启动的另一个活动

按钮跳转

Intent()

image.png

  1. val button2: Button = findViewById(R.id.two_btn);
  2. button2.setOnClickListener {
  3. startActivity(Intent(this, TwoActivity::class.java))
  4. }

显示跳转, 点击按钮跳转到第二个页面


隐式跳转


生命周期

Android使用任务来管理Activity的。 先进先出的栈结构。

:::info Activity状态 :::

  1. 运行状态
  2. 暂停状态
  3. 停止状态
  4. 销毁状态

:::info 生存周期

::: image.png

image.png

image.png