Activity组件学习 | 青训营笔记

256 阅读6分钟

这是我参与「第四届青训营 」笔记创作活动的第1天

Activity组件

Activity是什么

​ Activity是一个应用程序的组件,他在屏幕上提供了一个区域,允许用户在上面做一些交互性的操作, 比如打电话,照相,发送邮件,或者显示一个地图!Activity可以理解成一个绘制用户界面的窗口, 而这个窗口可以填满整个屏幕,也可能比屏幕小或者浮动在其他窗口的上方!

​ 总结来说,我们可以得到以下两条信息:

	1. Activity用于显示用户界面,用户通过Activity交互完成相关操作
	1. 一个App允许有多个Activity

Activity的概念

Activity活动,理解为手机屏幕,与用户交互的可视化界面;Activity存储再Activity栈中,后进先出

Activity的生命周期

image-20220808092759752.png

这是Activity的生命周期图,那么现在来详细的了解一下每一个过程

  1. 首先是onCreate方法,此方法会在Activity首次被创建的时候被调用,也就是我们生成一个Activity文件的时候,编译器会自动帮我们创建好这个方法
  2. 接着当我们的程序跑起来,这个页面呈现在我们的手机上的时候,调用的就是onStart方法,也就是说编译运行执行onCreate方法,显示出来执行onStart方法
  3. onResume方法的作用是让当前Activity位于前台,也就是栈顶(这里解释一下栈顶,我们平时玩手机也都知道,页面是一层覆盖一层的,也就是说这些页面其实就是存在一个里面的,我们按回退键就会离开当前页面,回到上一个页面,符合后进先出的规则)所以此方法就是让当前页面回到前台
  4. onPause方法会在我们拉起一个新Activity的时候执行,也就是说新的Activity进栈了,开始执行onCreate方法,那么当前的Activity就要执行onPause方法,将当前页面中的数据暂停保存下来,当新页面被用户退出后,我们当前的这个Activity就会回调执行onResume方法重新运行
  5. onStop方法会在我们拉起一个新Activity并且当前Activity不需要再显示的情况下运行,如果我们要让当前Activity再次获取焦点的话,就需要调用onRestart方法重新执行
  6. 如果我们在跳转到新的页面后,当前页面完成了它的工作,也就是说当前页面没有存在的意义了,留着只会占内存的话,就要执行onDestory方法销毁当前的Activity,那么当前的Activity就彻底终止了

以上就是整个Activity生命周期图的详细介绍

注意:以上这些方法都是回调方法,我们不能去调用,也不能阻止它调用,什么时候调用都是由Activity决定,我们能做的是重写方法的内容和调用finish方法关闭某个Activity。

注意2:onPause()和onStop()被调用的前提是: 打开了一个新的Activity!而前者是旧Activity还可见的状态;后者是旧Activity已经不可见!

Activity怎么用

class MyActivity extends Activity{
    //重写onCreate方法,并且设置要显示的视图文件
    public void onCreate(Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
        setContentView(R.layout.main);
        
        //启动activity,经常用于做界面的跳转,前一个属性是当前页面,后一个属性是我们要跳转的页面
        Intent it = new Intent(MainActivity.this ,MainActivity.class);
        startActivity(it);
    }
}

class MyActivity2 extends Activity{
    public void onCreate(Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
        setContentView(R.layout.main);
        //结束当前页面,关闭当前Activity
       	finish();
    }
}

以上是java文件的编写,下面是安卓配置xml文件的编写

<activity
          android:icon = "xxx"
          android:name = "类名"
          android:lable = "要显示的标题"
          android:theme = "应用主题"></activity>

下面是实战例子,一个界面跳转:

MainActivity

image-20220808100317404.png

MainActivity2

image-20220808100341538.png

系统提供Activity

此外,系统还给我们提供了一些常见的Activity,例如拨打电话,发送短信,打开相机,打开浏览器等,可以自行上网搜索


Activity间的数据传递

数据传递

这是单个数据的传递

public class MainActivity extends AppCompatActivity {

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

        EditText editText = findViewById(R.id.edit_text1);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent it = new Intent(MainActivity.this ,MainActivity2.class);
                it.putExtra("edit1" ,editText.getText().toString());
                startActivity(it);
            }
        });
    }
}

public class MainActivity2 extends AppCompatActivity {

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

        Intent it2 = getIntent();
        TextView textView = findViewById(R.id.text);
        textView.setText("欢迎你:" + it2.getStringExtra("edit1"));

        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}

下面是多个数据的传递

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent it = new Intent(MainActivity.this ,MainActivity2.class);
                Bundle bd = new Bundle();
                bd.putInt("num" ,10);
                bd.putString("name" ,"zhangsan");
                it.putExtras(bd);
                startActivity(it);
            }
        });
    }
}

public class MainActivity2 extends AppCompatActivity {

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

        Intent it2 = getIntent();
        Bundle bd = it2.getExtras();
        TextView textView = findViewById(R.id.text);
        int num = bd.getInt("num");
        String name = bd.getString("name");
        System.out.println(num);
        System.out.println(name);
        textView.setText("你好编号" + num + " 姓名:" + name);

        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}

随时关闭所有Activity

这个很简单,只需要定义一个集合,将所有Activity传到一个集合里面,然后再想要关闭所有Activity的时候遍历集合就可以了

public class ActivityCollector {  
    public static LinkedList<Activity> activities = new LinkedList<Activity>();  
    public static void addActivity(Activity activity)  
    {  
        activities.add(activity);  
    }  
    public static void removeActivity(Activity activity)  
    {  
        activities.remove(activity);  
    }  
    public static void finishAll()  
    {  
        for(Activity activity:activities)  
        {  
            if(!activity.isFinishing())  
            {  
                activity.finish();  
            }  
        }  
    }  
}  

Activity的四种加载模式

standard模式

通过这种模式每次启动Activity,都会创建一个新的Activity,即使有一个该Activity类在栈顶,它还是会创建一个新的Activity压入栈中

例如当前我们的第一个页面是A,A页面上有一个B页面,现在我们需要重新回到A页面,如果用standard模式启动,那么就会新创建一个A页面压入Activity栈,位于B页面之上,所以Activity栈里面就会是A-B-A的形式

SingleTask模式

只允许在系统中有一个Activity实例。如果系统中已经有了一个实例, 持有这个实例的任务将移动到顶部,同时intent将被通过onNewIntent()发送。 如果没有,则会创建一个新的Activity并置放在合适的任务中。

根据以上内容可以分为三种情况:

  1. 如果要启动的Activity不存在,那么就会创建一个并且压入栈顶
  2. 如果启动的Activity已经位于栈顶,那么就不会进行新的创建,直接复用
  3. 如果启动的Activity存在,但是不位于栈顶,那么就会移除在该Activity上的其它Activity,从而将它位于栈顶

SingleTop

此模式是栈顶复用模式,如果此Activity是SingleTop启动模式,那么在创建的时候会先进行判断当前栈顶是否是该Activity,如果不是,那么新建一个正常入栈,如果栈顶是,那么就直接复用

SingleInstance模式

对于此启动模式的Activity来说,它永远是在栈顶的,因为此启动模式会判断该栈中有无此Activity,如果有,则直接移除在该Activity上的其它Activity,从而将它位于栈顶,如果没有,则新建一个栈,将此Activity压入此栈,从而位于栈顶,所以对于此启动模式的Activity来说是永远在栈顶的