我想测试一下onSaveInstanceState和onRestoreInstanceState我在模拟器应用程序.
我发现了这个,它说我们可以在方向更改期间模拟这个,但是我将一些变量存储在应用程序级别(子类android.app.Application)中,因此方向更改不会消除变量.
所以我的问题是,我如何模拟低内存情况,从而杀死我的活动?
希望我已经清楚了.谢谢
我有两个活动:
活动A - 项目列表
活动B - 项目的详细视图
通常,用户打开应用程序并启动活动A. 用户查看项目列表,单击一个项目,然后启动活动B以显示项目详细信息.
也可以通过单击通知直接启动活动B. 在这种情况下,没有后栈.
如何才能使活动B直接从通知启动时,用户可以单击"后退"按钮并转到活动A?
在Android Application类中,您可以注册/取消注册ActivityLifecycleCallbacks,它允许您在一个地方监视应用程序中的Activity生命周期事件(如果您愿意).
调用unregisterActivityLifecycleCallbacks的适当位置在哪里?我正在onCreate注册,并且认为onTerminate只是从方法的名称开始才是合适的位置,但文档对onTerminate()说:
此方法用于模拟过程环境.永远不会在生产Android设备上调用它,只需杀死它们即可删除进程; 这样做时不会执行任何用户代码(包括此回调).
我没有在Application类中看到任何其他方法,其中进行了'shutdown'类型的回调.你甚至需要取消注册吗?
我有一个扩展AppCompactActivity的Activity,在onCreate方法中我以通常的方式设置了Toolbarusing setSupportActionBar方法:
public class StepMasterActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_step_master);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);`
}
}
Run Code Online (Sandbox Code Playgroud)
但是现在我有一个ViewModel组件,并在作为此活动的子代的片段之间共享数据并管理生命周期,我必须在Activity中获取此组件,因此我将其扩展为LifecycleActivity.
public class StepMasterActivity extends LifecycleActivity {
@Override
public class StepMasterActivity extends LifecycleActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_step_master);
// setToolbar();
SharedViewModel sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel.class);
}
}
Run Code Online (Sandbox Code Playgroud)
但我注意到LifecycleActivity与AppCompatActivity无关,而FragmentActivity也没有.
public class LifecycleActivity extends FragmentActivity implements LifecycleRegistryOwner {
private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);
public LifecycleActivity() {
} …Run Code Online (Sandbox Code Playgroud) android activity-lifecycle android-activity android-architecture-lifecycle android-architecture-components
如何防止在关闭屏幕时重新创建活动?
我所做的
- 启动Bejewels并前往珠宝屏幕.
- 短按电源按钮.屏幕已关闭,但设备未关闭.
- 再次按电源按钮.
我所看到的
与关闭屏幕前相同的屏幕.
对于我的应用程序(简单的一个,只是一个带有单个WebView的Web应用程序),方案如下:
我所做的
- 启动我的应用.onCreate()方法活动将URL加载到WebView中.
- 短按电源按钮.屏幕已关闭,但设备未关闭.
- 再次按电源按钮.
我所看到的
WebView正在重新加载页面.
我的期望
在Bejewels的情况下,我希望看到相同的屏幕,我的应用程序是以前状态的页面:脚本正在运行,表单字段已填充等.
调试显示,我错了(在前一个问题中)并且onDestroy()和onCreate()在屏幕刚刚打开时被逐个调用.由于我仍然听到由脚本播放的音乐,当屏幕关闭时,看起来活动和WebView都存在,直到我再次按下电源按钮.
我尝试了什么.
lifecycle lifetime android-intent activity-lifecycle android-activity
试图决定(对于我的应用程序)在onPause()中保存什么以及在onSaveInstanceState()中保存什么,我梳理了整个SO以获取提示和明确的指导.
如果我理解正确,onSaveInstanceState()最适合保存"运行时更改"或"当前状态"(无论这意味着什么),而onPause()最适合保存"持久状态"(无论这意味着什么).
我仍然难以确定我的申请中的内容构成"持久状态"与"当前状态".例如,虽然用户偏好显然是持久的,但是onPause()当用户更改它们时,Android UI框架总是自动保存它们时是否需要保存它们?
类数据成员是否需要保存在onSaveInstanceState()中?我是否需要为我的应用程序中的每个类执行此操作?
我很迷惑.
你能带来真实世界的例子,说明必须保存的内容onPause()和必须保存的内容onSaveInstanceState()吗?除了设备配置更改,即.
-
在我的问题得到解答后,一些新的见解:
android application-state activity-lifecycle onpause android-activity
从文档中(至少对我来说)不清楚是否保证调用Activity.onStop.有两个地方看似矛盾的信息.
请注意,在内存不足的情况下,可能永远不会调用此方法,在这种情况下,系统没有足够的内存来保持活动进程在调用onPause()方法后运行.
从Honeycomb开始,应用程序在其onStop()返回之前不处于killable状态.这可能会在调用onSaveInstanceState(Bundle)时产生影响(可以在onPause()之后安全地调用它,并允许和应用程序安全地等到onStop()以保存持久状态.
找到两种文件都说实话的方式有点困难.我能想到的唯一场景是:假设您正在使用目标API 21(使用min sdk 10)进行开发,并使用onStop()方法编写Activity.如果您随后在API 10手机上运行此应用程序,则无法保证调用onStop().这种情况意味着上述第1点和第2点的文档都是正确的.否则,其中一个必须是假的.
(是的,我已经查看了与此问题相关的现有问题.)
我finish()从我的Activity的Up按钮监听器调用.但是,虽然onDestroy()确实被称为被调用,但首先onPause()被调用然后,令人惊讶的onCreate()是,这导致了真正的问题.为什么ScanningActivity通过调用finish()ScanningActivity方法启动新的操作?
我正在记录所有生命周期函数的调用,顺序是这样的:
inside onClick() Listener for up button.
Inside onPause()
Inside onCreate() // this is what's hosing everything
Inside onStart()
Inside onResume()
Inside onWindowFocusChanged()
Inside onStop()
Inside onDestroy()
Run Code Online (Sandbox Code Playgroud)
为什么我在调用后会收到这一系列事件finish()?这是在侦听器ScanningActivity中调用finish(),通知的代码onclick(在onCreate()方法中分配):
@Override
public void onCreate(Bundle savedInstanceState)
{
. . .
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
Log.i("ScanningActivity", "inside onClick() -- Listener for up button being executed."); …Run Code Online (Sandbox Code Playgroud) android back-button oncreate activity-lifecycle activity-finish
更具体地说:在onDestroy中取消任务是否安全?另外,使用onDestroy来取消注册接收器和释放资源是否安全?
我的目的是确保在活动被销毁时取消/销毁我的任务,但不是之前.
的onDestroy():
第一个案例很清楚:我在onDestroy上做了所有的清理,没有出现任何问题.第二种情况虽然有点问题.当Activity被销毁并且onStroy被跳过时(所以我不取消我的任务),是否可能发生任务继续执行,然后完成并尝试更新死活动,以便应用程序崩溃?
我们来到真正的问题:
让我们关注onDestroy(),因为解决方案不在onPause()或onStop()中.参数:
屏幕锁定:设备屏幕锁定时可以调用onPause .这通常就像屏幕保护程序一样,用户立即解锁,因为他站在那里看着屏幕.取消任务并停止我的应用在这种情况下所做的一切只会降低用户体验.我不希望我的应用程序因为偶然的"屏幕保护程序"而窒息而行为不端.
在一个示例应用程序中,我有两个活动屏幕.用户可以在它们之间快速切换.在这个应用程序中,用户倾向于经常快速地切换屏幕.
导航:其中一个屏幕有一个地图,可从系统接收位置更新.它记录了位置(路径)变化的精确图形日志,因此需要不断运行,直到活动关闭.通常我会在onResume和onPause中注册和注销任何接收器.但是,这会使应用程序非常不可用,因为每次用户导航时地图上的更新都会停止.因此,我想取消注册onDestroy中的接收器.
加载列表:第二个屏幕有一个列表,显示来自Web服务的数据.下载数据需要4秒钟.我使用AsyncTask,我知道我应该在必要时取消.它不应该在onPause中取消,因为它应该在用户在屏幕之间切换时继续加载.因此,我想在onDestroy中取消它.
可以有更多的例子.其中一些可能并不完全适合每个人(您甚至可能建议使用服务而不是AsyncTask).但这个想法很重要,所有人都有相同的想法:继续做一些特定于Activity的工作,而Activity 暂停,但是当活动被销毁时,ENSURE停止这样做.(无论我使用的是AsyncTask还是Service,都无关紧要.在任何一种情况下,都应该在Activity被销毁时停止工作.)
PS如果答案是在onDestroy中进行清理是不安全的,这意味着Android框架要求我们停止在onPause中执行的所有操作.然后我就没有看到使用onDestroy的任何理由......
android activity-lifecycle ondestroy android-asynctask android-activity
我正在使用Otto Event总线订阅ListFragment中的某些事件.总线实例在Application的子类中存储和创建,换句话说,它应该作为单例工作.看来这不是一个案例......
该片段正在注册到总线onActivityCreated(Bundle)并取消注册onDestroy().这不起作用.我从调用应用程序崩溃的设备获得了几个崩溃报告unregister()(java.lang.IllegalArgumentException:缺少注释方法的事件处理程序......).如果unregister()在调用register()之前调用,或者unregister()调用两次,则抛出此异常.这可能只发生在......
onActivityCreated(Bundle)之前没有打过电话onDestroy().onDestroy() 被叫两次.Application实例调用之间重建onActivityCreated(Bundle)和onDestroy().我的应用类:
public class App extends Application {
private static App sInstance;
private Bus bus;
public static App getInstance() {
return sInstance;
}
@Override
public void onCreate() {
super.onCreate();
sInstance = this;
bus = new Bus(ThreadEnforcer.ANY);
}
public Bus getEventBus() {
return bus;
}
}
Run Code Online (Sandbox Code Playgroud)
Fragment类:
public class MyFragment extends ListFragment {
@Override
public void …Run Code Online (Sandbox Code Playgroud) android activity-lifecycle android-fragments otto fragment-lifecycle
android ×8
android-architecture-components ×1
android-architecture-lifecycle ×1
back-button ×1
lifecycle ×1
lifetime ×1
oncreate ×1
ondestroy ×1
onpause ×1
otto ×1