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


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


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

Activity

生命周期

  • 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 -> onStopHome桌面切换回来    MainActivity: onRestart -> onStart -> onResumeThirdActivity(部分透明)切换到Home桌面    MainActivity:          onStop    ThirdActivity: onPause - - - -> onStopHome桌面切换回ThirdActivity(部分透明)    MainActivity: onRestart -> onStart    ThirdActivity:                     onRestart -> onStart -> onResumeActivity被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不触发生命周期的配置:    锁死屏幕:    方式一:    配置文件配置:     landscape:横屏    portrait: 竖屏    方式二:    代码设置: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); */

启动模式

  • 启动模式清单配置

  • 启动模式种类:

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

在没有任务栈的地方开启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, 在销毁时就会调用 */@Overrideprotected 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的那个ActivitysetResult(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 -> onDetachHome键:Fragment: ... | -> onPause -> onStophome切换回来Fragment: onStart() -> onResume隐藏和显示不影响生命周期

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;    }}

更多相关文章

  1. No.11 使用firewall配置的防火墙策略的生效模式
  2. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  3. 关于 AndroidManifest
  4. android中各种组件的生命周期问题
  5. 打电话的应用程序源码以及Android基础-----Android生命周期
  6. 【Android】 adb shell 下 setting 指令
  7. Android的系统服务一览 .
  8. android中如何查看内存
  9. Android(安卓)Service之onStartCommand方法研究

随机推荐

  1. Android(安卓)WebView使用基础
  2. MMI Code Messages on Android
  3. android中经常用到的 ExpandableListView
  4. PhoneGap 搭建Android应用环境
  5. Android(安卓)AlertDialog.Builder 取消(
  6. Ubuntu 10.10 64bit下使用Android(安卓)N
  7. Android与服务器通信——http方式通信
  8. Android(安卓)自定义View 慢慢画一个不同
  9. Android(安卓)Studio的APP目录下的build.
  10. 第一章 如何学习Android?