欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

一起学Android之Activity

程序员文章站 2022-03-16 08:45:19
本文以一个简单的小例子,简述Android开发中Activity的相关知识,仅供学习分享使用。 ......

概述

本文以一个简单的小例子,简述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. 必需继承自activityactivity的子类。
  2. 必需重写oncreate(bundle savedinstancestate) 方法。
  3. 必需有对应的资源布局文件,并在oncreate 方法中,通过 setcontentview 方法进行加载。
  4. 必需在app的资源程序清单【androidmanifest.xml】中进行注册。

如下图所示:

一起学Android之Activity

一起学Android之Activity

activity的生命周期

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

一起学Android之Activity

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

一起学Android之Activity

activity的状态转换如下:

一起学Android之Activity

单个activity的运行日志如下:

1 05-25 23:33:18.863 15877-15877/com.hex.demoactivity i/demoactivity: -----------1-----oncreate----------------
2 05-25 23:33:18.978 15877-15877/com.hex.demoactivity i/demoactivity: -----------1-----onstart----------------
3 05-25 23:33:18.983 15877-15877/com.hex.demoactivity i/demoactivity: -----------1-----onresume----------------
4 05-25 23:33:32.810 15877-15877/com.hex.demoactivity i/demoactivity: -----------1-----onpause----------------
5 05-25 23:33:33.420 15877-15877/com.hex.demoactivity i/demoactivity: -----------1-----onstop----------------
6 05-25 23:33:33.420 15877-15877/com.hex.demoactivity i/demoactivity: -----------1-----ondestroy----------------

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

 1 //显示第一个activity
 2 05-25 23:35:59.279 16770-16770/? i/demoactivity: -----------1-----oncreate----------------
 3 05-25 23:35:59.409 16770-16770/? i/demoactivity: -----------1-----onstart----------------
 4 05-25 23:35:59.413 16770-16770/com.hex.demoactivity i/demoactivity: -----------1-----onresume----------------
 5 05-25 23:36:04.367 16770-16770/com.hex.demoactivity i/demoactivity: -----------1-----onpause----------------
 6 //进入第二个activity
 7 05-25 23:36:04.391 16770-16770/com.hex.demoactivity i/demoactivity: -----------2-----oncreate----------------
 8 05-25 23:36:04.413 16770-16770/com.hex.demoactivity i/demoactivity: -----------2-----onstart----------------
 9 05-25 23:36:04.417 16770-16770/com.hex.demoactivity i/demoactivity: -----------2-----onresume----------------
10 05-25 23:36:04.855 16770-16770/com.hex.demoactivity i/demoactivity: -----------1-----onstop----------------
11 //点击返回键,返回第一个activity
12 05-25 23:36:06.872 16770-16770/com.hex.demoactivity i/demoactivity: -----------2-----onpause----------------
13 05-25 23:36:06.889 16770-16770/com.hex.demoactivity i/demoactivity: -----------1-----onrestart----------------
14 05-25 23:36:06.889 16770-16770/com.hex.demoactivity i/demoactivity: -----------1-----onstart----------------
15 05-25 23:36:06.890 16770-16770/com.hex.demoactivity i/demoactivity: -----------1-----onresume----------------
16 05-25 23:36:07.181 16770-16770/com.hex.demoactivity i/demoactivity: -----------2-----onstop----------------
17 05-25 23:36:07.182 16770-16770/com.hex.demoactivity i/demoactivity: -----------2-----ondestroy----------------
18 //再次点击返回键,退出程序
19 05-25 23:36:08.762 16770-16770/com.hex.demoactivity i/demoactivity: -----------1-----onpause----------------
20 05-25 23:36:09.296 16770-16770/com.hex.demoactivity i/demoactivity: -----------1-----onstop----------------
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 intent intent =new intent(mainactivity.this,main2activity.class);
2 intent.putextra("name","张三");
3 intent.putextra("age",30);
4 startactivity(intent);

接收方如下:

1 intent intent=getintent();//获取当前activity对应的intent
2 string name=  intent.getstringextra("name");//获取intent中存储的值
3 int age =intent.getintextra("age",0);
4 tvvalue.settext("name="+name+",age="+age);//将获取的值显示在textview中

activity之间通过bundle传值

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

发送方:

1 intent intent =new intent(mainactivity.this,main2activity.class);
2 bundle bundle=new bundle();
3 bundle.putstring("name","张三");
4 bundle.putint("age",30);
5 intent.putextras(bundle);
6 startactivity(intent);

接收方:

1 intent intent=getintent();//获取当前activity对应的intent
2 bundle bundle=intent.getextras();
3 string name=bundle.getstring("name","");
4 int age=bundle.getint("age",0);
5 tvvalue.settext("name="+name+",age="+age);//将获取的值显示在textview中

activity之间通过application全局变量进行传值。

步骤如下:

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

 1 /**
 2  * created by administrator on 2019/5/26.
 3  * 右键refactor(重构)-->encapsulate fields (封装属性)
 4  */
 5 public class myapp extends application {
 6 
 7     private string name;
 8 
 9     private int age;
10 
11     public string getname() {
12         return name;
13     }
14 
15     public void setname(string name) {
16         this.name = name;
17     }
18 
19     public int getage() {
20         return age;
21     }
22 
23     public void setage(int age) {
24         this.age = age;
25     }
26 }

发送方:

1 intent intent =new intent(mainactivity.this,main2activity.class);
2 myapp= (myapp) getapplication();
3 myapp.setname("张三");
4 myapp.setage(30);
5 startactivity(intent);

接收方:

1 //通过application进行传值
2 myapp myapp= (myapp) getapplication();
3 string name=myapp.getname();
4 int age=myapp.getage();
5 tvvalue.settext("name="+name+",age="+age);//将获取的值显示在textview中

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

一起学Android之Activity

通过回调函数传值

发送方:

 1 //定义一个静态变量reqcode作为标识符,通过startactivityforresult进行调用。
 2 intent intent =new intent(mainactivity.this,main2activity.class);
 3 startactivityforresult(intent,reqcode);
 4 
 5 /**
 6 *通过重写父类的onactivityresult方法接收并处理回传信息
 7 */
 8 @override
 9 protected void onactivityresult(int requestcode, int resultcode, intent data) {
10     //super.onactivityresult(requestcode, resultcode, data);
11     if(resultcode==result_ok){
12         if(requestcode==reqcode){
13             string res=data.getstringextra("res");
14             toast.maketext(mainactivity.this,"res="+res,toast.length_short).show();
15         }
16     }
17 }

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

 

1 tvinfo.setonclicklistener(new view.onclicklistener() {
2     @override
3     public void onclick(view v) {
4         intent intent1=new intent();
5         intent1.putextra("res","我是第二个传过来的");
6         main2activity.this.setresult(result_ok ,intent1);
7         main2activity.this.finish();
8     }
9 });

 

备注

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