正如在开发指南中所说,活动可以在"应用程序进程被杀死"和"用户导航到活动"之后恢复.首先,我从未见过这样的事情发生过.当它的进程被杀死时,我似乎不能"导航回"一个Activity,在进程消失后,Activity就会从堆栈中消失.
如果发生这样的事情,究竟会发生什么?
我看到了一个奇怪但好的事情:有一个Activity A1从Activity A2另一个应用程序启动.现在A2是前台活动.当内存变低时,至少在模拟器上(我可以很容易地占用RAM),A2将被杀死而不是A1.
我担心的是这样的例子:我的应用程序在堆栈上有两个活动,我们称之为A0和A1.而且A1,再一次,推出Activity A2另一个应用程序.什么A0时候即将启动A1,它提供A1了对数据对象的引用D.现在如果在A2处于前景时处理A0和A1被杀死,D也会丢失.A2完成后,似乎至少A1需要恢复.因此A1将不得不处理恢复D.更重要的是,A1必须找到一种方法来告诉仍然死亡A0的人对恢复的引用D.这是复杂的还是我走错了路?
为了让我在假期忙碌,我决定学习Android开发.
所以我正在关注一个Activity的生命周期的教程.在链接文章中,它说:
在正常的应用程序使用期间,前台活动有时会受到导致活动暂停的其他可视组件的阻碍.例如,当打开半透明活动(例如对话框样式中的活动)时,先前的活动会暂停.只要活动仍然部分可见,但目前不是焦点活动,它仍然暂停.
但是,一旦活动完全被阻挡且不可见,它就会停止(这将在下一课中讨论).
我下载了示例应用程序.示例应用程序有3个活动,每个活动都有按钮,用于启动其他活动Intent.当我点击"开始B"时,我预计Activity A状态应该是"停止",因为现在它Activity B的布局完全受阻.但是,它被设置为"已暂停".
Activity A状态变为Stopped 的唯一时间是我从Activity B布局中单击"Start C" .
为什么会这样?是因为新版Android上出现了一些优化,还是我误解了这篇文章?

