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
生命周期
-
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个级别
- 前台进程: 用户能与Activity交互的进程(相当于onResume())
- 可视进程: 用户能对Activity可见, 但是不能对其进行操作(没有焦点, 相当于onPause())
- 服务进程: 没有界面, 通过startService()开启的服务
- 后台进程: 用户不可见 (相当于onStop())
- 空进程: 没有维持任务组件运行, 不kill是为了下次开启速度
*/
- 空进程: 没有维持任务组件运行, 不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则不启动, 不是则启动
在没有任务栈的地方开启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 隐藏和显示不影响生命周期
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;
}
}
下一篇: 基于《代码本色》0到4章内容的编程学习
推荐阅读
-
Android开发教程之Fragment定义、创建与使用方法详解【包含Activity通讯,事务执行等】
-
详解Android activity与fragment之间的通信交互
-
Android开发使用Activity嵌套多个Fragment实现横竖屏切换功能的方法
-
Android四大组件之Activity
-
Viewpager+Fragment 跳转Activity报错android.os.TransactionTooLargeException: data parcel size xxxxx bytes
-
入职小白随笔之Android四大组件——活动详解
-
Android四大组件之BroadcastReceiver
-
Android四大组件之Service
-
Android基础之Fragment与Activity交互详解
-
四大组件_Activity_2.通过显示意图启动Activity