Android-Activity以及Fragment生命周期以及使用

Activity以及Fragment生命周期

Activity生命周期

Android官网Activity生命周期:

在这里插入图片描述

  1. onCreate:create表示创建,这是Activity生命周期的第一个方法,也是我们在android开发中接触的最多的生命周期方法。它本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。
  2. onStart:start表示启动,这是Activity生命周期的第二个方法。此时Activity已经可见了,但是还没出现在前台,我们还看不到,无法与Activity交互。其实将Activity的初始化工作放在这也没有什么问题,放在onCreate中是由于官方推荐的以及我们开发的习惯。
  3. onResume:resume表示继续、重新开始,这名字和它的职责也相同。此时Activity经过前两个阶段的初始化已经蓄势待发。Activity在这个阶段已经出现在前台并且可见了。这个阶段可以打开独占设备
  4. onPause:当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。此时Activity在前台并可见。
  5. onStop:stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。
  6. onDestroy:将还没释放的资源释放,以及进行一些回收工作。
  7. 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.

  1. standard:标准模式:如果在mainfest中不设置就默认standard;standard就是新建一个Activity就在栈中新建一个activity实例;
  2. singleTop:栈顶复用模式:与standard相比栈顶复用可以有效减少activity重复创建对资源的消耗,但是这要根据具体情况而定,不能一概而论;
  3. singleTask:栈内单例模式,栈内只有一个activity实例,栈内已存activity实例,在其他activity中start这个activity,Android直接把这个实例上面其他activity实例踢出栈GC掉;
  4. 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数据传递

  1. `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();
  1. 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数据传递
  1. 通过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");
  1. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值