Android Studio:四大组件之Activity

一.Activity的生命周期

这里写图片描述
其中,onCreate(),onStart(),onResume()均为可显示状态;
onPause(),onStop()均为隐藏状态。
界面跳转:当从a界面进入到b Activity时,a Activity首先进入onPause()——b Activity依次为onCreate()——onStart()——onResume()——最后a Activity进入onStop()状态,转为后台运行。此时按返回键再返回a Activity时,b Activity:onPause()——a Activity:onRestart()——onStart()——onResume()——最后b Activity:onStop()——onDestroy()

二.启动Activity

1.

新建名为Activity的Project。
java文件(First_Activity.java(主Activity),Second_Activity.java)
xml文件(activity_first.xml,activity_second.xml)

2.activity_first.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    tools:context=".FirstActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button_name1"
        android:id="@+id/button1"/>

</android.support.constraint.ConstraintLayout>

3.activity_second.xml

什么都不加

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="32dp"
        android:gravity="center_vertical"
        android:text="@string/text1" />

</LinearLayout>

4.1First_Activity.java

(注:此处用的是匿名内部类button监听方式)

package com.example.administrator.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class FirstActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        Button button1=findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    }
}

5.Second_Activity.java

package com.example.administrator.activity;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class SecondActivity extends Activity {
    private String TAG="tag";
    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //把页面布局和该窗口绑定
        setContentView(R.layout.activity_second);
        //打印到日志中,第一个参数是键key,第二个参数是值value
        Log.d(TAG," SecondActivity,onCreate");}

}

6.AndroidManifest.xml

注意:每新建一个Activity,都必须在这个文件里注册该Activity的信息,否则系统进不去这个Activity,会崩掉。
因此此处添加<activity android:name=".SecondActivity"/>
一定要添加在<application><</application>里面

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.administrator.activity">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".FirstActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity"/>
    </application>

</manifest>

7.真机执行

然后即可执行查看效果

4.2启动Activity的另一方式

修改First_Activity.java文件如下

package com.example.administrator.activity;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class FirstActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        Button button1=findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //从此处开始修改
                Intent intent=new Intent();
                ComponentName component=new ComponentName(FirstActivity.this,SecondActivity.class);
                intent.setComponent(component);
                startActivity(intent);
            }
        });
    }
}

官方文档解释https://developer.android.google.cn/reference/android/content/ComponentName

ComponentName(Context pkg, Class<?> cls)

Create a new component identifier from a Context and Class object.
再次执行也可实现启动另一Activity的功能。

三.启动 Activity 以获得结果

1.

新建java文件Three_Activity.java ;xml文件:activity_three.xml

2.activity_three.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/text2"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button_name3"
        android:id="@+id/button3"/>

</LinearLayout>

3.

activity_first.xml中添加TextView以显示回传的数据

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv"
        android:hint="@string/hint"/>

4.Three_Activity.java

package com.example.administrator.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class ThreeActivity extends Activity {
    private String content="这是回传的数据";
    private int resultcode=2;//不同的Activity回传就设置不同的resultcode
    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_three);
        Button button3=findViewById(R.id.button3);
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                //封装要回传的数据
                intent.putExtra("data",content);
                //回传的数据实际上回传的是一个携带数据的信使(Intent)
                setResult(resultcode,intent);
                finish();
            }
        });
    }
}

5.修改First_Activity.java

修改后的代码为

package com.example.administrator.activity;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class FirstActivity extends Activity {
//新增:requestcode值
    private int REQ=1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);

        Button button1=findViewById(R.id.button1);
        //新增:初始化button2
        Button button2=findViewById(R.id.button2);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                ComponentName component=new ComponentName(FirstActivity.this,SecondActivity.class);
                intent.setComponent(component);
                startActivity(intent);
            }
        });
        //新增:增加button2监听事件
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(FirstActivity.this,ThreeActivity.class);

                startActivityForResult(intent,REQ);
            }
        });
    }
     //新增:页面回调数据函数
    //该页面通过 resultCode判断是由哪个页面回传的数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        TextView textview=findViewById(R.id.tv);
        if(resultCode==2&&requestCode==REQ){
            String stringdata=data.getStringExtra("data");
            textview.setText(stringdata);}
    }
}

