• Android的Activity


    Activity(活动)

    • Activity(活动)是一种展示型组件,它主要用于实现应用功能逻辑,并通过界面显示数据或接收用户输入。
    • 一个应用程序可以包含零个或多个活动。没有活动的应用程序,用户将无法看到程序界面,这种应用程序通常在后台运行,不涉及用户交互。

     活动的基本操作

    • 为活动绑定自定义视图:setContentView(R.layout.activity_main);
    • 启动另一个活动:startActivity(intent);
    • 结束活动:finish();

    实例1:具有页面跳转功能的App

    具体结果如图

    • 新建一个ActivityWork的工程

    • 新建第二个Activity文件

    • 在两个界面分别新建一个按钮,具体如图:

    • 分别编辑上图中的两个Java程序,具体代码如下:
     1 import androidx.appcompat.app.AppCompatActivity;
     2 
     3 import android.content.Intent;
     4 import android.os.Bundle;
     5 import android.view.View;
     6 import android.widget.Button;
     7 
     8 public class MainActivity extends AppCompatActivity {
     9     private Button button;
    10 
    11     @Override
    12     protected void onCreate(Bundle savedInstanceState) {
    13         super.onCreate(savedInstanceState);
    14         setContentView(R.layout.activity_main);
    15 
    16         button = (Button)findViewById(R.id.button);
    17 
    18         button.setOnClickListener(new View.OnClickListener() {
    19             @Override
    20             public void onClick(View v) {
    21                 Intent intent = new Intent(MainActivity.this,Main2Activity.class);
    22                 startActivity(intent);
    23             }
    24         });
    25     }
    26 }

    MainActivity.java

     1 import androidx.appcompat.app.AppCompatActivity;
     2 
     3 import android.os.Bundle;
     4 import android.view.View;
     5 import android.widget.Button;
     6 
     7 public class Main2Activity extends AppCompatActivity {
     8     private Button button2;
     9 
    10     @Override
    11     protected void onCreate(Bundle savedInstanceState) {
    12         super.onCreate(savedInstanceState);
    13         setContentView(R.layout.activity_main2);
    14 
    15         button2 = (Button)findViewById(R.id.button2);
    16         button2.setOnClickListener(new View.OnClickListener() {
    17             @Override
    18             public void onClick(View v) {
    19                 finish();
    20             }
    21         });
    22     }
    23 }

    Main2Activity.java

    • 运行之后,如上图所示!!!

    Activity的生命周期

    • Activity的生命周期指Activity从创建到被销毁的整个过程。在一个生命周期内,Activity可能存在多种状态。深入了解Activity的生命周期,有助于更合理管理应用程序资源,设计出效率更高的应用。

    • Activity生命周期包括创建、可见、获取焦点、失去焦点、不可见、重新可见、销毁等环节,每个环节Activity都定义了相关的回调方法,具体如下:
    名称调用时间
    onCreate(Bundle savedInstanceState) Activity创建时调用,通常做一些初始化设置。
    onStart() Activity 变为在屏幕上对用户可见时调用。
    onResume() Activity获取焦点时调用。
    onPause() 当前Activity被其他Activity覆盖或屏幕锁屏时调用。
    onStop() Activity对用户不可见时调用。
    onRestart() 重新启动已经停止的 Activity 时调用。
    onDestroy() Activity销毁时调用。
    该方法被调用可能是因为有人直接调用 finish() 方法或者系统决定停止该活动以释放资源。
    • Activity 生命周期中方法的调用过程如图所示,可以很直观地了解到 Activity 的整个生命周期。

    •  Activity 的生命周期表现在三个层面,如图所示,可以更清楚地了解 Activity 的运行机制。

    •  如果 Activity 离开可见阶段,长时间失去焦点,就很可能被系统销毁以释放资源。当然,即使该 Activity 被销毁掉,用户对该 Activity 所做的更改也会被保存在 Bundle 对象中,当用户需要重新显示该 Activity 时,Android 系统会根据之前保存的用户更改信息将该 Activity 重建。

    Activity的数据传递

    •  使用putExtra()传递数据
    • putExtra(name, value)方法可将指定的数据封装到Intent对象中。其中,name为表示数据名称的字符串,value为要传递的各种数据类型的值。
    • 要获取Intent对象中封装的数据,可调用各种getXXXExtra()方法。

    1. 使用Inten的putExtra传递

    名称 调用时间
    getCharExtra(Stringname,chardefaultValue) 获取指定name的char类型数据。
    getFloatExtra(Stringname,floatdefaultValue) 获取指定name的float类型数据。
    getFloatArrayExtra(Stringname) 获取指定name的float类型数组。
    getlntArrayExtra(Stringname) 获取指定name的int类型数组。
    getlntExtra(Stringname,intdefaultValue) 获取指定name的int类型数据。
    getStringArrayExtra(Stringname) 获取指定name的String类型数组。
    getstringExtra(Stringname) 获取指定name的String类型数据。
    getSerializableExtra(Stringname) 获取指定name的对象数据。
    • 这是两个实现数据传输、接受界面xml文件

     activity_main.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <androidx.constraintlayout.widget.ConstraintLayout
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     xmlns:app="http://schemas.android.com/apk/res-auto"
     5     xmlns:tools="http://schemas.android.com/tools"
     6     android:layout_width="match_parent"
     7     android:layout_height="match_parent"
     8     tools:context=".MainActivity">
     9 
    10     <Button
    11         android:id="@+id/button"
    12         android:layout_width="wrap_content"
    13         android:layout_height="wrap_content"
    14         android:layout_marginStart="41dp"
    15         android:layout_marginTop="34dp"
    16         android:text="跳转"
    17         app:layout_constraintStart_toStartOf="parent"
    18         app:layout_constraintTop_toTopOf="parent" />
    19 
    20 </androidx.constraintlayout.widget.ConstraintLayout>

    activity_main2.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <androidx.constraintlayout.widget.ConstraintLayout
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     xmlns:app="http://schemas.android.com/apk/res-auto"
     5     xmlns:tools="http://schemas.android.com/tools"
     6     android:layout_width="match_parent"
     7     android:layout_height="match_parent"
     8     tools:context=".Main2Activity">
     9 
    10     <TextView
    11         android:id="@+id/textView"
    12         android:layout_width="wrap_content"
    13         android:layout_height="wrap_content"
    14         android:layout_marginTop="84dp"
    15         android:text="TextView"
    16         android:textSize="30sp"
    17         app:layout_constraintStart_toStartOf="parent"
    18         app:layout_constraintTop_toTopOf="parent" />
    19 </androidx.constraintlayout.widget.ConstraintLayout>
    • 两个Java文件

    MainActivity.java

     1 import androidx.appcompat.app.AppCompatActivity;
     2 
     3 import android.content.Intent;
     4 import android.os.Bundle;
     5 import android.view.View;
     6 import android.widget.Button;
     7 
     8 public class MainActivity extends AppCompatActivity {
     9 
    10     private Button button;
    11     @Override
    12     protected void onCreate(Bundle savedInstanceState) {
    13         super.onCreate(savedInstanceState);
    14         setContentView(R.layout.activity_main);
    15 
    16         button = findViewById(R.id.button);
    17         button.setOnClickListener(new View.OnClickListener() {
    18             @Override
    19             public void onClick(View v) {
    20                 Intent intent = new Intent(MainActivity.this,Main2Activity.class);
    21                 //使用putExtra传递数据
    22                 intent.putExtra("name","zhangsan");
    23                 intent.putExtra("score",95);
    24 
    25                 startActivity(intent);
    26             }
    27         });
    28     }
    29 }

    Main2Activity.java

     1 import androidx.appcompat.app.AppCompatActivity;
     2 
     3 import android.content.Intent;
     4 import android.os.Bundle;
     5 import android.widget.TextView;
     6 
     7 import androidx.appcompat.app.AppCompatActivity;
     8 
     9 public class Main2Activity extends AppCompatActivity {
    10 
    11     private TextView textView;
    12 
    13     @Override
    14     protected void onCreate(Bundle savedInstanceState) {
    15         super.onCreate(savedInstanceState);
    16         setContentView(R.layout.activity_main2);
    17 
    18         Intent intent = getIntent();
    19 
    20         //使用getExtra接收数据
    21         String name = intent.getStringExtra("name");
    22         int score = intent.getIntExtra("score", 0);
    23 
    24         textView = findViewById(R.id.textView);
    25         textView.setText("name=" + name + ",score=" + score);
    26     }
    27 }
    • 实现如图:

     

    2. 使用Intention的Bundle传递

    • 将各种数据封装到一个Bundle对象中,再将Bundle对象封装到Intent对象中传递给启动的活动。
    • Bundle对象的各种putXXX(String key, XXX value)方法,可将XXX类型的数据封装到其中,对应的用getXXX(String key)方法从其中获取数据。
    • Bundle对象准备好之后,调用putExtras(bundle)或putExtra(name,bundle)方法将其封装到Intent对象中。
    • 要从Intent对象中获取Bundle对象时,调用对应的getExtras()或getBundleExtra()方法即可。

    操作步骤与putExtra()传递数据类似,只需更改上面四个文件中的两个Java文件,具体代码如下:

    MainActivity.java

     1 import androidx.appcompat.app.AppCompatActivity;
     2 
     3 import android.content.Intent;
     4 import android.os.Bundle;
     5 import android.view.View;
     6 import android.widget.Button;
     7 
     8 public class MainActivity extends AppCompatActivity {
     9 
    10     private Button button;
    11     @Override
    12     protected void onCreate(Bundle savedInstanceState) {
    13         super.onCreate(savedInstanceState);
    14         setContentView(R.layout.activity_main);
    15 
    16         button = findViewById(R.id.button);
    17         button.setOnClickListener(new View.OnClickListener() {
    18             @Override
    19             public void onClick(View v) {
    20                 Intent intent = new Intent(MainActivity.this,Main2Activity.class);
    21 
    22                 //使用Bundle传递数据
    23             Bundle bundle = new Bundle();
    24             bundle.putString("name","zhangsan");
    25             bundle.putInt("score",95);
    26             intent.putExtras(bundle);
    27 
    28                 startActivity(intent);
    29             }
    30         });
    31     }
    32 }

    Main2Activity.java

     1 import androidx.appcompat.app.AppCompatActivity;
     2 
     3 import android.content.Intent;
     4 import android.os.Bundle;
     5 import android.widget.TextView;
     6 
     7 import androidx.appcompat.app.AppCompatActivity;
     8 
     9 public class Main2Activity extends AppCompatActivity {
    10 
    11     private TextView textView;
    12 
    13     @Override
    14     protected void onCreate(Bundle savedInstanceState) {
    15         super.onCreate(savedInstanceState);
    16         setContentView(R.layout.activity_main2);
    17 
    18         Intent intent = getIntent();
    19 
    20         //使用Bundle接收数据
    21         Bundle bundle = intent.getExtras();
    22         String name = bundle.getString("name");
    23         int score = bundle.getInt("score",0);
    24 
    25         textView = findViewById(R.id.textView);
    26         textView.setText("name=" + name + ",score=" + score);
    27     }
    28 }
    • 运行显示如图:

    • 以下几种就不做详细赘述,只提供代码。

    3. 使用静态变量传递数据

    第一个Activity

    1 Intent intent = new Intent(MainActivity.this,TwoActivity.class);
    2 TwoActivity.name="牛逼";
    3 TwoActivity.str="你说";
    4 startActivity(intent);

    第二个Activity

    1 //静态变量
    2 protected static String name;
    3 protected static String str;
    4 tv.setText(str+name);

    4. 使用序列化对象Seriazable

    工具类

     1 import java.io.Serializable;
     2 class DataBean implements Serializable {
     3  private String name;
     4  private String sex;
     5  public String getName() {
     6  return name;
     7  }
     8  public void setName(String name) {
     9  this.name = name;
    10  }
    11  public String getSex() {
    12  return sex;
    13  }
    14  public void setSex(String sex) {
    15  this.sex = sex;
    16  }
    17 }

    第一个Activity

    1 //创建意图
    2  Intent intent = new Intent(MainActivity.this,TwoActivity.class);
    3  DataBean bean = new DataBean();
    4  //通过set方法把数据保存到DataBean对象中
    5  bean.setName("啦啦");
    6  bean.setSex("男");
    7  intent.putExtra("key", bean);
    8  startActivity(intent);

    第二个Activity

    1 Intent intent = getIntent();
    2  //反序列化数据对象
    3  Serializable se = intent.getSerializableExtra("key");
    4  if(se instanceof DataBean){
    5   //获取到携带数据的DataBean对象db
    6   DataBean db = (DataBean) se;
    7   tv.setText(db.getName()+"==="+db.getSex());
    8  }

    5. SharedPreferences传递数据

    第一个Activity中

    1 SharedPreferences sp = this.getSharedPreferences("info", 1);
    2  //获取sp编辑器
    3  Editor edit = sp.edit();
    4  edit.putString("data", str);
    5  edit.commit();
    6  //创建意图对象
    7  Intent intent = new Intent(MainActivity.this,TwoActivity.class);
    8  //激活意图
    9  startActivity(intent);

    第二个Activity中

    SharedPreferences sp = this.getSharedPreferences("info", 1);
    //设置数据
    tv.setText(sp.getString("data", ""));
    

    6. 使用Activity销毁时传递数据  

    第一个Activity中

    1  Intent intent = new Intent(MainActivity.this,TwoActivity.class);
    2   //用一种特殊方式开启Activity
    3  startActivityForResult(intent, 11);
    4 //设置数据
    5 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    6  super.onActivityResult(requestCode, resultCode, data);
    7  String str = data.getStringExtra("data");
    8  tvOne.setText(str);
    9 }

    第二个activity中

    1 //设置返回的数据
    2  Intent intent = new Intent();
    3  intent.putExtra("data", edtOne.getText().toString().trim());
    4  setResult(3, intent);
    5  //关闭当前activity
    6  finish();

    7. 获取活动返回的数据

    •  startActivityForResult(intent,requestCode)方法来启动活动,请求返回结果:
      • 参数intent是一个Intent对象,用于封装需要传递给活动的数据;
      • 参数requestCode为请求码,是一个整数,用来标识当前请求;一个活动可能会接收到其他不同活动的请求,从活动返回时,它会原样返回接收到的请求码;
      • 在处理返回结果时,可通过请求码判断是不是从所请求的活动返回。
      • 在第二个Activity中,用setResult(resultCode,intent)方法设置返回结果resultCode为结果代码,intent为封装了返回数据的Intent对象。

      •  

        在第一个Activity中需重写onActivityResult(int requestCode,int resultCodey, I

        ntent data)方法来处理返回结果:

        • requestCode为从所请求的活动返回的它所接收到的请求码;

        •  

          resultCode为结果代码,常量RESULTCANCELED表示用户取消了操作,RESULT_OK表示用户正确完成了操作;
        • data为请求活动返回的Intent对象,从中可获取返回的数据。

    activity_main.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <androidx.constraintlayout.widget.ConstraintLayout
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     xmlns:app="http://schemas.android.com/apk/res-auto"
     5     xmlns:tools="http://schemas.android.com/tools"
     6     android:layout_width="match_parent"
     7     android:layout_height="match_parent"
     8     tools:context=".MainActivity">
     9 
    10     <TextView
    11         android:id="@+id/textView"
    12         android:layout_width="wrap_content"
    13         android:layout_height="wrap_content"
    14         android:text="Hello World!"
    15         app:layout_constraintBottom_toBottomOf="parent"
    16         app:layout_constraintLeft_toLeftOf="parent"
    17         app:layout_constraintRight_toRightOf="parent"
    18         app:layout_constraintTop_toTopOf="parent" />
    19 
    20     <Button
    21         android:id="@+id/button"
    22         android:layout_width="wrap_content"
    23         android:layout_height="wrap_content"
    24         android:layout_marginStart="70dp"
    25         android:layout_marginLeft="70dp"
    26         android:layout_marginTop="90dp"
    27         android:text="Button"
    28         app:layout_constraintStart_toStartOf="parent"
    29         app:layout_constraintTop_toTopOf="parent" />
    30 
    31 </androidx.constraintlayout.widget.ConstraintLayout>

    activity_main2.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <androidx.constraintlayout.widget.ConstraintLayout
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     xmlns:app="http://schemas.android.com/apk/res-auto"
     5     xmlns:tools="http://schemas.android.com/tools"
     6     android:layout_width="match_parent"
     7     android:layout_height="match_parent"
     8     tools:context=".Main2Activity">
     9 
    10     <Button
    11         android:id="@+id/button2"
    12         android:layout_width="wrap_content"
    13         android:layout_height="wrap_content"
    14         android:layout_marginStart="82dp"
    15         android:layout_marginLeft="82dp"
    16         android:layout_marginTop="153dp"
    17         android:text="Button"
    18         app:layout_constraintStart_toStartOf="parent"
    19         app:layout_constraintTop_toTopOf="parent" />
    20 </androidx.constraintlayout.widget.ConstraintLayout>

    MainActivity.java

     1 import android.content.Intent;
     2 import android.os.Bundle;
     3 import android.view.View;
     4 import android.widget.Button;
     5 import android.widget.TextView;
     6 
     7 import androidx.annotation.Nullable;
     8 import androidx.appcompat.app.AppCompatActivity;
     9 
    10 /**
    11  * 点击Button将从第一个界面跳到第二个界面,第二个界面点击Button将跳回到第一个界面,并将数据返回第一个界面
    12  */
    13 public class MainActivity extends AppCompatActivity {
    14 
    15     private Button button;
    16     private TextView textView;
    17 
    18     @Override
    19     protected void onCreate(Bundle savedInstanceState) {
    20         super.onCreate(savedInstanceState);
    21         setContentView(R.layout.activity_main);
    22 
    23         textView = findViewById(R.id.textView);
    24 
    25         button = findViewById(R.id.button);
    26         button.setOnClickListener(new View.OnClickListener() {
    27             @Override
    28             public void onClick(View v) {
    29                 Intent intent = new Intent(MainActivity.this, Main2Activity.class);
    30                 //请求返回结果
    31                 startActivityForResult(intent, 1);
    32             }
    33         });
    34     }
    35 
    36     /**
    37      * 返回结果处理
    38      *
    39      * @param requestCode
    40      * @param resultCode
    41      * @param data
    42      */
    43     @Override
    44     protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    45         super.onActivityResult(requestCode, resultCode, data);
    46         if (requestCode == 1) {
    47             if (resultCode == 1) {
    48                 //取出返回结果
    49                 String string = data.getStringExtra("ExtraData");
    50                 //将返回结果设置到textView上
    51                 textView.setText(string);
    52             }
    53         }
    54 
    55     }
    56 }

    Main2Activity.java

     1 import android.content.Intent;
     2 import android.os.Bundle;
     3 import android.view.View;
     4 import android.widget.Button;
     5 
     6 import androidx.appcompat.app.AppCompatActivity;
     7 
     8 public class Main2Activity extends AppCompatActivity {
     9 
    10     private Button button2;
    11 
    12     @Override
    13     protected void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         setContentView(R.layout.activity_main2);
    16 
    17         button2 = findViewById(R.id.button2);
    18         button2.setOnClickListener(new View.OnClickListener() {
    19             @Override
    20             public void onClick(View v) {
    21                 Intent intent = new Intent();
    22                 intent.putExtra("ExtraData", "从第二个界面来的数据");
    23                 //设置返回结果,将“ExtraData”的值 通过intent返回
    24                 setResult(1, intent);
    25                 finish();
    26             }
    27         });
    28     }
    29 }
    • 运行如图:

    欢迎查阅
  • 相关阅读:
    使用CSS3制图
    hdu4585 &amp; BestCoder Round #1 项目管理(vector应用)
    ZooKeeperEclipse 小工具
    svn代码统计工具的金额
    【教你zencart仿站 文章1至6教训 高清1280x900视频下载】[支持手机端]
    [Django]models定义choices 字典中的页面显示值
    xml publisher根据条件显示或隐藏列
    hdu 1398 Square Coins(生成函数,完全背包)
    ubuntu软件中心崩溃
    PHP socket类
  • 原文地址:https://www.cnblogs.com/gh110/p/12604656.html
Copyright © 2020-2023  润新知