Articles of android lifecycle

区分按“主页”按钮和打开另一个活动

我有三个活动: – SplashActivity – MainActivity – PlayerActivity 当然应用程序以SplashActivity开头,然后启动MainActivity并关闭。 MainActivity在某个时刻启动PlayerActivity并进入Backstack。 (MainActivity还活着但是在onStop上)然后我需要打开MainActivity并将PlayerActivity设置为后台(PlayerActivity是活着的但是在onStop上)。 然后我需要再次打开PlayerActivity并将MainActivity设置为后台。 因此,当app将一个切换到另一个并返回时,PlayerActivity和MainActivity经常在没有onDestroy的情况下获得onPause()和onStop()。 每当用户按下“home”按钮时,我需要完成所有活动并启动SplashActivity应用程序,但主页按钮与活动之间的切换(onPause()和onStop())相同。 所以我无法发现杀死活动的不同之处。 请帮忙。 编辑:不幸的是, onUserLeaveHint没有帮助,它是一样的。 如果用户按下HOME,则调用: onUserInteraction,onUserLeaveHint,onPause,onStop 此活动返回上一个活动(主要),没有任何用户操作。 公共类PlayerActivity扩展Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_next); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { startActivity(new Intent(PlayerActivity.this, MyActivity.class)); } }, 5000); } } 但仍然有相同的: onUserInteraction,onUserLeaveHint,onPause,onStop

Android可以在循环执行过程中杀死我的应用吗?

当Android决定从堆栈中删除一个应用程序以释放一些RAM ,如果正在销毁的应用程序当前在后台运行某个循环会发生什么? 循环会在执行过程中终止还是VM等待它完成?

是否有可能在onDestroy之后调用回调方法?

