第一行代码(第三版)第三章总结

第一行代码(第三版)第三章总结

1. Activity

1.1 Activity概念

Activity为安卓四大组件之一(Activity/Service/BroadCast Recevicer/Content provider)。Activity主要负责与用户交互,提供一个显示的屏幕。

1.2 创建Activity

  1. 新建类MainActivity继承Activity基类。
public class MainActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        //...
    }
}

代码中继承的AppCompatActivity类与Activity类的区别在于,AppCompatActivity类对很多控件做了向下兼容参考博客1

  1. AndroidManifest.xml文件中注册该Activity。
<activity
android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

intent-filter用于过滤Intent的属性,匹配成功才能启动该Activity参考博客2个人认为上面代码中的action和category内的信息的意义相当于表示启动该APP的时候会发出启动命令(包含这两条相同的action和catergory),过滤后即匹配上了MainActivity类,将该类当做启动的Activity初始化。

1.3 销毁Activity

  1. 按下Back返回键即可销毁当前的Activity。
  2. 调用Activity的finish()即可销毁当前的Activity。

1.4 Activity生命周期

1.4.1 返回栈

一个app可能有多个Activity,新的Activity会覆盖在旧的Activity上,而Activity使用栈(后进先出)来存储多个Activity。

1.4.2 Activity状态

每个Activity在其生命周期内最多会有4种状态:

1.运行状态

当一个Activity处于栈顶的时候,就是运行状态。

2.暂停状态

当一个Activity不处于栈顶,但是属于可见的状态(别的Activity部分遮挡了该Activity),就进入了暂停状态。

3.停止状态

当一个Activity不处于栈顶,并且完全不可见的时候,就进入了停止状态,系统会为其保留状态和变量,但是当内存不足的时候随时会被系统回收。

4.销毁状态

当一个Activity从返回栈移除后,就变成了销毁状态。

1.4.3 Activity生存期

Activity在各种状态之间切换时会调用相应的方法,如下:

  1. OnCreate():Activity第一次被创建的时候调用,可以在这里完成初始化和事件调用操作。
  2. OnStart():在Activity由不可见变得可见的时候调用。
  3. OnResume():在Activity准备好和用户进行交互的时候调用。
  4. OnPause():在Activity部分可见的时候调用。
  5. OnStop():在Activity完全不可见的时候调用。
  6. OnDestroy():在Activity销毁的时候调用。
  7. OnRestart():在Activity由不可见重新变为运行状态前调用。

参考生存周期图,来自参考博客3

在这里插入图片描述

如果进程被系统杀掉了,则会直接调用OnCreate而不是OnRestart,同时由于一些临时数据会丢失,会影响用户体验,因此需要使用Activity中的OnSaveInstanceState方法来解决这个问题。OnSaveInstanceState方法会携带一个Bundle类型参数,可以提供一系列的方法保存变量。同时恢复的时候只需要在OnCreate()函数的第一个Bundle参数中即可获取。

1.4.4 Activity启动模式

在实际项目中可以为指定的Activity设置如下四种启动模式:

  1. standard
  2. singleTop
  3. singleTask
  4. singleInstance

以上四种都可以在AndroidManifest.xml文件中通过给<activity>指定android:launchMode属性来设置,接下来分别介绍四种启动模式。

1.standard

默认的启动模式。每启动一个新Activity,就会在返回栈中入栈,并且处于栈顶位置,同时不管这个Activity是否已经在栈中存在,都会创建该Activity的新实例。

2.singleTop

与标准方式的区别在于,当启动新Activity时,如果发现Activity在栈中已经存在并且在栈顶,那么就不会创建新的实例而是用栈顶的这个实例。

3.singleTask

与singleTop模式的区别在于,当启动新Activity时,如果发现当前的Activity实例存在,不管是否在栈中哪个位置,都会将在该Activity上面的Activity实例全部出栈,然后使用该Activity。如果不存在则与标准模式相同,启动一个新的Activity。

4.singleInstance

与上面三种模式都不同,该模式下,指定了singleInstance的Activity会在一个新的返回栈中处理,这个返回栈可以与其它程序共享(注意,每个程序都有自己的返回栈),这样的意义在于,不同的程序可以共享同一个Activity实例。

2. Intent

2.1 Intent概念

Intent是安卓程序中各个组件之间交互的一种重要方式,不仅可以执行各种动作,还可以传递数据。例如用于启动Activity、启动服务,发送广播等。同时Intent可以分为显式Intent和隐式Intent。

2.2 显式Intent

直接指定要启动的Activity。

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

2.3 隐式Intent

隐式Intent不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选是根据所有的<intent-filter>来筛选。

<activity android:name="com.example.app.MainActivity">  
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>  

action是一个字符串,表示执行的动作,category表示动作的类别,只有两个都匹配上了才能成功,并且支持跨程序调用同时,actioncategory都可以自定义。

<intent-filter>
    <action android:name="android.intent.action.DIY_ACTION" />
    <category android:name="android.intent.category.DIY_CATEGORY" />
</intent-filter>

2.4 Intent传递数据

第一个Activity启动第二个Activity:

Intent intent = new Intent("com.example.app.SecondActivity");
intent.putExtra("str","hello world");
startActivity(intent);

第二个Activity接收第一个传来的数据:

getIntent().getStringExtra("str");

当然还可以结合Intent和Bundle,同时保存多个数据在Bundle中再将Bundle放在Intent中进行传递数据。

2.2 Intent返回数据

第一个Activity启动第二个Activity:

Intent intent = new Intent("com.example.app.SecondActivity");
startActivityForResult(intent,1);

第二个Activity返回数据:

Intent data = new Intent();
data.putExtra("str","helloworld");
setResult(1,data);
finish();

这里的data只用来传递数据,没有任何意图。

第一个Activity接收数据:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==1)
    {
        //...
    }
}
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页