Android — Activity详解
前言
Activity作为四大组件之一,简单来说就是用来处理与用户交互的。本节我们简单讲解一下Activity的生命周期、任务栈以及数据传递,刚刚接触安卓,大佬轻拍。
Activity生命周期
onCreat() —> onStart() —> onResume() —> onPause() —> onStop() —> onDestroy() 完整的生命周期。
onResume()会使当前Activity获得焦点,当调用onPause()时,当前还是可见的,但失去焦点了,在调用onStop()后,该Activity已经变得不可见了。这时候可以调用onRestart()重新回到前台。
Activity任务栈
一个APP都是由多个Activity构成的,而在Android中给我提供了一个Task (任务)的概念,而在Android中实现了Task的数据结构就是Bask Stack (回退堆栈),也就是后进先出。官方文档给出的流程图:
总结:
Task是Activity的集合,是一个概念,实际上是使用Back Stack来存储Activity,可以有多个Task,但是同一时刻只有一个栈在最前面,其他的都在后台。那么栈是如何产生的呢?
答:当我们新打开一个APP,此时会创建一个新的Task。举个例子:我们通过点击通信录APP的图标打开APP,这个时候会新建一个栈1,然后开始把新产生的Activity添加进来,可能我们在通讯录的APP中打开了短信APP的页面,但是此时不会新建一个栈,而是继续添加到栈1中,这是 Android推崇一种用户体验方式,即不同应用程序之间的切换能使用户感觉就像是同一个应用程序, 很连贯的用户体验,官方称其为seamless (无缝衔接)! ——————这个时候假如我们点击Home键,回到主屏幕,此时栈1进入后台,我们可能有下述两种操作:
1)点击菜单键(正方形那个按钮),点击打开刚刚的程序,然后栈1又回到前台了! 又或者我们点击主屏幕上通信录的图标,打开APP,此时也不会创建新的栈,栈1回到前台!
2)如果此时我们点击另一个图标打开一个新的APP,那么此时则会创建一个新的栈2,栈2就会到前台, 而栈1继续呆在后台;
3) 后面也是这样…以此类推!
Activity数据传递
- 简单的数据传递(单个数据和多个数据的传递)
保存数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| String text = mEditText1.getText().toString().trim(); String sex=""; // //单个数据传递 // if (mRadioButton1.isChecked()) { // sex = mRadioButton1.getText().toString(); // } // Intent intent = new Intent(FirstActivity.this, SecondActivity.class); // Log.i("2333", text); // intent.putExtra("key", text); // intent.putExtra("sex", sex); // startActivity(intent); //多个数据传递 for (int i = 0; i < mRadioGroup1.getChildCount(); i++) { RadioButton rb = (RadioButton) mRadioGroup1.getChildAt(i); if (rb.isChecked()) { sex = rb.getText().toString(); break; } } Bundle bundle = new Bundle(); bundle.putString("username", text); bundle.putInt("age", 18); bundle.putString("sex", sex); Intent intent = new Intent(FirstActivity.this,SecondActivity.class); intent.putExtras(bundle); startActivity(intent);
|
获取数据:
1 2 3 4 5 6 7 8 9 10 11 12 13
| mTextView1 = findViewById(R.id.textView2); //获取单个数据 // Intent intent = getIntent(); // String username = intent.getStringExtra("key").toString(); // String sex = intent.getStringExtra("sex").toString(); // mTextView1.setText(username+sex); //获取数据集 Intent intent = getIntent(); Bundle bundle = intent.getExtras(); String username = bundle.getString("username").toString(); String sex = bundle.getString("sex").toString(); int age = bundle.getInt("age"); mTextView1.setText(username+sex+age);
|
- 多个Activity之间的数据传递(后一个Activity回传给前一个Activity)
在第一个Activity中启动第二个Activity的时候不用startActivity()方法了,改用startActivityForResult()方法。然后在第一个Activity中重写回调方法onActivityResult。然后在第二个Activity中存数据传入到第一个Activity。
第一个Activity :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| mButton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { requestCode = 1; Intent intent = new Intent(MainActivity.this, TestActivity.class); startActivityForResult(intent,requestCode); } }); } //回调方法 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == 1) { Bundle bd = data.getExtras(); String text1 = bd.getString("text1"); mTextView1.setText(text1); Log.i("2333", text1); } }
|
第二个Activity :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.testactivity); mButton3 = findViewById(R.id.button3); requestCode = 1; Intent intent = getIntent(); Bundle bundle = new Bundle(); bundle.putString("text1","辣鸡1"); bundle.putString("text2", "辣鸡2"); intent.putExtras(bundle); this.setResult(requestCode, intent); mButton3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { TestActivity.this.finish(); } }); }
|