在我的应用程序的最新版本中,一些用户遇到了我无法重现的崩溃。 目前只有运行Lollipop Samsung设备才有问题,但这可能只是巧合。 在分析了堆栈跟踪和相关代码之后,我认为我可能已经find了罪魁祸首。 为了测试我的假设,我将代码简化为下面的代码段: public class TestActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Button b = new Button(this); b.setText(“Click me!”); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new Handler().post(new Runnable() { @Override public void run() { // This is the callback method Log.d(“TAG”, “listenerNotified”); } }); } }); […]

片段 – getArguments()返回一个空包

希望有人能帮我理解这个: 我正在使用单活动应用程序和许多在同一容器中替换的Fragments,我正在一个真实设备中测试我的应用程序并启用了“不要保持活动”选项 当添加新片段时(使用FragmentTransaction replace()方法),我使用setArguments()方法将信息传递给新的片段。 它按预期工作,我可以在Fragment中使用getArguments()获取该信息。 到目前为止一切都还好…… 在此之后,我将我的应用程序发送到后台。 我看到堆栈中的所有碎片都被破坏了,再次如预期的那样 我把我的应用程序带到前台,在getArguments()方法中,我得到一个空的Bundle (不是null,只是一个空的Object)而不是我在#2中使用的数据的那个 根据Android文档, setArguments()提供的参数将在片段销毁和创建中保留…所以,我的问题是: “将在片段销毁和创建中保留”是否包括我描述的场景? 如果启用了“不要保持活动”选项会搞乱getArguments() / setArguments()吗? 除了“不要保持活动”选项之外,有没有办法测试正确的片段创建/销毁? 什么是正确保持片段的参数“活着”的更好方法? 我可以将它们保存在onSaveInstanceState()方法中,但是想知道除此之外是否还有更多选项。

何时可以调用onTaskRemoved()?

文档说明了这一点 如果服务当前正在运行且用户已删除来自服务应用程序的任务,则会调用此方法。 似乎只有当应用程序从最近的任务列表中滑出时才会调用它。 按下后退按钮直到任务中的所有Activities都被销毁,这不会导致调用它。 还有其他情况可以调用吗?

Android – 如果绑定活动被杀死,绑定服务会发生什么?

Android提供了Service类,它可用于后台或非UI操作。 我对服务的生命周期有疑问。 我知道绑定服务的生命周期如下: 某些组件通过bindService() – > onCreate()启动服务 onBind() 处理 绑定组件调用unbindService() – > onUnbind() 的onDestroy() 我的问题是: 活动通常在onStop()上调用unbindService()。 但是,可以在不调用onStop()的情况下杀死Activity – 我的意思是,当系统内存不足时,必须调用的唯一方法是onPause()。 onStop()在onPause()之后。 在调用onStop()之前,可以销毁Activity。 在这种情况下,服务没有获取unbindService(),因此服务仍在运行。 这是正确的吗? 当然,这很少发生,因为默认情况下服务是后台。 (服务更有可能被内存不足的系统杀死。)但是,“Foreground”服务的优先级高于“onPause()ed活动”。 根据http://developer.android.com/guide/components/processes-and-threads.html 。 在这种情况下,绑定活动将首先被杀死。 如果发生这种情况,服务不会结束? 如果内存不再低,则将再次创建Activity,但会再次调用bindService(),因为它是一个新实例。 此外,活动甚至可能无法重新启动。 这不对吗? 在这种情况下我该怎么办?

Android:当服务被杀死时,我们如何能够保留服务状态以便以后恢复?

我们创建了一个应用程序,它本质上是一个定时器/秒表,具有一些装饰function。 我们定义了一个服务,该服务勾选时钟并警告订阅某些计时器事件的听众(活动等)。 我们希望能够保存计时器/秒表的状态(经过的秒数,直到下一个事件的时间,用户提供的配置等)每当android杀死我们的服务(用于记忆回忆),然后恢复服务的状态当用户恢复应用程序时。 对我们来说,这意味着可能保留和恢复对象及其状态。 我们的服务有很多组成。 基本上,我们的服务由我们所有的计时器模型组成,其中服务死亡时死亡。 有什么策略可以坚持服务的状态? 对于我们的目的,PreferencesManager可能不够健壮,尽管它可能是。 我们可以依靠Service onDestroy()方法来保存状态(例如在SQLite中)吗? 如果android决定杀死我们的进程,它是否甚至保证将调用onDestroy()服务? 谢谢!

LocalBroadcastManager和Activity生命周期

因此,我正在研究从一些长期运行的网络操作中将回调接口更改为本地广播的可行性。 由于Activity生命周期为需要修改UI的异步请求创建了各种复杂性(在onDestroy()断开Activity与回调的连接,不要在onSaveInstanceState()之后修改FragmentTransaction ,等等),我在想使用本地广播更有意义,我们可以在生命周期事件中注册/取消注册接收器。 但是,当在配置更改期间销毁并重新创建活动时,没有注册广播接收器的这个小窗口时间(例如,在onPause()/onResume()之间)。 因此,例如,如果我们在onCreate()启动异步请求,如果savedInstanceState == null (例如,对于活动的第一次启动), 如果用户更改了它们,则完成时发送的广播是否可能丢失操作完成前的设备方向? (即接收器在onPause()上未注册,然后操作完成,然后接收器在onResume()中重新注册) 如果是这种情况,那么它会增加我们需要添加支持的额外复杂性,并且它可能不值得切换。 我已经研究了其他东西,比如Otto EventBus库,但我不确定它是否有同样的担忧需要担心。

应用程序在没有stackTrace的情况下崩溃

我的应用程序有一个非常奇怪的问题,它包含一个Activity和2个Fragments(android.support.v4.app.Fragment)。 问题是当我旋转平板电脑时:应用程序立即崩溃。 几天前,一切都工作正常,但我不得不更改包名称,这会产生一些错误,但我设法纠正它们。 问题出现在那之后,但我只是找不到错误在哪里。 这是我在应用程序被销毁,重新启动,恢复和创建后立即得到的Logcat: 10-08 17:00:14.930: D/dalvikvm(18155): GC_CONCURRENT freed 394K, 8% free 7792K/8455K, paused 1ms+4ms 10-08 17:00:14.930: D/AndroidRuntime(18155): Shutting down VM 10-08 17:00:14.930: W/dalvikvm(18155): threadid=1: thread exiting with uncaught exception (group=0x40bee1f8) 10-08 17:00:14.938: E/AndroidRuntime(18155): FATAL EXCEPTION: main 10-08 17:00:14.938: E/AndroidRuntime(18155): java.lang.IllegalStateException: No activity 10-08 17:00:14.938: E/AndroidRuntime(18155): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) 10-08 17:00:14.938: E/AndroidRuntime(18155): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1065) 10-08 […]

AppCompat Fragment生命周期发生了变化

更新到新的appcompat库com.android.support:appcompat-v7:25.1.0我在替换事务中的片段时有了新的片段生命周期。 例如,我有两个片段FrFirst和FrSecond其中包含onStart和onStop日志,我先用第二个替换,然后用第一个替换第二个: FrFirst -> FrSecond -> FrFirst 。 getActivity().getSupportFragmentManager() .beginTransaction() .replace(R.id.content, new FrSecond()) .commit(); 在之前的appcompat版本中,我可以读取此日志: FrFirst:导航到第二个 FrFirst:停下来 FrSecond:开始 FrSecond:导航到第一个 FrSecond:停下来 FrFirst:开始 在25.1.0中这个日志: FrFirst:导航到第二个 FrSecond:开始 FrFirst:停下来 FrSecond:导航到第一个 FrFirst:开始 FrSecond:停下来 所以现在onStart展示之前onStart的片段然后onStop of current。 为什么方法顺序发生了变化,这是支持库中的错误吗?