一、Android四大组件
1、 Android四大组件介绍
Activity: 负责用户界面的展示和用户交互,学习Activity就要学习Fragment,虽然它不是四大组件之一,但是它在我们的开发工作中也是频频被使用到,且必须和Activity一块使用,常用于分模块开发,比如慕课首页的几个tab,每个tab都是对应着一个Fragment.
Service服务:不需要和用户交互,负责后台任务,比如播放音乐,socket长连接
BroadcastReceiver广播接收者: 负责页面间通信,系统和APP通信,APP和APP通信,比如监听网络连接状态变化,就是通过BroadcastReceiver广播接收者来实现的
ContentProvider内容提供者: 负责数据存取,常用于APP进数据共享,跨进程数据存取等....比如读取相册,读取联系人,都是ContentProvider来实现的
2 、Activity
新建SecondActivity.kt文件:
package com.dbc.bckotlinall
import android.os.Bundle
import android.view.Gravity
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class SecondActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val textview = TextView(this)
textview.text = "SecondActivity"
textview.gravity = Gravity.CENTER
setContentView(textview)
}
}
//四大组件都需要在AndroidManifest文件中配置否则无法使用, 类似Activity无法启动
在AndroidManifest.xml中配置SecondActivity.kt:
...
在Android中我们可以通过下面两种方式来启动一个新的Activity,注意这里是怎么启动,分为显示启动和隐式启动!
显示启动 --- A->B页面跳转传参:
在MainActivity.kt中跳转:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val textview = TextView(this)
textview.text = "MainActivity"
textview.gravity = Gravity.CENTER
setContentView(textview)
textview.setOnClickListener{
/// 页面跳转到 SecondActivity
val intent = Intent(MainActivity@this, SecondActivity::class.java)
//携带参数跳转启动新Activity
intent.putExtra("extra_data", "extra_data")
intent.putExtra("extra_int_data", 100)
startActivity(intent)
}
}
}
在SecondActivity.kt中, 获得参数:
class SecondActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val stringExtra = intent.getStringExtra("extra_data")
val intExtra = intent.getIntExtra("extra_int_data",0)
val textview = TextView(this)
textview.text = "SecondActivity ${stringExtra}---${intExtra}"
textview.gravity = Gravity.CENTER
setContentView(textview)
}
}
/*跳转生命周期流程:
M:: onCreate --> M:: onStart --> M:: onResume --> M:: onPause --> S:: onCreate --> S:: onStart --> S:: onResume --> M:: onStop
*/
显示启动 --- B页面返回A页面时传参:
///在MainActivity.kt中: -------
class MainActivity : AppCompatActivity() {
private lateinit var textview: TextView // lateinit 延迟初始化
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
textview = TextView(this)
textview.text = "MainActivity"
textview.gravity = Gravity.CENTER
setContentView(textview)
textview.setOnClickListener{
val intent = Intent(MainActivity@this, SecondActivity::class.java)
intent.putExtra("extra_data", "extra_data")
intent.putExtra("extra_int_data", 100)
startActivityForResult(intent, 1000) //设置返回
}
}
/// 获取返回后的参数
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode == 1000&&resultCode==Activity.RESULT_OK&&data!=null){
val stringExtraResult = data.getStringExtra("result_extra_string")
val intExtraResult = data.getIntExtra("result_extra_int", 0)
textview.text = "${stringExtraResult}--${intExtraResult}"
}
}
}
/// 在SecondActivity.kt中: --------
class SecondActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val stringExtra = intent.getStringExtra("extra_data")
val intExtra = intent.getIntExtra("extra_int_data",0)
val textview = TextView(this)
textview.text = "SecondActivity ${stringExtra}---${intExtra}"
textview.gravity = Gravity.CENTER
setContentView(textview)
///返回上一页, 传参
textview.setOnClickListener{
val resultIntent = Intent()
resultIntent.putExtra("result_extra_string","result_extra_string")
resultIntent.putExtra("result_extra_int",100)
setResult(Activity.RESULT_OK, resultIntent)
finish()//把页面关闭, 相当于点击了返回键
}
}
}
3、 Fragment生命周期图解
注意事项: Fragment并不能单独使用, 它需要嵌套在Activity中使用,尽管他拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响,比如Activity 被destory销毁了,他也会跟着销毁!一个Activity可以嵌套多个Fragment。
在Activity中添加Fragment :
Sp1 创建SecondFragment.kt:
class SecondFragment: Fragment() {
lateinit var argments: Bundle
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val textView = TextView(context)
textView.text = "SecondFragment"
textView.gravity = Gravity.CENTER
return textView
}
/// 获取从Activity传递过来的参数:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
// 取出参数
val intArgument = argments?.getInt("key_int")
val stringArgument = argments?.getInt("key_string_value")
//view 就是 onCreateView 返回的控件
val textView = view as TextView
textView.text = "${intArgument} --- ${stringArgument}"
}
}
Sp2 在activity_second.xml中:
Sp3 在SecondActivity.kt中, 执行添加Fragment操作:
class SecondActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
val fragment = SecondFragment()
/// 创建bundle对象、并填充数据赋值给fragment的argments字段:
val bundle = Bundle()
bundle.putInt("key_int",100)
bundle.putString("key_string","key_string_value")
fragment.argments= bundle
/// 将Fragment添加到Activity中:
val ft = supportFragmentManager.beginTransaction()
//把Fragment添加到事务中, 当且仅当该Fragment未被添加过
if(!fragment.isAdded()){
ft.add(R.id.container,fragment)// 参数一: Fragment在SecondActivity绑定的xml中对应的容器id
}
// ft.show(fragment) //显示出fragment的视图
// ft.hide(fragment) //隐藏fragment,使得它的视图不可见
// ft.remove(fragment)//移除fragment
// ft.replace(R.id.container,fragment)//替换fragment,之前添加过的fragment都会被暂时移除,把当前这个fragment添加到事务中
ft.commitAllowingStateLoss()//提交事务, 并执行对Fragment的add、replace、show、hide操作
}
}
AS小技巧
1.对于红色警告⚠️: 可以按住option+commant, 选择解决方案