Lifecycle用来存储有关组件(如 Activity 或 Fragment)的生命周期状态,并允许其他对象观察此状态。
Lifecycle使用很简单,Fragment和AppCompatActivity已经实现了LifecycleOwner接口,因此只需要以下两步:
public class MyObserver implements DefaultLifecycleObserver {
@Override
public void onResume(LifecycleOwner owner) {
connect()
}
@Override
public void onPause(LifecycleOwner owner) {
disconnect()
}
}
myLifecycleOwner.getLifecycle().addObserver(new MyObserver());
LifecycleOwner是一个接口,表示类具有生命周期(Lifecycle)。它有一个方法getLifecycle(),该方法必须由类实现。
public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry lifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleRegistry = new LifecycleRegistry(this);
lifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
public void onStart() {
super.onStart();
lifecycleRegistry.markState(Lifecycle.State.STARTED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return lifecycleRegistry;
}
}
看如下代码,可知:AppCompatActivity继承自FragmentActivity,FragmentActivity继承自ComponentActivity,ComponentActivity实现了LifecycleOwner接口。
// AppCompatActivity继承自FragmentActivity
public class AppCompatActivity extends FragmentActivity implements AppCompatCallback,
TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider {}
// FragmentActivity继承自ComponentActivity
public class FragmentActivity extends ComponentActivity implements
ActivityCompat.OnRequestPermissionsResultCallback,
ActivityCompat.RequestPermissionsRequestCodeValidator {}
// ComponentActivity实现了LifecycleOwner接口
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
ContextAware,
LifecycleOwner,
ViewModelStoreOwner,
HasDefaultViewModelProviderFactory,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner,
ActivityResultRegistryOwner,
ActivityResultCaller {
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
ContextAware,
LifecycleOwner,
ViewModelStoreOwner,
HasDefaultViewModelProviderFactory,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner,
ActivityResultRegistryOwner,
ActivityResultCaller {
protected void onCreate(@Nullable Bundle savedInstanceState) {
mSavedStateRegistryController.performRestore(savedInstanceState);
mContextAwareHelper.dispatchOnContextAvailable(this);
super.onCreate(savedInstanceState);
// 通过ReportFragment处理声明周期
ReportFragment.injectIfNeededIn(this);
if (mContentLayoutId != 0) {
setContentView(mContentLayoutId);
}
}
}
在ComponentActivity的onCreate方法中,通过ReportFragment.injectIfNeededIn(this)添加了一个透明的fragment,actiivty将自己的生命周期委托给ReportFragment处理。
public class ReportFragment extends android.app.Fragment {
public static void injectIfNeededIn(Activity activity) {
if (Build.VERSION.SDK_INT >= 29) {
// On API 29+, we can register for the correct Lifecycle callbacks directly
LifecycleCallbacks.registerIn(activity);
}
// Prior to API 29 and to maintain compatibility with older versions of
// ProcessLifecycleOwner (which may not be updated when lifecycle-runtime is updated and
// need to support activities that don't extend from FragmentActivity from support lib),
// use a framework fragment to get the correct timing of Lifecycle events
android.app.FragmentManager manager = activity.getFragmentManager();
if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
// Hopefully, we are the first to make a transaction.
manager.executePendingTransactions();
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dispatchCreate(mProcessListener);
dispatch(Lifecycle.Event.ON_CREATE);
}
@Override
public void onStart() {
super.onStart();
dispatchStart(mProcessListener);
dispatch(Lifecycle.Event.ON_START);
}
private void dispatch(@NonNull Lifecycle.Event event) {
if (Build.VERSION.SDK_INT < 29) {
// Only dispatch events from ReportFragment on API levels prior
// to API 29. On API 29+, this is handled by the ActivityLifecycleCallbacks
// added in ReportFragment.injectIfNeededIn
dispatch(getActivity(), event);
}
}
static void dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event) {
if (activity instanceof LifecycleRegistryOwner) {
((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
return;
}
if (activity instanceof LifecycleOwner) {
Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
}
}
}
}
在ReportFragment对应的生命周期,通过getLifecycle()拿到mLifecycleRegistry,然后处理生命周期事件。
public class LifecycleRegistry extends Lifecycle {
@Override
public void addObserver(@NonNull LifecycleObserver observer) {
// 如果需要进行主线程判断,则确认是否是主线程
enforceMainThreadIfNeeded("addObserver");
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
// 包装监听者和状态
ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
// 缓存到map中,由此可知,observer可以添加多个,如果已经存在,返回之前缓存的数据
ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
// 如果已经存在的话,直接返回
if (previous != null) {
return;
}
...
// 是否是重入:正在添加的观察者不为0或正在处理event
boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
// 目标状态
State targetState = calculateTargetState(observer);
mAddingObserverCounter++;
// 重新分发该监听者漏掉的事件
while ((statefulObserver.mState.compareTo(targetState) < 0
&& mObserverMap.contains(observer))) {
pushParentState(statefulObserver.mState);
final Event event = Event.upFrom(statefulObserver.mState);
if (event == null) {
throw new IllegalStateException("no event up from " + statefulObserver.mState);
}
statefulObserver.dispatchEvent(lifecycleOwner, event);
popParentState();
// mState / subling may have been changed recalculate
targetState = calculateTargetState(observer);
}
// 同步所有观察者状态
if (!isReentrance) {
// we do sync only on the top level.
sync();
}
mAddingObserverCounter--;
}
}
3.1、targetState计算
public class LifecycleRegistry extends Lifecycle {
private State calculateTargetState(LifecycleObserver observer) {
Map.Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);
State siblingState = previous != null ? previous.getValue().mState : null;
State parentState = !mParentStates.isEmpty() ? mParentStates.get(mParentStates.size() - 1)
: null;
return min(min(mState, siblingState), parentState);
}
}
public class FastSafeIterableMap<K, V> extends SafeIterableMap<K, V> {
public Map.Entry<K, V> ceil(K k) {
if (contains(k)) {
return mHashMap.get(k).mPrevious;
}
return null;
}
}
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion因此,我在Firefox中使用一些JS,同时也在使用jetpacksdk。我在JS编辑器中工作,然后通过命令行运行sdk。但是,当存在错误时,无法调试它,因为JS在页面和DOM之前运行/加载,因此Firebug无济于事。谁能为此推荐一个
Jetpack全套一.Jetpack介绍1.特性:2.分类:二.应用架构三.LifeCycle:1.简介2.简单使用3.实战:Dialog内存泄漏4.Lifecycle的应用(0)activity/fragment上面案例都是(1)Service(2)Application:ProcessLifecycleOwner6.总结四.VideModel1.介绍2.简单使用3.AndroidViewModel使用4.使用viewmodel实现fragment直接数据共享五.LiveData1.介绍2.4个常用方法3.使用场景4.结合viewModel使用5.加强练习:6.结合room使用:后面会用到五
系列文章目录第一章Android:彻底搞懂Lifecycle——使用篇第二章Android:彻底搞懂Lifcycle——原理篇文章目录系列文章目录前言一、Lifecycle是什么?1.应用场景2.示例二、Lifecycle使用1.泳(用)裤(库)第一步是什么?——先引入2.Lifecycle类3.LifecycleOwner接口3.1.自定义类实现LifecycleOwner接口总结前言你真的了解lifecycle吗?本文的目标就是要“打破砂锅问到底”,带你真真切切了解它。一、Lifecycle是什么?lifecycle是属于AndroidJetpack(官方开发工具包)——Architect
把很多变量,逻辑和数据摆在我们的Activity和Fragment中,这样的代码很混乱,难以维护。这样的开发模式违反了单一责任的原则。而ViewModel可以有效地划分责任。具体的可以用于持有和UI元素相关的数据,以保证这些数据在屏幕旋转时不会丢失,以及负责和仓库之间进行通讯。然后Activity仅负责了解如何在屏幕上显示该数据和接受用户互动,但是它不会处理这些互动。如果你的应用需要获取和存储数据,那么建议创建一个Repository的仓库储存区类。存储与加载应用数据的API,要做的工作是自主判断接口请求的数据应该是从数据库中读取还是从网络中获取,并将数据返回给调用方。如果是从网络中获取的话还
我一直在处理一个图像实体,当持久化时,它使用内部方法来保存/移动/删除使用钩子(Hook)注释关联的图像文件,但我觉得有点像实体本身应该只是相关的getter和setter。我应该将方法保留在实体中还是将它们移至监听器类?实体有方法:生成唯一的文件名/路径将图像文件持久保存到磁盘在级联移除时移除图像。但我不确定我是否喜欢这个存在于我的实体中../***@ORM\PostPersist()*@ORM\PostUpdate()*/publicfunctionupload(){if(null===$this->getFile()){return;}//throwsexceptiononerr
问题是将Jpa实体的业务验证逻辑放在哪里更好(或者换句话说:您更喜欢在哪里)。两个想法是:在EntityListener中,在保存或更新之前将验证实体在提供对jpa持久化方法的访问的服务中。两者各有利弊。当使用方法2时,它更容易测试,因为您可以模拟jpa提供程序并测试验证逻辑。另一方面,对于方法1,验证将与@NotNull等验证同时发生。我很想知道你们如何解决项目中的验证问题,哪种方法更好。谢谢。 最佳答案 这是我遵循的一般经验法则:Whenusingbeanvalidation,specifyrulesthatdonotrequi
系列文章目录Android:JetpackCompose如何禁用涟漪(水波纹)效果Android:使用JetpackCompose实现Text控件跑马灯效果Android:使用JetpackCompose实现自动轮播BannerAndroid:使用JetpackCompose画渐变背景文章目录系列文章目录前言一、先看效果二、XML方式实现三、Compose方式实现四、使用示例总结前言想要用Compose实现一个跑马灯效果的文本,在官网和Text源码中找了一圈没有找到api,貌似官方压根就没提供,之前我们在xml中使用TextView实现文字跑马灯效果很简单,Compose现在既然没有,那我们就
我有一个问题!我正在尝试在我的tomcat服务器7安装上安装我的webapp,但它一直说它无法部署我的应用程序,因为“尝试了无效的生命周期转换”。这是我的catalina日志错误:org.apache.catalina.LifecycleException:AninvalidLifecycletransitionwasattempted([before_destroy])forcomponent[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/myapp]]instate[STARTED]atorg.a
五一期间,我们来一起学习总结一下Jetpack的ViewModel组件,从使用、源码、经验来总结分析。AndroidJetpack从使用到源码深耕【ViewModel从实践到原理】(一)AndroidJetpack从使用到源码深耕【ViewModel从实践到原理】(二)AndroidJetpack从使用到源码深耕【ViewModel从实践到原理】(三)AndroidJetpack从使用到源码深耕【ViewModel从实践到原理】(四)老办法,在研究一个框架之前,先提出一些自己可以想到的问题,带着问题,有目标的去阅读源码,收货相信更多、更明确一些。ViewModel是做什么的?ViewModel
简短版本:新的Calypso应用程序(为Wordpress.com提供支持)如何通过Jetpack插件与私有(private)托管的Wordpress博客进行通信?即Jetpack是否在我的Wordpress托管站点上公开API?或者是否还有其他黑魔法在发生。长版本:Calypso是一个新的基于javascript的应用程序,用于管理商业托管网站Wordpress.com上的博客。您不能使用Calypso直接管理使用开源Wordpress应用程序的副本私有(private)托管的博客。但是,有一个适用于Wordpress的插件calledJetpack.据我了解,随着Calypso的发