Activity生命周期和Activity之间传参

本文详细介绍了Android中Activity的生命周期,并解释了不同状态下的Activity如何被系统管理及可能面临的销毁情况。此外,还提供了Activity间数据传递的方法。

Activity的应用程序的生命周期是被统一掌控的,因为当你在进行一应用程序是,可能会有人发短信进来,或者有谁打电话给你,抑或该应用程序又调用了 其他应用程序,这时,系统将会中断当前的程序,优先服务短信、电话或是被调用的程序。还有,系统不允许占用过多的资源,所以当资源不足是也有可能被结束。

 

public class MyActivity extends Activity {
   protected void onCreate(Bundle savedInstanceState);
      protected void onStart();
      protected void onResume();
      protected void onPause();
      protected void onStop();
      protected void onDestroy();

 

1.最容易被清掉的是empty process,空进程是指那些没有Activity与之绑定,也没有任何应用程序组件(如Services或者IntentReceiver)与之绑定的进程,也就是说在这个process中没有任何activity或者service之类的东西,它们仅仅是作为一个cache,在启动新的Activity时可以提高速度。它们是会被优先清掉的。因此建议,我们的后台操作,最好是作成Service的形式,也就是说应该在Activity中启动一个Service去执行这些操作。

 

2.接下来就是background activity了,也就是被stop掉了那些activity所处的process,那些不可见的Activity被清掉的确是安全的,系统维持着一个LRU列表,多个处于background的activity都在这里面,系统可以根据LRU列表判断哪些activity是可以被清掉的,以及其中哪一个应该是最先被清掉。不过,文档中提到在这个已被清掉的Activity又被重新创建的时候,它的onCreate会被调用,参数就是onFreeze时的那个Bundle。不过这里有一点不明白的是,难道这个Activity被killed时,Android会帮它保留着这个Bundle吗?

3.然后就轮到service process了,这是一个与Service绑定的进程,由startService方法启动。虽然它们不为用户所见,但一般是在处理一些长时间的操作(例如MP3的播放),系统会保护它,除非真的没有内存可用了。

4.接着又轮到那些visible activity了,或者说visible process。前面也谈到这个情况,被Paused的Activity也是有可能会被系统清掉,不过相对来说,它已经是处于一个比较安全的位置了。

5.最安全应该就是那个foreground activity了,不到迫不得已它是不会被清掉的。这种process不仅包括resume之后的activity,也包括那些onReceiveIntent之后的IntentReceiver实例。

 

 

如果要从Target往TestBundle回传数据/信息, 可以在TestBundle里面:
startActivityForResult(intent, 1333); // 1333是request code

然后在Target里面, 回传的时候:
Intent data = new Data();
data.putExtra("msg", "my message");
setResult(RESULT_OK, data);
finish();

在TestBundle里出来传回来的数据/信息:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    String msg = data.getExtras().getString("msg");
// ...
}

 

Intent intent = new Intent();

intent.putExtra("name", editText.getText().toString());

intent.setClass(ActivityLifecycle.this, AlertDialog.class);

通过setClass方法,直接告诉Android,此Intent交由AlertDialog处理,也可以通过setComponent()、setClassName()等方法来做同样的事情。

当一个Intent的所有说明,都被Activity的intent-filter接受时,这个 Activity就是候选人之一。如果有多个 Activity成为候选人,那么在程序运行的时候Android提示你从多个Activity中手动选择一个来作为最终的intent接收执行者。

