Android - Activity解析

Posted 小柴的回忆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android - Activity解析相关的知识,希望对你有一定的参考价值。

1.Activity

Activity - 四大组件之一,主要是与用户进行交互。

2.Activity的生命周期


此图来源于:官方的一张生命周期图

方法说明下一个方法
onCreate()第一次创建Activity时调用,此时还无法与用户互动,视图也不可见onStart()
onStart()此时Activity视图可见,但是还是无法和用户互动onResume(或onStop()
onResume()此时Activity视图可见,也可以与用户互动onPause()
onPause()Activity失去前台状态,不再聚焦,Activity视图可见,但无法与用户互动onStop()或onResume()
onStop()Activity对用户不可见onDestroy()或onRestart()
onDestroy()Activity销毁前执行的最后一个方法
onRestart()Activity停止后没销毁的Activity再次启动onStart()

表中的方法定义了整个Activity的生命周期,其中又可分成三个生命周期:

  • onCreate()与onDestroy(),创建于销毁,贯穿整个Activity的生命周期。一些资源的使用需要贯穿整个生命周期,就可以在onCreate()中创建、初始化,在onDestroy()中注销、销毁
  • onStart()与onStop(),开始与停止,贯穿Activity可见的生命周期,这时候,视图是可见的,但是无法与用户互动, 维护向用户显示的资源,例如我们的广播就应在onStart()中注册,onStop()中注销
  • onResume()与onPause(),继续与暂停,Activity前台可互动的生命周期,处理与用户的交互信息,时常要会继续与暂停间切换,例如关闭屏幕时。什么时候传递信息,什么时候创建意图。

3.Activity的启动模式

Activity的启动模式有4种:standard 默认模式、singleTop栈顶模式、singleTask栈中复用模式、singleInstance 单例模式

3.1 standard 默认模式

每创建一个Activity都回向栈中加入一个新的Activity

3.2singleTop栈顶模式

只要栈顶的Activity是我们需要创建的Activity,那就会直接复用栈顶的Activity使用

3.3singleTask栈中复用模式

只要栈中存在Activity是我们需要创建的Activity,将上面的Activity弹出,并那就将该Activity置顶.

3.4singleInstance 单例模式

创建一个新的栈(Task),只用于存放该Activity

3.5启动模式的使用方法

使用 android:launchMode="" 来设置

  • Intent语句中设置
		Intent intent = new Intent(this, FirstActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //singTask模式
        //intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); //singTop模式
        //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 下面说明
        //在intent中无法设置singleInstance单例模式
        startActivity(intent);

FLAG_ACTIVITY_CLEAR_TOP:Launch
Mode中没有与此对应的模式,如果要启动的Activity已经存在于栈中,则将所有位于它上面的Activity出栈。singleTask默认具有此标记位的效果。

若两方都存在设置,则Intent中的优先使用

4.点击home键退出的生命周期

public class FirstActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        Log.d("小柴的回忆", "First onCreate");
        Button btn1 = findViewById(R.id.btn1);
        btn1.setOnClickListener(v ->  //点击按钮触发事件
            Intent intent = new Intent(this, SecondActivity.class);
            startActivity(intent);
        );
    

    @Override
    protected void onStart() 
        super.onStart();
        Log.d("小柴的回忆", "First onStart");
    

    @Override
    protected void onResume() 
        super.onResume();
        Log.d("小柴的回忆","First onResume");
    

    @Override
    protected void onPause() 
        super.onPause();
        Log.d("小柴的回忆","First onPause");
    

    @Override
    protected void onStop() 
        super.onStop();
        Log.d("小柴的回忆","First onStop");
    

    @Override
    protected void onDestroy() 
        super.onDestroy();
        Log.d("小柴的回忆","First onDestroy");
    

    @Override
    protected void onRestart() 
        super.onRestart();
        Log.d("小柴的回忆", "First onRestart");
    

打开应用:onCreate() → onStart() → onResume()

点击home键退出应用:→ onPause() → onStop()

重新打开应用:→ onRestart() → onStart() → onResume()

关闭应用: → onPause() → onStop() → onDestroy()

5.跳转到第二个Activity

代码与第一个Activity几乎一样

public class SecondActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Log.d("小柴的回忆", "Second onCreate");
    

    @Override
    protected void onStart() 
        super.onStart();
        Log.d("小柴的回忆", "Second onStart");
    

    @Override
    protected void onResume() 
        super.onResume();
        Log.d("小柴的回忆","Second onResume");
    

    @Override
    protected void onPause() 
        super.onPause();
        Log.d("小柴的回忆","Second onPause");
    

    @Override
    protected void onStop() 
        super.onStop();
        Log.d("小柴的回忆","Second onStop");
    

    @Override
    protected void onDestroy() 
        super.onDestroy();
        Log.d("小柴的回忆","Second onDestroy");
    

    @Override
    protected void onRestart() 
        super.onRestart();
        Log.d("小柴的回忆", "Second onRestart");
    

打开应用: onCreate() → onStart() → onResume()

点击按钮跳转到第二个Activity:→ Fisrt onPause() → Second onCreate() → Second onStart() → Second onResume() → First onStop()

从第二个Activity返回到第一个Activity:→ Second onPause() → First onRestart() → First onStart() → First onResume() → Second onStop() → Second onDestroy()

6.应用横竖屏切换

默认的情况下是将创建好的Activity销毁,重新创建一个

7.跳转小窗口 与 透明的Activity

第五点是从onStop()方法回到onRestart()方法
但根据生命周期图可知,还有一种情况是从onPause() 回到onResume()
方法就是进入小窗口的Activity和 透明的Activity

7.1小窗口Activity

在AndroidManifest.xml中设置activity的主题为Dialog主题
(注意,如果Activity继承的是AppCompatActivity,那主题也得是AppCompat中的主题)

	<activity android:name=".SmallActivity"
            android:theme="@style/Theme.AppCompat.Dialog"/>

activity_small

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="@color/purple_200"
    tools:context=".SmallActivity">
    <TextView
        android:text="你好"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

SmallActivity里无变动,就不放代码了

点击跳转窗口式Activity



返回原Activity

7.2透明式Activity

style.xml

	<style name="myTransparent" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">#00000000</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
    </style>

AndroidManifest.xml 设置主题

        <activity android:name=".TransparentActivity"
            android:theme="@style/myTransparent"/>

activity_transparent

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TransparentActivity">

    <TextView
        android:gravity="center"
        android:text="你好"
        android:textSize="30sp"
        android:textColor="@color/purple_200"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

TransparentActivity无改变,所以也不放代码

点击进入透明Activity(透明的Activity,里面仅有一个TextView,且原Activity的按钮是按不了的,按的地方都是透明的Activity里)



返回原Activity

以上是关于Android - Activity解析的主要内容,如果未能解决你的问题,请参考以下文章

Android - Activity解析

Android生命周期与Intent笔记

Android生命周期

Activity横竖屏切换生命周期变化

android添加友盟自动更新的时候,如何使app打开一次只提示一次,而不是随着Acitvity的变动而一直提示。

Android Activity学习笔记