一起学Android之Activity

╰半橙微兮° 2022-01-10 06:27 575阅读 0赞

概述

本文以一个简单的小例子,简述Android开发中Activity的相关知识,仅供学习分享使用。

什么是Activity?

Activity是一个应用程序组件,通常显示为一个页面,用户可以通过Activity进行交互,Activity窗口通常是满屏的,但有时也会比屏幕小。一个App通常有多个Activity组成,但是只有一个Main类型的Activity,作为程序的入口。每次有一个新的Activity启动时,前一个Activity会停止并且被压入堆栈中,因此当用户按下【回退】键时,当前Activity就会从堆栈中弹出并销毁,前一个Activity会恢复显示在当前窗口中。

当一个Activity因为新Activity的启动而停止时,它会通过Activity生命周期的回调函数通知状态的变更。由于某个Activity的状态发生变化,可能接收到多个回调方法,您就可以在各个不同的回调方法中做适合于此状态的工作。如当Activity停止时,应当释放一些占用内存的资源,当活动恢复时,应该重新获取资源,并恢复被阻止的操作。这些都是生命周期的一部分。

涉及知识点

  1. this.findViewById(R.id.bn_click_me) 通过此函数获取页面上的控件,参数为控件ID。
  2. startActivityForResult(intent,REQCODE); 启动Activity并带请求标识符。
  3. onActivityResult(int requestCode, int resultCode, Intent data); 通过重写此方法处理回调程序。
  4. setResult(int resultCode, Intent data) 调用此方法设置返回信息到调用方。
  5. finish() 调用此方法关闭Activity。
  6. setContentView(R.layout.activity_main2); 通过此方法加载Activity对应的资源文件。

Activity的组成

一个新的Activity包含四个组成部分:

  1. 必需继承自Activity或Activity的子类。
  2. 必需重写onCreate(Bundle savedInstanceState) 方法。
  3. 必需有对应的资源布局文件,并在onCreate 方法中,通过 setContentView 方法进行加载。
  4. 必需在App的资源程序清单【AndroidManifest.xml】中进行注册。

如下图所示:

1068941-20190526145308209-321094518.png

1068941-20190526145330265-1460857432.png

Activity的生命周期

Activity的生命周期,是指一个Activity从创建到消亡的过程。如下图所示,就像人的生命周期一样,只有了解了生命周期的不同阶段,才能在对应的时间节点,做对应的事情。

1068941-20190526145437867-164192260.png

Activity的整个生命周期,都是发生在Activity launched 和Activity shut down之间,从回调函数上看,发生在 onCreate() 和 onDestroy()之间,如下图所示:

1068941-20190526145655754-1735508224.png

Activity的状态转换如下:

1068941-20190526145752679-1626423705.png

单个Activity的运行日志如下:

  1. 1 05-25 23:33:18.863 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onCreate----------------
  2. 2 05-25 23:33:18.978 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onStart----------------
  3. 3 05-25 23:33:18.983 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onResume----------------
  4. 4 05-25 23:33:32.810 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onPause----------------
  5. 5 05-25 23:33:33.420 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onStop----------------
  6. 6 05-25 23:33:33.420 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onDestroy----------------

两个Activity运行状态日志如下:

  1. 1 //显示第一个Activity
  2. 2 05-25 23:35:59.279 16770-16770/? I/DemoActivity: -----------1-----onCreate----------------
  3. 3 05-25 23:35:59.409 16770-16770/? I/DemoActivity: -----------1-----onStart----------------
  4. 4 05-25 23:35:59.413 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onResume----------------
  5. 5 05-25 23:36:04.367 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onPause----------------
  6. 6 //进入第二个Activity
  7. 7 05-25 23:36:04.391 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onCreate----------------
  8. 8 05-25 23:36:04.413 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onStart----------------
  9. 9 05-25 23:36:04.417 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onResume----------------
  10. 10 05-25 23:36:04.855 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onStop----------------
  11. 11 //点击返回键,返回第一个Activity
  12. 12 05-25 23:36:06.872 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onPause----------------
  13. 13 05-25 23:36:06.889 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onRestart----------------
  14. 14 05-25 23:36:06.889 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onStart----------------
  15. 15 05-25 23:36:06.890 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onResume----------------
  16. 16 05-25 23:36:07.181 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onStop----------------
  17. 17 05-25 23:36:07.182 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onDestroy----------------
  18. 18 //再次点击返回键,退出程序
  19. 19 05-25 23:36:08.762 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onPause----------------
  20. 20 05-25 23:36:09.296 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onStop----------------
  21. 21 05-25 23:36:09.296 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onDestroy----------------

Activity之间的传值

Activity之间的传值方式:

  1. Activity之间通过Intent传值。
  2. Activity之间通过Bundle传值。
  3. Activity之间使用Application全局对象传值。
  4. 启动Activity回传对象传值。

Activity之间通过Intent传值,主要用于传递简单类型的数据。