其中,尤其要注意初始化textview时 TextView textview=findViewById(R.id.tv);的放置位置,我原本放在onCreat方法里和button2.setOnClickListener方法里都显示textview never used 导致点击“回调数据”按钮时闪退。

6.

最后在AndroidManifest.xml中添加

<activity android:name=".ThreeActivity"/>

不过此操作建议在新建Three_Activity.java 时就做,以免忘记。

7.真机执行效果图

这里写图片描述这里写图片描述
这里写图片描述

另附strings.xml文件

<resources>
    <string name="app_name">Activity</string>
    <string name="button_name1">启动Activity</string>
    <string name="button_name2">启动Activity以获得结果</string>
    <string name="button_name3">回传数据</string>
    <string name="text1">hello,this is secondactivity</string>
    <string name="text2">hello,this is threeactivity</string>
    <string name="hint">回传的数据将显示在这里</string>
</resources>

四.查看Activity任务栈

1.

关于任务和任务栈的概念,请自行阅览http://android.xsoftlab.net/guide/components/tasks-and-back-stack.html
技巧:打开cmd,输入adb shell dumpsys activity,即可查看任务栈。

2.四种launch modes

(1)”standard” (the default mode)

比如:任务栈为 A-B-C-D; D 在栈顶。intent要打开什么就打开什么。若intent带来打开B的意图,则为 A-B-C-D-B;若intent带来打开D的意图,则为 A-B-C-D-D;

(2)”singleTop”

比如:任务栈为 A-B-C-D; D 在栈顶。则会不重复打开栈顶的实例。若intent带来打开B的意图,则为 A-B-C-D-B;若intent带来打开D的意图,还是 A-B-C-D;
这个可以用来用来多次创建,比如点击一个按钮启动一个activity,如果快速点击多次会导致反复启动,一种办法是在点击事件里过滤,另一个办法就是设置目标activity是singletop。

(3)”singleTask”

此图来自官网图片,无法理解,不说了……大家自行读文档(网址上面也有),有什么好的理解方式也可以帮帮我……
这里写图片描述

(4)”singleInstance”

一个task里只有一种Activity的一种或多种实例。比如有这样两个activity——firstactivity和secondactivity,并且firstactivity内有按钮可以跳转到secondactivity,同样secondactivity内也有按钮可以跳转到firstactivity,先启动firstactivity(称为firstactivity1,在taskA中),点击firstactivity1内的按钮,跳出secondactivity(称为secondactivity2,在taskB中),但是因为”singleInstance”的性质因此会生成不同的taskid在不同的栈中;点击secondactivity1内的按钮,再跳出一个firstactivity(称为firstactivity2,又回到了taskA中)……以此类推,一个栈只能有一种Activity的多种实例,就像下面这样子
taskA(firstactivity1-firstactivity2-firstactivity3-……)
taskB(secondactivity1-secondactivity2-secondactivity3……)

注:每一个实例的代码都会附上相应的代码片或者图片,保证代码完整展示在博客中。
附:&Android开发思维导图一张思维导图,告诉你Android新手如何快速入门 - CSDN博客 https://blog.csdn.net/vanpersie_9987/article/details/52518782
&官方文档https://developer.android.google.cn/guide/components/activities
&Button监听事件的几种设置方法https://www.cnblogs.com/xiao-chuan/p/6074075.html
&学习视频教程地址
1. Android攻城狮的第一门课(入门篇)——第17章 认识“老朋友”Activity&第18章 使用Intent实现页面跳转https://www.imooc.com/learn/96
2.Android-重识Activityhttps://www.imooc.com/learn/384
3.Android-深入Activityhttps://www.imooc.com/learn/388
4..Android-精通Activityhttps://www.imooc.com/learn/413

猜你喜欢

转载自blog.csdn.net/Leo_Huang720/article/details/81128315