各种情形下activity生命周期转换

1 home键

按下 onPause - onStop

返回 onRestart - onStart - onResume

2 锁屏

锁屏 onPause - onStop

解锁 onRestart - onStart - onResume

 

home键和锁屏虽然生命周期相同,但是触发流程不一样,home键走的正常的home activity(launcher)切换流程,栈顶activity被切换,而锁屏走的handleSleep流程,这个时候栈顶activity还是该activity

 

3 dialog弹出

普通AlertDialog弹出,不会发生activity声明周期变化,因为dialog和activity属于从属关系,使用的同一个apptoken,因此可交互和可见性都不会发生变化,也就不会因此生命周期变化

 

4 透明样式或者dialog样式的activity启动

onPause(A) - onCreate(B) - onStart(B) - onResume(B)

注意点在于Activity A不会执行onStop,因为如果A的可见性没有变化,也就是没有被完成遮挡的话,这个时候只是不在前台,不能和用户交互,所以只会执行onPause,而不会执行onStop方法。

 

5 进程被杀死

当activity所在进程被杀死的话,activity的onStop、onDestroy不会被执行,新的activity启动的时候,执行的是onCreate - - onStart - onRestoreInstanceState - onResume

 

6 Configuration变化导致activity重启

onPause - onSaveIntanceState - onStop - onDestroy - onCreate - - onStart - onRestoreInstanceState- onResume

 

 

 

在安卓应用开发中,Fragment 和 Activity 之间的数据交换是一个非常常见的需求。合理的设计可以使得组件间的通信更加高效、清晰,并减少耦合度。以下是几种常用的数据交互方式: ### 方式一:通过回调接口 这是官方推荐的做法之一,特别适合于 Fragment 需要向其宿主 Activity 发送消息或事件通知的情形下。 1. **定义一个公共接口** :先在一个独立的 Java 文件中声明一个包含所需方法的接口。 ```java public interface OnDataPass { void onDataPass(String data); } ``` 2. **让Activity 实现该接口** : 将这个接口作为契约来保证活动能接收到来自碎片的消息。 ```java public class MainActivity extends AppCompatActivity implements MyFragment.OnDataPass{ // ... @Override public void onDataPass(String data){ Toast.makeText(this, "Received from fragment:" + data ,Toast.LENGTH_SHORT).show(); } } ``` 3. **Fragment 中设置回调引用** : - 在 `onAttach()` 生命周期方法里初始化对宿主 Activity 的强类型转换; - 当需要发送数据时调用对应的接口方法。 ```java private OnDataPass listener; @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnDataPass ) { listener = (OnDataPass ) context; } else { throw new RuntimeException(context.toString() +" must implement OnDataPass"); } } private void passDataToActivity(){ String message = "Hello"; listener.onDataPass(message); } ``` ### 方式二:使用 Bundle 参数传递简单值 当您只需要从 Activity 到 Fragment 或者相反方向传送少量的基本类型数据(如字符串、整数等),可以直接利用构造函数中的参数或者通过 setArguments()/getArguments() 来完成传输工作。 1. **由 Activity 创建并配置新的 Fragment** ```java MyFragment myFrag = new MyFragment(); Bundle args = new Bundle(); args.putString("KEY_MESSAGE", "Hi There!"); myFrag.setArguments(args); getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, myFrag) .commit(); ``` 2. **在 Fragment 内部读取传入的数据** ```java @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { String receivedMessage = getArguments().getString("KEY_MESSAGE"); return inflater.inflate(R.layout.my_fragment_layout,container,false); } ``` ### 方式三:ViewModel共享状态管理 随着 Android Jetpack 构件库的发展,“双向绑定”思想逐渐流行起来。“LiveData+ ViewModel”的组合模式就是其中一种很好的实践方案,它允许我们在不需要关心生命周期情况下保持跨多个视图组件之间的一致性和同步更新。 1. **创建 SharedViewModel 类继承自 ViewModel**,并在里面封装业务逻辑以及 Observable 属性. ```kotlin import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class SharedViewModel: ViewModel() { private val _selected = MutableLiveData<String>() val selected: LiveData<String> get()=_selected fun select(item:String){ _selected.value=item } } ``` 2. **Activity 和 Fragments 绑定相同的 ViewModel 对象实例** 这样做的好处是可以轻松实现两方甚至多方的同时监听变化情况,达到松散关联的目的。 ```kotlin override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel= activity?.let { ViewModelProvider(it)[SharedViewModel::class.java] }!! // Observe the data and update UI accordingly viewModel.selected.observe(this, Observer { item -> textView.text = "Selected Item: $item" }) } ``` 以上三种策略各有优劣,在选择具体的解决方案之前应该充分考虑项目的实际情况和个人偏好等因素综合评定最为合适的一种做法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值