发送方如下:

  1. 1 Intent intent =new Intent(MainActivity.this,Main2Activity.class);
  2. 2 intent.putExtra("Name","张三");
  3. 3 intent.putExtra("Age",30);
  4. 4 startActivity(intent);

接收方如下:

  1. 1 Intent intent=getIntent();//获取当前Activity对应的Intent
  2. 2 String name= intent.getStringExtra("Name");//获取Intent中存储的值
  3. 3 int age =intent.getIntExtra("Age",0);
  4. 4 tvValue.setText("Name="+name+",Age="+age);//将获取的值显示在TextView中

Activity之间通过Bundle传值

主要用于传递稍微复杂类型的值,具体如下:

发送方:

  1. 1 Intent intent =new Intent(MainActivity.this,Main2Activity.class);
  2. 2 Bundle bundle=new Bundle();
  3. 3 bundle.putString("Name","张三");
  4. 4 bundle.putInt("Age",30);
  5. 5 intent.putExtras(bundle);
  6. 6 startActivity(intent);

接收方:

  1. 1 Intent intent=getIntent();//获取当前Activity对应的Intent
  2. 2 Bundle bundle=intent.getExtras();
  3. 3 String name=bundle.getString("Name","");
  4. 4 int age=bundle.getInt("Age",0);
  5. 5 tvValue.setText("Name="+name+",Age="+age);//将获取的值显示在TextView中

Activity之间通过Application全局变量进行传值。

步骤如下:

自定义MyApp类,继承自Application类,自定义两个变量并进行封装成属性。如下所示:

  1. 1 /**
  2. 2 * Created by Administrator on 2019/5/26.
  3. 3 * 右键Refactor(重构)-->encapsulate Fields (封装属性)
  4. 4 */
  5. 5 public class MyApp extends Application {
  6. 6
  7. 7 private String name;
  8. 8
  9. 9 private int age;
  10. 10
  11. 11 public String getName() {
  12. 12 return name;
  13. 13 }
  14. 14
  15. 15 public void setName(String name) {
  16. 16 this.name = name;
  17. 17 }
  18. 18
  19. 19 public int getAge() {
  20. 20 return age;
  21. 21 }
  22. 22
  23. 23 public void setAge(int age) {
  24. 24 this.age = age;
  25. 25 }
  26. 26 }

发送方:

  1. 1 Intent intent =new Intent(MainActivity.this,Main2Activity.class);
  2. 2 myapp= (MyApp) getApplication();
  3. 3 myapp.setName("张三");
  4. 4 myapp.setAge(30);
  5. 5 startActivity(intent);

接收方:

  1. 1 //通过Application进行传值
  2. 2 MyApp myapp= (MyApp) getApplication();
  3. 3 String name=myapp.getName();
  4. 4 int age=myapp.getAge();
  5. 5 tvValue.setText("Name="+name+",Age="+age);//将获取的值显示在TextView中

通过Application的方式进行传值,需要在AndroidManifest.xml中进行注册,如下图所示:

1068941-20190526150748321-357158431.png

通过回调函数传值

发送方:

  1. 1 //定义一个静态变量REQCODE作为标识符,通过startActivityForResult进行调用。
  2. 2 Intent intent =new Intent(MainActivity.this,Main2Activity.class);
  3. 3 startActivityForResult(intent,REQCODE);
  4. 4
  5. 5 /**
  6. 6 *通过重写父类的onActivityResult方法接收并处理回传信息
  7. 7 */
  8. 8 @Override
  9. 9 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  10. 10 //super.onActivityResult(requestCode, resultCode, data);
  11. 11 if(resultCode==RESULT_OK){
  12. 12 if(requestCode==REQCODE){
  13. 13 String Res=data.getStringExtra("Res");
  14. 14 Toast.makeText(MainActivity.this,"Res="+Res,Toast.LENGTH_SHORT).show();
  15. 15 }
  16. 16 }
  17. 17 }

接收方:通过调用setResult方法,回传信息

  1. 1 tvInfo.setOnClickListener(new View.OnClickListener() {
  2. 2 @Override
  3. 3 public void onClick(View v) {
  4. 4 Intent intent1=new Intent();
  5. 5 intent1.putExtra("Res","我是第二个传过来的");
  6. 6 Main2Activity.this.setResult(RESULT_OK ,intent1);
  7. 7 Main2Activity.this.finish();
  8. 8 }
  9. 9 });

备注

纸上得来终觉浅,绝知此事要躬行。

转载于:https://www.cnblogs.com/hsiang/p/10926163.html

发表评论

表情:
评论列表 (有 0 条评论,575人围观)

还没有评论,来说两句吧...

相关阅读

    相关 一起python

    10000+在学的《专门AI小白设计的人工智能实战课》,从0学AI的必备课程:Python语法+数学基础+机器学习+深度学习+计算视觉,打下扎实的项目能力![在这里插入图片描述

    相关 AndroidActivity框架

    在安卓应用中,经常需要Activity中经常需要有大量相似的Activity类,这些类往往有相似的结构与功能,因此产生了大量重复代码,为此,以下提供一种方法有效的降低了代码冗