活动是安卓开发的一个基本组成部分。一个活动封装了一个用户交互的屏幕。活动通常会包含用户应该互动的组件。这些可以是按钮、列表、编辑文本等。然而,活动有它自己的生命周期,你可以通过生命周期方法监听活动发出的事件。

在本教程中,我们通过写代码来实际学习这些生命周期方法,当这样的事件被引发时,我们会做一些事情。

(a). 在Kotlin中创建一个列举活动生命周期方法的应用程序

在这个例子中,你将学习与这些方法的基本交互。当这样的事件被引发时,我们展示了一个简单的祝酒词。

我们使用android studio和kotlin

第1步:依赖性

这个项目不需要依赖性。

第2步:Kotlin代码

首先创建一个名为MaiActivity.kt的文件。

MainActivity.kt

然后添加导入。

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.lang.StringBuilder

然后扩展AppCompatActivity。

class MainActivity : AppCompatActivity() {
    //

我们覆盖的第一个生命周期方法是 "onCreate()"。这个方法在活动第一次被创建时被提出。我们将在这里充实我们的xml布局。附加一些文本到我们的textbuilder上。然后在文本视图中显示这些文本。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        sb.append("\n onCreate Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onCreate Called")
    }

然后我们覆盖我们的onStart()。当活动被启动并变得可见时,这将被提出来供使用。


    override fun onStart() {
        super.onStart()
        sb.append("\n onStart Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onStart Called")
    }

以此类推。

下面是完整的代码。

package info.camposha.activitylifecycle

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.lang.StringBuilder

class MainActivity : AppCompatActivity() {
    val sb: StringBuilder = StringBuilder()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        sb.append("\n onCreate Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onCreate Called")
    }

    override fun onStart() {
        super.onStart()
        sb.append("\n onStart Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onStart Called")
    }

    override fun onResume() {
        super.onResume()
        sb.append("\n onResume Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onResume Called")
    }

    override fun onPause() {
        super.onPause()
        sb.append("\n onPause Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onPause Called")
    }

    override fun onStop() {
        super.onStop()
        sb.append("\n onStop Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onStop Called")
    }

    override fun onDestroy() {
        super.onDestroy()
        sb.append("\n onDestroy Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onDestroy Called")
    }
}

第三步:布局

activity_main.xml

我们的主活动布局的主要内容是,我们将有一个文本视图,它将在生命周期方法被提出时显示它们。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text=""
        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

第四步:运行

运行该项目。

屏幕配置改变

在这一块,我们看一下与android设备中的配置变化有关的android解决方案。

下面是根据android官方文档对处理配置变化的一个简单说明。

一些设备配置会在运行期间发生变化(比如屏幕方向、键盘可用性以及用户启用[多窗口模式](https://developer.android.com/guide/topics/ui/multi-window)时)。当这种变化发生时,Android会重新启动正在运行的Activity ( onDestroy()被调用,然后是onCreate()。重启行为是为了帮助你的应用程序适应新的配置,通过自动用与新设备配置相匹配的替代资源重新加载你的应用程序。

为了正确地处理重启,你的活动恢复其先前的状态是很重要的。你可以使用onSaveInstanceState()ViewModel对象和持久化存储的组合来保存和恢复你的活动的UI状态,跨越配置变化。阅读更多关于它的信息这里

你如何在android中监听配置变化?

第1步–在android清单中指定configChanges属性

像这样。

<activity android:name=".MyActivity"
          android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
          android:label="@string/app_name">

该代码声明了一个处理屏幕方向变化和键盘可用性变化的活动。

  • orientation "值可以防止在屏幕方向改变时重新启动。
  • screenSize "值也可以防止在方向改变时重启,但只适用于Android 3.2(API级别13)及以上。
  • screenLayout "值对于检测可由可折叠手机和可转换的Chromebook等设备引发的变化是必要的。
  • keyboardHidden "值可以防止在键盘可用性改变时重新启动。

第二步:覆盖onConfigurationChanged方法

像这样

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    int newOrientation = newConfig.orientation;

    if (newOrientation == Configuration.ORIENTATION_LANDSCAPE) {
      // show("Landscape");
    } else if (newOrientation == Configuration.ORIENTATION_PORTRAIT){
    // show("Portrait");
    }
}

或者你可以使用一个开关语句。

int orientation=newConfig.orientation;
switch(orientation) {
    case Configuration.ORIENTATION_LANDSCAPE:
        //to do something
        break;
    case Configuration.ORIENTATION_PORTRAIT:
        //to do something
        break;
}

在Kotlin中。

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)

    // Checks the orientation of the screen
    if (newConfig.orientation === Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show()
    } else if (newConfig.orientation === Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show()
    }
}

注意,在写完你的实现代码之前,你需要添加super.onConfigurationChanged(newConfig);,否则可能会引发一个异常。

观察

onConfigurationCalled()可能不会被调用,如果你

1.在XML中设置布局为横向

    android:screenOrientation="landscape"

2. 手动调用setRequestedOrientation

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

**3. 你同时指定了android:screenOrientationandroid:configChanges

示例–如何处理屏幕方向的变化

让我们创建一个简单的例子,观察android活动中的配置变化,并根据屏幕是纵向还是横向旋转来显示祝酒词。

步骤1-创建布局

在你的xml布局中添加以下代码。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

第2步:MainActivity.java

然后在你的主活动中添加以下代码。

package com.example.screenorientation;

import android.os.Bundle;
import android.app.Activity;
import android.content.res.Configuration;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        onConfigurationChanged(new Configuration());
    }
@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);

    if(getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT)
    {
        Toast.makeText(getApplicationContext(), "portrait", Toast.LENGTH_SHORT).show();
        System.out.println("portrait");
    }
    else if (getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE) {
         Toast.makeText(getApplicationContext(), "landscape", Toast.LENGTH_SHORT).show();
            System.out.println("landscape");
    }
    else
    {
         Toast.makeText(getApplicationContext(), "none", Toast.LENGTH_SHORT).show();
            System.out.println("none");
    }
}
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

这就是了。