<think>好的,我现在需要回答用户关于FragmentActivity区别的问题。用户之前已经问过关于Fragment懒加载的内容,现在他们想了解FragmentActivity的区别。让我先回顾一下之前提供的资料引用内容,确保信息准确且符合用户需求。 首先,用户提供的引用中有多个关于ActivityFragment的区别交互的信息。例如,引用[1]提到Fragment必须嵌入到Activity中使用,且生命周期Activity控制。引用[3]也指出Fragment是Activity的子模块,生命周期与宿主Activity绑定。这些信息都是关键点,需要在回答中体现。 接下来,我需要整理两者的主要区别。根据已有知识,ActivityAndroid应用的基本组件,代表一个单独的屏幕,而Fragment更像是Activity中的一个模块,用于更灵活地设计UI,尤其是在大屏幕上。Fragment的生命周期依赖于Activity,并且必须存在于Activity中。此外,Fragment之间的通信通常通过宿主Activity进行,而Activity之间的通信则通过Intent。 用户可能想知道它们在使用场景、生命周期管理、UI设计灵活性等方面的不同。例如,在平板手机的不同布局中,Fragment允许动态调整界面,而Activity通常用于不同的屏幕。同时,Fragment可以复用,而Activity更多作为独立的界面单元。 需要注意的是,用户之前的问题涉及Fragment的懒加载,所以在回答中可以适当提到Fragment在优化性能方面的作用,比如按需加载资源,减少单个Activity的负担。但主要焦点还是区别。 另外,引用[2][5]提到了FragmentActivity之间的通信方式,比如通过接口或findFragmentById,这也是一个区别点:Fragment需要与宿主Activity交互,而Activity之间通过Intent。 现在需要组织这些信息,结构清晰地区分两者的不同点,可能需要分点说明,比如定义、生命周期、使用场景、通信方式等。同时,确保引用正确的来源,如引用[1]、[3]、[4]等。 最后,检查是否有遗漏的重要区别,比如Fragment可以被动态添加、替换,而Activity启动需要显式Intent,或者后台栈管理的差异。确保回答全面且易于理解,符合用户的需求。</think>#### Android中Fragment与Activity的核心区别 --- ### 一、**基础定义与角色定位** | **维度** | Activity | Fragment | |------------------|---------------------------------------|---------------------------------------| | **本质** | 独立的界面控制器,对应一个完整屏幕 | 依附于Activity的界面模块 | | **生命周期** | 完整独立(onCreate→onDestroy) | 受宿主Activity控制(部分依赖)[^3] | | **系统交互** | 直接响应系统事件(如返回键) | 需通过宿主Activity中转处理[^4] | **关键差异**: Activity是**应用入口任务栈管理单元**,而Fragment是**UI模块化与复用单元**。例如,点击应用图标首先启动Activity,而Fragment需要嵌入到Activity布局中才能显示[^1]。 --- ### 二、**生命周期对比** 1. **生命周期范围** - Activity:包含完整生命周期(如`onCreate()`、`onStart()`、`onResume()`) - Fragment:生命周期阶段与Activity绑定但更细分(如`onAttach()`、`onCreateView()`) ```java // Activity生命周期示例 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Activity初始化 setContentView(R.layout.activity_main); // 必须调用 } } ``` ```java // Fragment生命周期示例 public class MyFragment extends Fragment { @Override public void onAttach(Context context) { super.onAttach(context); // 绑定到Activity } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_layout, container, false); // 创建视图 } } ``` 2. **关键差异点** - Fragment需要**依赖Activity的存活**(若Activity被销毁,其内部Fragment也会销毁) - Fragment提供`onCreateView()`专门用于构建UI,而Activity直接通过`setContentView()`[^1][^3] --- ### 三、**使用场景与设计目标** | **场景** | Activity适用场景 | Fragment适用场景 | |-------------------------|---------------------------------------|---------------------------------------| | **界面独立性** | 需要独立处理用户流程(如登录页) | 作为界面组成部分(如Tab页)[^3] | | **跨设备适配** | 不同设备使用不同Activity | 同一Activity内动态替换Fragment | | **复用需求** | 较少复用(通常对应完整功能) | 高复用(如多个界面共用同一个列表模块)| **典型案例**: 在平板设备中,一个Activity可能包含两个Fragment(左侧列表+右侧详情),而手机端则通过两个Activity分别实现,利用Fragment实现**响应式布局**[^4]。 --- ### 四、**通信机制对比** 1. **Activity间通信** 通过`Intent`传递数据: ```java // 启动新Activity传参 Intent intent = new Intent(MainActivity.this, DetailActivity.class); intent.putExtra("key", "value"); startActivity(intent); ``` 2. **Fragment与宿主Activity通信** - **方式1**:通过接口回调(推荐) ```java // 在Fragment中定义接口 public interface OnDataListener { void onDataReceived(String data); } // 宿主Activity实现接口 public class HostActivity extends AppCompatActivity implements OnDataListener { @Override public void onDataReceived(String data) { // 处理数据 } } ``` - **方式2**:直接引用Activity(耦合度高) ```java ((HostActivity) getActivity()).updateUI(data); // 不推荐 ``` 3. **Fragment间通信** 必须通过宿主Activity中转,禁止直接交互[^2][^5]。 --- ### 五、**性能与资源管理** | **维度** | Activity | Fragment | |------------------|---------------------------------------|---------------------------------------| | **内存消耗** | 较高(独立实例) | 较低(共享宿主资源) | | **启动速度** | 较慢(需初始化完整上下文) | 较快(复用已有Activity上下文) | | **懒加载支持** | 不支持 | 可通过生命周期控制实现[^用户历史提问] | --- ### 六、**选择原则** 1. **优先使用Activity** - 需要独立任务栈管理(如支付流程) - 处理系统级交互(如相机权限申请) 2. **优先使用Fragment** - 实现动态UI(如ViewPager+TabLayout) - 需要模块复用或响应式布局 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值