我正在开发一个针对 Api 19 的应用程序,它基本上是一个处理草图。
我面临的问题是我的应用程序第一次运行时,在安装后,它运行良好,直到用户将其发送到后台。然后,如果他们再次单击应用程序图标,则调用 onCreate() 但活动不会被销毁或重新启动。一些变量会发生变化,从而产生奇怪的行为。
这仅在第一次使用该应用程序时发生。强制关闭它后,这种行为不会再发生(据我测试)。从 Eclipse 启动应用程序时也不会发生这种情况。
总而言之,这是第一次强制关闭后发生的情况(我认为是正确的):
活动正在运行。
活动通过主页按钮返回
暂停()
我们再次点击应用程序图标
onResume()
这就是 - 仅 - 安装后第一次运行应用程序时发生的情况:
活动正在运行。
活动通过主页按钮返回
暂停()
我们再次点击应用程序图标
onCreate() <-- !! 注意没有 onDestroy()
onResume()
我想知道我使用沉浸式模式是否与此有关,但是将 Api 目标版本更改为 10、删除沉浸式模式或在旧设备上进行测试都无济于事。当然,我在清单上使用了android:configChanges="orientation|keyboardHidden|screenSize"。
有没有人知道可能导致这种情况的原因?这是一个常见问题还是我应该在我的代码中查找错误?也许是处理错误?
提前感谢您提供任何线索。我希望这是询问这个问题的正确方式。这是我的第一篇文章。
更新: 我的解释不是很准确,但显然有一个错误报告。这个问题在这里解释得更好:https : //code.google.com/p/android/issues/detail?id=26658
不幸的是,我无法使建议的解决方案起作用,在 onCreate() 中使用它会导致我的应用程序关闭或崩溃:
if (!isTaskRoot()) {
finish();
return;
}
Run Code Online (Sandbox Code Playgroud) 我需要在我的应用程序内部了解蓝牙是打开还是关闭.或者,如果从操作系统设置下拉菜单打开或关闭蓝牙.我以为我可以在活动中做到这一点onResume().但事实证明,当Android操作系统的设置"下拉菜单"(通过用手指从屏幕的上边缘拉下来访问的菜单)打开时,活动不会暂停.
当蓝牙可用或不可用时,我需要更新我的UI.
我可以注册回拨(例如a BroadcastReceiver)或任何其他回调,让系统告诉我蓝牙可用性何时发生变化?
我想了解 Android 中 Activity 生命周期和片段生命周期之间的交互,所以我决定开始一个新项目并从这个页面复制代码。
然后我想,为了提高我的理解力,在平板电脑上测试它,切换它的方向并看看它会发生什么(尽管它可能不是为此而设计的)会很有用。通过 logcat,我跟踪了在活动和国家/地区片段上触发的主要事件,例如在 Activity Oncreate 中我写道:
Log.d("TAG", "Activity: 1.onCreate");
Run Code Online (Sandbox Code Playgroud)
这是我从纵向视图开始然后旋转时得到的结果:
标签:活动:1.onCreate
标签:活动:2.onStart
标签:## ContryFrag:1.onAttach
标签:## ContryFrag:2.onCreateView
标签:## ContryFrag:3.onStart
标签:活动:3.onResume
标签: ## ContryFrag: 4.onResume
TAG: Activity: -3.onPause
TAG: ## ContryFrag: -4.onPause
TAG: Activity: -2.onStop
TAG: ## ContryFrag: -3.onStop
TAG: Activity: -1。 onDestroy
TAG:## ContryFrag:-2.onDestroyView
TAG:## ContryFrag:-1.onDetach
TAG:Activity:1.onCreate
TAG:## ContryFrag:1.onAttach
TAG:## ContryFrag:1.onAttach
TAG:## ContryFrag:2.onCreateView
标签:活动:2.onStart
标签:## ContryFrag:2.onCreateView
标签:## ContryFrag:3.onStart
标签:## ContryFrag:3.onStart
标签:活动:3.onResume
标签:## ContryFrag:4.onResume
标签:## ContryFrag:4 .onResume
似乎通过纵向视图中的 FragmentManager 添加的片段在旋转后仍然重新创建,尽管它之前被分离了。恢复它的事件链会再次被跟踪,即使它不会被显示。
你能帮我理解这里发生了什么吗?
编辑
当我检查片段是否为 isInLayout()
Log.d("TAG", "## …Run Code Online (Sandbox Code Playgroud) 这是一个显示视频的片段.
这个片段也可以
1)在点击按钮上打开一个新活动
2)通过调用替换另一个片段
fragmentManager.beginTransaction().replace(R.id.container, f).addToBackStack(tag).commit();
Run Code Online (Sandbox Code Playgroud)
对于1)的情况,我想打电话player.stopPlayBack()停止视频播放支持
对于2)的情况,我想打电话player.stopPlayBack()并player.release()终止播放器
问题是,我应该为案例1)和2)调用什么事件?我尝试使用onPause或onStop,但它们似乎都没有被解雇.
怎么解决?
非常感谢您的帮助.
更新:
视频片段代码
public class Video extends Fragment implements MediaPlayer.OnPreparedListener {
@Bind(R.id.player) EMVideoView player;
@Bind(R.id.full_screen) ImageView full_screen;
Context ctx;
MyApp app;
String video_url;
int intent_code = 5545;
int pos;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.video, container, false);
ButterKnife.bind(this, view);
Bundle bundle = this.getArguments();
video_url = bundle.getString("video_url");
String id = bundle.getString("id");
app = (MyApp) getActivity().getApplicationContext();
app.record_view(id); …Run Code Online (Sandbox Code Playgroud) events lifecycle android android-lifecycle android-fragments
我想了解Application对象的生命周期Android,尤其是IntentService.
如果IntentService启动,Application对象是否会随之启动?这个的确切顺序是什么?最后,在这种情况下什么时候会被销毁?
android android-intent android-service android-lifecycle android-intentservice
我有点困惑。我读过使用启动服务的最大好处是它独立于应用程序,因此,即使 android 杀死您的应用程序,您的服务仍然存在。我的问题是:
1) 如果我的服务与应用程序在同一个进程中工作,那么该服务也会存活吗?
2) 我正在使用 BroadcastReceiver 来检测设备连接的变化,所以,如果应用程序被终止但服务没有被终止,我还会收到连接变化吗?
3) 如果我想从服务中获取当前的连接状态,我可以使用 getApplicationContext() 来做到这一点,还是可能返回 null?在第二种情况下,我如何获得网络的当前状态?
4) 与连接性类似,每次应用程序将其状态从前台更改为后台时(在应用程序暂停/恢复时),我都会通过 Otto 的总线发送一个事件。因此,我的服务订阅了这些更改,以便了解当前的应用程序状态。如果我的应用程序被终止,我可以信任那些事件吗?或者他们无法发送?
android android-service android-lifecycle android-service-binding
我有一个Android应用程序,即使在后台,该应用程序也可以连接到当前正在运行同一应用程序的周围设备。
为此,我使用WiF-Direct宣传我当前正在运行所述应用程序的事实。
因此,一旦该应用被终止,我需要停止对此进行宣传。
onDestroy() 无法使用,因为不能保证会被调用。onStop()onPause()由于该应用仍在运行,因此无法使用。我该如何实现?
当前,即使关闭或终止了该应用程序,该服务仍在发布。
我正在运行 aJobIntentService以在后台执行任务。使用的原因JobIntentService是这样用户可以在操作发生时最小化屏幕,即使 Android 操作系统破坏了 ActivityJobIntentService仍将继续运行,如果用户回来,他可以更新结果。
但是我有一个案例,假设用户自己关闭了应用程序,然后我也想停止应用程序JobIntentService。
JobIntentService当用户自己关闭应用程序时,有什么方法可以通知。
任何帮助将不胜感激。
编辑:我尝试使用onTaskRemoved它是没有用的,因为我的测试设备不会调用它(我相信许多其他设备也不会调用它)。此外,当应用程序从最近的列表中删除时,该服务会自动停止,但在再次打开应用程序时再次重新启动,这是我不想要的。