Android APP完整基础教程(05)四大组件-Activity

47 篇文章 14 订阅

1 一张图解读Activity

这里用一张图解读 生命周期 & 基本概念 & 关键回调方法解读

2 activity类关系解读

关于Activity类的父类、子类的继承关系图如下所示:

3 activity加载模式解读

@1 为什么activity要 指定加载模式?

因为android 使用task(栈结构)来管理activity,当启动一个应用时,android会为之创建一个task(可以理解为activity栈),然后启动这个应用的入口activity。但android 没有为task提供给API,因此开发人员无法直接访问task,只能获取对应task的ID。

@2 activity的四种加载模式解读如下:

  • standard:android总会为activity创建一个新实例并添加到当前task栈中(不创建新task)
  • singleTop:同上,不同在于当activity在栈顶时不会创建新实例,而是复用已有实例。
  • singleTask:activity在同一个Task栈中只有一个实例(注意:如果要启动的activity实例没有位于task的栈顶但在task栈中,那么会把activity实例之前的所有实例全部移除)
  • singleInstance:无论从哪个task中启动activity实例,只会创建一个目标activity。如果activty是新创建的,则系统创建一个全新的task并将activity实例放入其栈顶(一个activity对应一个task);如果activity存在,则无论在哪个task中,系统都会将task转到前台并将activity显示出来。

4 配置activity

android APP中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。activity内容如下:

<activity android:name=".MainActivity"
        android:label=@string/title
        android:launchMode="singleTask">
     <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
</activity>

常见属性一般有name、icon、label、exported(是否允许被其他应用调用),launchmode(上面1.3中提到的4种加载模式)。intent和intent-filter与通过intent启动activity的方式有关。

5 activity启动/关闭方式

5.1 activity启动

android 启动方式共分为两类,一种是显式跳转,另一种是隐式跳转。

@1 显式跳转:Intent内部以不同方式直接声明要启动的activity所对应的class

//第1种 指定类来跳转,直接设置
Intent intent=new Intent(this,XXXactivity.class);
startActivity(intent);

//第2种 指定类来跳转,通过setClass方式
Intent intent=new Intent();
intent.setClass(this,XXXactivity.class);
startAcitivity(intent);

//第3种 补全跳转到的那个activity包名
Intent intent=new Intent();
intent.setClassName(this,"com.ags.android.XXXactivity");
startAcitivity(intent);

//第4种 setComponent方式
Intent intent=new Intent();
intent.setComponent(new Component(this,"com.ags.android.XXXactivity"));
startAcitivity(intent);

@2 隐式启动:在Androidmanifest.xml文件中设置action策略,如下所示:

<activity android:name="com.ags.android.XXXActivity"
            android:label = @string/title>
	    <intent-filter>
		    <action android:name="com.ags.android.XXXActivity/>
		    <category android:name="android.intent.category.DEFAULT"/>
	    <intent-filter/>
</activity>

添加关键代码,如下所示:

Intent intent = new Intent();
intent.setAction("com.ags.android.XXXActivity");
startActivity(intent);

@3 startActivityForResult的显式跳转(可回传参数)

这里标注关键代码,如下所示:

//MainActivity中启动FirstActivity
Intent intent = new Intent(MainActivity.this,com.ags.myapplication.FirstActivity.class);
                startActivityForResult(intent,1);

//MainActivity的onActivityResult回调方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1 && resultCode == 0) {
        String position = data.getStringExtra("address");
        Log.d(TAG, "onActivityResult:addr"+position);
    }
}

//FirstActivity中关键内容(包含回传信息)
Intent intent = new Intent();
intent.putExtra("address", "value_effect");
setResult(0, intent);
FirstActivity.this.finish();

5.2 activity关闭

关闭activity是使用以下2种方法:

  • finish方法:结束当前activity。
  • finishActivity(int requestCode)方法:结束以startActivityForResult方式启动的activity。

6 Activity 数据交换

在android系统中Bundle类主要用于传递数据,保存的数据是以key-value(键值对)的形式存在。读写方式如下所示:

//通过intent启动activity发送数据,写
Intent intent = new Intent().setClassName("com.ags.XXXactivity");
Bundle bundle = new Bundle();
bundle.putString("name", "ags");
bundle.putInt("width", 175);
intent.putExtras(bundle);
startActivity(intent);

//被启动后的XXXactivity接收数据,读
Bundle bundle = this.getIntent().getExtras();
String name = bundle.getString("name");  
int height = bundle.getInt("height");

更多Bundle相关API可以查看文档:Android应用开发之Bundle类

7 Fragment简要说明

@1 为什么要用Fragment?

Android系统可以运行在各种各样的设备中,比如手机、平板、电视。同样的界面在手机上显示可能很好看,在大屏幕的平板上就不行了,手机的界面放在平板上可能会有过分被拉长、控件间距过大等情况也很让人头疼。而Fragment的出现能做到让一个App可以同时适应手机和平板。

@2 Fragment是什么?

Fragment代表了activity的子模块,可以理解成activity的片段。Fragment有自己的生命周期,也可以接收输入事件。Fragment是依赖于Activity的,不能独立存在的。

@3 Fragment的特点:

  • 模块化:不必把所有代码全部写在Activity中,而是写在各自的Fragment中。

  • 可复用:多个Activity可以复用同一个Fragment。

  • 可适配:根据屏幕尺寸、方向,能够快速方便地实现不同的布局,提升用户体验。

@4 使用Fragment

关于Fragment的文档:Android组件之Fragment组件全解-官方文档(可设置中文模式)

8 官方文档索引

 更多activity相关内容可以查看官方文档: Android组件之activity组件(可设置中文模式)

总结

  • 了解activity基本概念、生命周期、加载模式、AndroidManifest配置、了解fragment组件。
  • 熟练编写相关代码:Activity启动和关闭、Activity数据传递 以及fragment组件相关练习。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图王大胜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值