这是我参与「第四届青训营 」笔记创作活动的第1天
Activity组件
Activity是什么
Activity是一个应用程序的组件,他在屏幕上提供了一个区域,允许用户在上面做一些交互性的操作, 比如打电话,照相,发送邮件,或者显示一个地图!Activity可以理解成一个绘制用户界面的窗口, 而这个窗口可以填满整个屏幕,也可能比屏幕小或者浮动在其他窗口的上方!
总结来说,我们可以得到以下两条信息:
1. Activity用于显示用户界面,用户通过Activity交互完成相关操作
1. 一个App允许有多个Activity
Activity的概念
Activity活动,理解为手机屏幕,与用户交互的可视化界面;Activity存储再Activity栈中,后进先出
Activity的生命周期
这是Activity的生命周期图,那么现在来详细的了解一下每一个过程
- 首先是onCreate方法,此方法会在Activity首次被创建的时候被调用,也就是我们生成一个Activity文件的时候,编译器会自动帮我们创建好这个方法
- 接着当我们的程序跑起来,这个页面呈现在我们的手机上的时候,调用的就是onStart方法,也就是说编译运行执行onCreate方法,显示出来执行onStart方法
- onResume方法的作用是让当前Activity位于前台,也就是栈顶(这里解释一下栈顶,我们平时玩手机也都知道,页面是一层覆盖一层的,也就是说这些页面其实就是存在一个栈里面的,我们按回退键就会离开当前页面,回到上一个页面,符合后进先出的规则)所以此方法就是让当前页面回到前台
- onPause方法会在我们拉起一个新Activity的时候执行,也就是说新的Activity进栈了,开始执行onCreate方法,那么当前的Activity就要执行onPause方法,将当前页面中的数据暂停保存下来,当新页面被用户退出后,我们当前的这个Activity就会回调执行onResume方法重新运行
- onStop方法会在我们拉起一个新Activity并且当前Activity不需要再显示的情况下运行,如果我们要让当前Activity再次获取焦点的话,就需要调用onRestart方法重新执行
- 如果我们在跳转到新的页面后,当前页面完成了它的工作,也就是说当前页面没有存在的意义了,留着只会占内存的话,就要执行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
MainActivity2
系统提供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并置放在合适的任务中。
根据以上内容可以分为三种情况:
- 如果要启动的Activity不存在,那么就会创建一个并且压入栈顶
- 如果启动的Activity已经位于栈顶,那么就不会进行新的创建,直接复用
- 如果启动的Activity存在,但是不位于栈顶,那么就会移除在该Activity上的其它Activity,从而将它位于栈顶
SingleTop
此模式是栈顶复用模式,如果此Activity是SingleTop启动模式,那么在创建的时候会先进行判断当前栈顶是否是该Activity,如果不是,那么新建一个正常入栈,如果栈顶是,那么就直接复用
SingleInstance模式
对于此启动模式的Activity来说,它永远是在栈顶的,因为此启动模式会判断该栈中有无此Activity,如果有,则直接移除在该Activity上的其它Activity,从而将它位于栈顶,如果没有,则新建一个栈,将此Activity压入此栈,从而位于栈顶,所以对于此启动模式的Activity来说是永远在栈顶的