Activity以及Fragment生命周期
Activity生命周期
Android官网Activity生命周期:
- onCreate:create表示创建,这是Activity生命周期的第一个方法,也是我们在android开发中接触的最多的生命周期方法。它本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。
- onStart:start表示启动,这是Activity生命周期的第二个方法。此时Activity已经可见了,但是还没出现在前台,我们还看不到,无法与Activity交互。其实将Activity的初始化工作放在这也没有什么问题,放在onCreate中是由于官方推荐的以及我们开发的习惯。
- onResume:resume表示继续、重新开始,这名字和它的职责也相同。此时Activity经过前两个阶段的初始化已经蓄势待发。Activity在这个阶段已经出现在前台并且可见了。这个阶段可以打开独占设备
- onPause:当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。此时Activity在前台并可见。
- onStop:stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。
- onDestroy:将还没释放的资源释放,以及进行一些回收工作。
- onRestart:Activity在这时可见,当用户按Home键切换到桌面后又切回来或者从后一个Activity切回前一个Activity就会触发这个方法。这里一般不做什么操作
跳转界面后执行的生命周期
当A跳转到B的时候,A先执行onPause,然后是B执行onCreate -> onStart -> onResume,最后才执行A的onStop。
当B按下返回键,B先执行onPause,然后是A执行onRestart -> onStart -> onResume,最后才是B执行onStop -> onDestroy。
Fragment(第五大组件)生命周期
Android官网Fragment生命周期:
onAttach() 在Fragment 和 Activity 建立关联是调用(Activity 传递到此方法内)
onCreateView() 当Fragment 创建视图时调用
onActivityCreated() 在相关联的 Activity 的 onCreate() 方法已返回时调用。
onDestroyView() 当Fragment中的视图被移除时调用
onDetach() 当Fragment 和 Activity 取消关联时调用。
Activity里面添加Fragment生命周期
Activity以及Fragment使用
Activity使用
Activity启动模式
各个模式除了singleInstance,其他的共用一个栈遵循相对应的规则,例如Main1由standard启动,Main2由singleTask启动,121212启动过程为,由singleTask的性质可得此时按返回键的顺序应为21null.
- standard:标准模式:如果在mainfest中不设置就默认standard;standard就是新建一个Activity就在栈中新建一个activity实例;
- singleTop:栈顶复用模式:与standard相比栈顶复用可以有效减少activity重复创建对资源的消耗,但是这要根据具体情况而定,不能一概而论;
- singleTask:栈内单例模式,栈内只有一个activity实例,栈内已存activity实例,在其他activity中start这个activity,Android直接把这个实例上面其他activity实例踢出栈GC掉;
- singleInstance :堆内单例:整个手机操作系统里面只有一个实例存在就是内存单例;
<activity
android:name=".MainActivity"
android:launchMode="singleInstance"
android:exported="true">
Activity显示Intent隐式Intent
显式:精确跳转
Intent inten=new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
隐式:模糊搜索
<activity android:name=".FlingActivity">
<intent-filter>
<action android:name="com.hly.view.fli"//自己设置的
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
Intent intent = new Intent("com.hly.view.fli");
startActivity(intent);
Activity数据的传递
Bundle类型进行数据传递
简单数据传递使用代码范例:
//发送数据
Bundle bundle = new Bundle();
bundle.putString("key","key_value");
intent.putExtra("keys",bundle);
startActivity(intent);
//接收数据
Intent intent = getIntent();
Bundle key = intent.getBundleExtra("keys");
String key1 = key.getString("key");
带返回值Activity数据传递
- `registerForActivityResult()方法来注册一个对Activity结果的监听
//Activity1
ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == 1){
System.out.println("返回成功");
}
}
});
//启动方式
launcher.launch(intent);
//Activity2
setResult(1,intent1);//1是识别码
finish();
- startActivityForResult()方法启动跳转;
startActivityForResult(intent2,1);//该方式启动跳转
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(data!=null){
answer.setText(data.getStringExtra("code"));
System.out.println(data.getStringExtra("code"));
}
}
//Activity2
setResult(3,intent2);
数据暂时保存
onSaveInstanceState()方法:
- 当Activity不正常退出(直接点击Home键),此时Activity不经过onDestroy()方法,此时Activity会调用onSaveInstanceState()方法用来保存Bundle类型临时数据
- 在onCreat()方法中判断自带Bundle类型参数是否为空不为空则获取临时数据
- 在onStop()生命周期后调用该方法
Fragment使用
Fragment添加
- 静态添加: 直接在xml文件中添加一个Fragment
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/fragment_study1"
android:name="com.example.study.StudyFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
- 动态添加
FragmentManager fms;
BlankFragment bf = new BlankFragment();
fms = getSupportFragmentManager();//getChildFragmentManger()在fragment里面创建管理器时使用
fms.beginTransaction().add(R.id.contair, bf).commit();
Fragment数据传递
- 通过Bundle
发送Bundle;
// 步骤1:获取FragmentManager
FragmentManager fragmentManager = getFragmentManager();
// 步骤2:获取FragmentTransaction
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 步骤3:创建需要添加的Fragment
final mFragment fragment = new mFragment();
Bundle bundle = new Bundle(); // 步骤4:创建Bundle对象, 作用:存储数据,并传递到Fragment中
bundle.putString("message", "I love Google");// 步骤5:往bundle中添加数据
// 步骤6:把数据设置到Fragment中
fragment.setArguments(bundle);
// 步骤7:动态添加fragment
// 即将创建的fragment添加到Activity布局文件中定义的占位符中(FrameLayout)
fragmentTransaction.add(R.id.fragment_container,fragment);
fragmentTransaction.commit();
获取Bundle:
bundle = this.getArguments();
// 步骤2:获取某一值
message = bundle.getString("message");
- EventBus适用于fragment,activity之间数据传递
简单使用
//导入依赖
def eventbus_version = '3.2.0'
implementation "org.greenrobot:eventbus:$eventbus_version"
在需要接收数据处注册接收器:
EventBus.getDefault().register(this);//onStart生命周期处
EventBus.getDefault().unregister(this);//onDestry生命周期处注销监听
发送事件:
EventBus.getDefault().post("Test");
在接受页面处添加:
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessageEvent(String message) {
//TODO 接收事件后Do something
tv.setText("onMessageEvent:" + message);
System.out.println(Thread.currentThread().getName());
}
threadMode:决定处理事件的线程
EventBus详解https://juejin.cn/post/6979140087158145054#heading-1