Android基础知识(一)|青训营笔记

124 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第2天。

根据青训营提供的课程及资料,对相关知识点进行了整理,当然也查阅了其他相关资料。

一、知识点

  • 界面组件

    • Activity

      • 程序界面入口
      • 页面容器
      • 前台交互
    • Fragment

      • 设计之初是为了设备适配,解决碎片化
      • 轻量级的页面容器
  • 服务组件 Service

  • 广播组件 Broadcast

  • 数据组件 ContentProvider

  • 通信组件

    • Handler 线程通信
    • Binder 进程通信

二、知识点详细介绍

1 Activity

1.1 Activity是什么

Activity是一个用户界面的容器,主要用于和用户进行交互。一个应用程序中可以包含多个Activity,下面就是一个Activity的页面截图,页面布局中只有一个TextView组件,该组件的文字内容是“Hello,World!”。

image-20220727210629958.png

1.2 Activity基本用法

首先,你需要创建一个Activity文件并在AndroidMainfest.xml文件中进行注册声明,然后,创建该Acticity的布局文件,最后,在该活动的文件中使用布局文件与Activity进行绑定,这几个操作完毕后运行起来就能看到基本的页面了。

注册-->布局-->绑定

1.2.1 注册Activity

在AndroidMainfest.xml文件中进行Activity的注册,Activity的注册声明需要放在标签内,通过标签对Activity进行注册。如果要将该Activity配置为主Activity还需要在标签内加入,并且在该标签内添加和这两句声明,示例如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.edu.jssvc.wangyu.helloworldwy">
​
    <application
        ...>
        <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>

1.2.2 将布局文件与Activity进行绑定

这是在MainActivity中将该活动与布局文件activity_main.xml绑定的示例,调用的方法是setContentView()

public class MainActivity extends AppCompatActivity {
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

1.2.3 Activity的启动方法

Activity的启动方法分为显式启动和隐式启动两种。

SecondActivity在AndroidMainfest.xml中的注册声明如下:

<activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="com.example.activitytest.MY_CATEGORY" />
    </intent-filter>
</activity>

显式启动示例如下:

//新建显式意图
Intent intent= new Intent(FirstActivity.this,SecondActivity.class);
//发送意图,启动Activity
startActivity(intent);

隐式启动需要和同时匹配才能相应,示例如下:

//新建隐式意图
Intent intent= new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
//发送意图,启动Activity
startActivity(intent);

1.2.4 向下一个Activity传递数据

在上述的介绍中,可以使用startActivity()方法启动下一个Activity,如果想要向下一个Activity传递数据,可以调用Intent对象中的putExtra()方法,向下一个Activity传递数据的示例如下:

//新建显式意图
Intent intent= new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data","Hello,SecondActivity");
//发送意图,
startActivity(intent);

在SecondActivity中,通过调用Intent对象中的getStringExtra()方法获取传递过来的String类型的数据,当然也可以传递其他类型的数据,SeconiActivity中的获取FirstActivity传递过来数据的代码如下:

//取得启动当前Activity的Intent对象
Intent intent = getIntent();
//从Intent实例中取得Extra字段
String data = intent.getStringExtra("extra_data");

1.2.5 启动带返回值的Activity

  • 启动带返回值的Activity方法

    前面的示例中启动下一个Activity调用的方法都是startActivity(),如果你想要启动一个带返回值的Activity就需要调用startActivityForResult()方法,示例如下:

    //新建显式意图
    Intent intent= new Intent(FirstActivity.this,SecondActivity.class);
    //参数除Intent对象,还需要一个标记意图对象的请求码,必须是整数
    startActivityForResult(intent,1);
    
  • 被启动Activity设置返回值的方法

    //创建空意图
    Intent intent = new Intent();
    //为意图添加一个自定义的Category,category参数允许有多个,且系统会提供一个默认的
    intent.putExtra("extra_return","Hello,FirstActivity");
    //参数除Intent对象,还需要一个标记意图对象的请求码,必须是整数
    setResult(RESULT_OK,intent);
    
  • 处理返回值的回调方法

    /**
     * 接受被startActivityForResult()方法启动的Activity用setResult()返回数据
     * @param requestCode int类型数据,表示针对哪个意图对象返回的数据
     * @param resultCode int常量,表示返回的意图是否有效
     * @param data Inten类型,通常携带返回数据
    */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        switch (requestCode){
            case 1:
                if (resultCode == RESULT_OK){
                    String returnedData = data.getStringExtra("extra_return");
                }
        }
    }
    

    ps:

image-20220727231358553.png

1.3 Activity的生命周期

1.3.1 Activity的4种生命周期状态

  • Active 运行状态
  • Pause 暂停状态
  • Stop 停止状态
  • Killed 消亡状态

1.3.2 Activity生命周期的回调方法

  • 正常生命周期

    • onCreate():创建时回调,一般在此处创建视图和绑定数据
    • onStart():已启动,即将进入前台
    • onResume():与用户开始交互,位于Activity栈顶
    • onPause():Activity失去焦点或已暂停,Activity界面部分可见,下一个生命周期时onResume()或onStop()
    • onStop():Activity不再可见,下一个回调是onRestart()或onDestory()
    • onRestart():重启已停止的Activity,下一个回调是OnStart()
    • onDestory():销毁Activity,释放该Activity的所有资源
  • 异常生命周期

    在异常生命周期中会额外执行两个方法:

    • onSaveInstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据
    • onRestoreInstanceState():用于恢复数据

    异常生命周期出现情况:

    • 资源相关的系统配置改变(最常见的就是旋转屏幕)
    • 内存不足时候,会杀死优先级低的Activity

1.3.3 Activity生命周期小结

  • 启动退出场景

    • 启动 onCreate()→onStart()→onResume()
    • 退出 onPause()→onStop()→onDestory()
  • 部分遮挡

    • 遮挡 onPause()
    • 恢复 onResume()
  • 完全遮挡

    • 遮挡 onPause()→onSaveInstanceState()→onStop()
    • 恢复 onStart()→onResume()
  • 配置变更

    • 未配置

      • 销毁 onSaveInstanceState()→onPause()→onStop()→onDestory()
      • 重建 onCreate()→onStart()→onRestoreInstanceState()→onResume()
    • 已配置 onConfigurstionChanged()

  • 后台回收

    • 销毁 不会有时机处理
    • 重建 onCreate()→onStart()→onRestoreInstanceState()→onResume()

1.4 Activity启动模式

  • standard:默认启动模式,允许重复
  • singleTop:栈顶复用,不允许Activity连续重复
  • singleTask:栈内复用,不允许栈内Activity重复
  • singleInstance:全局复用,系统全局不允许Activity重复