欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 四大组件之Activity(Activity/Fragment)

程序员文章站 2022-05-14 08:48:51
...

Android 四大组件之Activity(Activity/Fragment)


本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.csdn.net/rozol/article/details/79606158


四大组件(Activity / BroadcastReceiver / Service / ContentProvider)之一
四大组件均运行于主线程

Activity

生命周期

Android 四大组件之Activity(Activity/Fragment)

  • Activity的生命周期种类:

    • onCreate // 创建
    • onStart // 可见, 无焦点
    • onResume // 获得焦点, 此时为前台Activity
    • onPause // 失去焦点, 仍可见
    • onStop // 不可见, 此时为后台Activity
    • onDestroy // 销毁
    • onRestart // 重启
  • Activity的生命周期流程:

    /*
    打开SecondActivity的生命周期:
        MainActivity: onPause - - - - - - - -- - - - - -- - - - -> onStop
        SecondActivity:         onCreate -> onStart -> onResume
    关闭SecondActivity的生命周期:
        MainActivity:           onStart -> onResume
        SecondActivity: onPause - - - - - - - - - - -> onStop -> onDestroy
    
    打开ThirdActivity(部分透明)的生命周期
        MainActivity: onPause
        ThirdActivity:        onCreate -> onStart -> onResume
    关闭ThirdActivity(部分透明)的生命周期
        MainActivity:           onResume
        ThirdActivity: onPause - - - - - -> onStop -> onDestroy
    
    切换到Home桌面
        MainActivity: onPause -> onStop
    Home桌面切换回来
        MainActivity: onRestart -> onStart -> onResume
    
    ThirdActivity(部分透明)切换到Home桌面
        MainActivity:          onStop
        ThirdActivity: onPause - - - -> onStop
    Home桌面切换回ThirdActivity(部分透明)
        MainActivity: onRestart -> onStart
        ThirdActivity:                     onRestart -> onStart -> onResume
    
    Activity被kill优先级:
        onStop(后台进程, 且不可见) > onPause(前台进程, 但无焦点) > running(前台)
        多个同级进程, 按LRU算法选择
     */
    

进程被kill的5个级别

  • 进程被kill的5个级别
      1. 前台进程: 用户能与Activity交互的进程(相当于onResume())
      1. 可视进程: 用户能对Activity可见, 但是不能对其进行操作(没有焦点, 相当于onPause())
      1. 服务进程: 没有界面, 通过startService()开启的服务
      1. 后台进程: 用户不可见 (相当于onStop())
      1. 空进程: 没有维持任务组件运行, 不kill是为了下次开启速度
        */

屏幕横竖切换时的生命周期

/*
屏幕横竖时Activity的生命周期:
    MainActivity: onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume

不触发生命周期的配置:
    <activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|screenSize">

锁死屏幕:
    方式一:
    配置文件配置: <activity android:name=".MainActivity" android:screenOrientation="portrait">
    landscape:横屏
    portrait: 竖屏

    方式二:
    代码设置: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
 */

启动模式

  • 启动模式清单配置

    <activity android:name=".MainActivity" android:launchMode="standard">
    
  • 启动模式种类:

    • standard: 标准(默认); 后进新出
    • singleInstance: 单例模式; 启动时, 会在一个新的任务栈启动, 并且只会启动一次, 当再次启动时, 将该任务栈移至前台
    • singleTask: 单任务模式; 如果该Activity没有启动, 则会启动, 如果启动过, 则返回该Activity, 并清除上方所有Activity
    • singleTop: 栈顶模式; 如果此时栈顶是该Activity则不启动, 不是则启动
    • Android 四大组件之Activity(Activity/Fragment)

在没有任务栈的地方开启Activity

  • 在服务或广播接收者等没有任务栈的地方开启Activity

       Intent intent1 = new Intent(context,MainActivity.class);
    
       // 如果在广播或服务等没有任务栈的地方开启Activity, 需要设置一个任务栈环境
       intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
       context.startActivity(intent1);

Activity间传递数据

  • MainActivity打开DataActivity, 并接收返回回调

    public void onclick2(View view){
        Intent intent = new Intent(this, DataActivity.class);
        startActivityForResult(intent, 10);
    }
    
    /**
     * 如果是startActivityForResult打开的Activity, 在销毁时就会调用
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == 10){
            if (resultCode == 123) {
                String value = data.getStringExtra("key1");
                Log.i(TAG, value);
            }
        }
    }
  • 销毁DataActivity, 并设置返回数据

    Intent intent = new Intent();
    intent.putExtra("key1", "value2");
    
    // 当前Activity销毁时, intent意图会传递给启动当前Activity的那个Activity
    setResult(123, intent);
    finish();

Fragment

Fragment 由 Android3.0 引入的, 初衷是为了适应大屏幕的平板
Fragment 有自己的生命周期, 但同时又受宿主Activity生命周期的影响

使用

  • 添加: (不断的叠加)

    context.getSupportFragmentManager().beginTransaction().add(containerId, target).commit();
    
  • 替换: (销毁旧的, 创建一个新的替换, 影响生命周期)

    context.getSupportFragmentManager().beginTransaction().replace(containerId, target).commit();
    
  • 隐藏: (隐藏旧的, 显示新的, 不影响生命周期)

    FragmentTransaction transaction = context.getSupportFragmentManager().beginTransaction();
    transaction.hide(oldFragment);
    transaction.show(newFragment).commit();
    

生命周期

Fragment依附于Activity而生

  • Fragment生命周期种类:

    • onAttach // 依附于Activity
    • onCreate // 创建
    • onCreateView // 加载一个Fragment布局(View)
    • onActivityCreated // View已初始化
    • onStart // 可见
    • onResume // 获取焦点
    • onPause // 失去焦点
    • onStop // 不可见
    • onDestroyView // 销毁 onCreateView 创建的View
    • onDestroy // 销毁
    • onDetach // 取消依附
  • Fragment生命周期流程:

    生命周期:
    创建/切换Fragment:onAttach -> onCreate() -> onCreateView -> onActivityCreated -> onStart() -> onResume | -> onPause -> onStop -> onDestroyView -> onDestory -> onDetach
    Home键:Fragment: ... | -> onPause -> onStop
    home切换回来Fragment: onStart() -> onResume
    隐藏和显示不影响生命周期
    

Android 四大组件之Activity(Activity/Fragment)

ViewPager + Fragment

FragmentsActivity

public class FragmentsActivity extends AppCompatActivity {
    ViewPager viewPager;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_viewpager);

        Fragment[] fragments = getFragments();

        viewPager = findViewById(R.id.viewpager);
        // 如果运行于Fragment中, 则需使用 getChildFragmentManager()
        FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager(), fragments);
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(0);
    }

    public Fragment[] getFragments() {
        Fragment[] fragments = new Fragment[2];
        fragments[0] = new Fragment1();
        fragments[1] = new Fragment2();
        return fragments;
    }
}

FragmentAdapter

public class FragmentAdapter extends FragmentPagerAdapter {
    private final FragmentManager fragmentManager;
    private final Fragment[] fragments;

    public FragmentAdapter(FragmentManager fm, Fragment[] fragments) {
        super(fm);
        this.fragmentManager = fm;
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int position) {
        return fragments[position];
    }

    @Override
    public int getCount() {
        return fragments == null ? 0 : fragments.length;
    }
}
相关标签: activity