活动生命周期
https://www.jianshu.com/p/6604c6e25cc2
调用多个Activity后如何安全退出
https://blog.csdn.net/qq873044564/article/details/81489059
1.记录打开的Activity并逐个关闭
2.发送特定广播实现安全退出
如何应对后台的Activity被系统回收
三个场景会回收
- 内存不足
- 横竖屏切换
- 省电
使用一个bundle来保存信息,安卓提供了方法
onCreate中
if (savedInstanceState!=null) {
editText.setText(savedInstanceState.getString("saved_data"));
Toast.makeText(this, ""+savedInstanceState.getString("saved_data"), Toast.LENGTH_SHORT).show();
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("saved_data","123");
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
editText.setText(savedInstanceState.getString("saved_data"));
Toast.makeText(this, ""+savedInstanceState.get("saved_data"), Toast.LENGTH_SHORT).show();
}
Service
- 调用startService()方法
启动的Service会在后台长期运行, - 调用bindService()方法
提供一个允许组件和Service交互的接口,借助onBind()方法 - 服务的混合开发模式
start()->bind()->unbind()->stop() - 服务的生命周期
从onCreate()开始到onDestroy()结束
1.用startService()方法启动服务时,执行为onCreate()->onStartCommand(),直到自身调用stopSelf()方法或者其他组件调用stopService().
2.用bindService()方法启动服务时,执行的生命周期方法为onCreate()->onBind()->调用unBindService(),服务被解绑调用onUnbind()方法.
具体看:
https://blog.csdn.net/qq873044564/article/details/104591347
广播:
1.类型
- 无序广播
使用sendBroadcast()方法发送广播,不能被拦截,所有接收无序广播的广播接收者在此广播被发送时均能接收到该无序广播,无序广播的广播接收者直接不能相互传递数据. - 有序广播
sendOrderedBroadcast(),可以使用abortBroadcast()拦截广播.通过<intent-filter>设置android:property来设置优先级,优先级高的可以拦截优先级低的,有序广播的广播接收者可以相互传递数据.
2.注册类型
- 静态注册
在Manifest中进行注册,会一直注册在系统中 - 动态注册
在代码中注册,只有在代码运行时,广播接收者才生效,代码运行结束,广播接收者也失效
具体看:
https://blog.csdn.net/qq873044564/article/details/90347661
对EventBus的理解
EventBus是一款针对发布/订阅消息总线,,简化了应用程序内各组件间,组件和后台线程间的通信.代替传统的Intent,Handler,BroadCast在Fragment,Activity,Service以及线程之间传递消息.
1.元素名称:
- Event 事件
- Subscriber 事件订阅者,用于接收特定的Event事件
- Publisher 事件发布者,用于通知Subscriber有事件发生
2.执行流程:
Publisher通过post()方法将消息事件Event发布到事件总线EventBus,遍历所有订阅者.Subscriber是订阅者,收到消息总线发下来的消息.在这个过程中onEvent()方法执行,订阅者参数类型必须和发布的参数一致.
image.png
EventBus实现了一种发布订阅设计模式,又称为观察者模式.
优点:代码简洁优雅,使用方便,开销小,有助于代码解耦.
用法举栗:
public class Message {
String text;
public void setText(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
在MainActivity中
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(Message msg) {
Log.e("TAG", "onEvent: " + msg.text);
Toast.makeText(this, "" + "456", Toast.LENGTH_SHORT).show();
editText.setText("123");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart: ");
if (!EventBus.getDefault().isRegistered(this))
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy: ");
EventBus.getDefault().unregister(this);
}
在另一个活动中
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message message = new Message();
message.text = "123";
EventBus.getDefault().post(message);
}
});
ContentProvider的理解
内容提供者,是Android四大组件之一,用于不同的应用程序之间实现数据共享.使用表的形式来组织数据
ContentProvider提供的方法有query(),insert(),update(),delete(),当外部应用需要对ContentProvider中的数据进行添加,删除,修改和查询,可以使用ContentResolver类来完成.也可以通过ContentProvider本身完成,但必须有保存数据的场所.
- ContentProvider:
把一个应用程序的私有数据暴露给其它应用程序,让其他应用程序可以访问到这些私有数据,需要对外暴露一个URI路径 - ContentResolver:
根据ContentProvider的URI,对数据进行CRUD操作 - ContentObserver
ContentResolver发送通知,ContentObserver监听通知.