考虑到用户必须使用应用程序执行在线交易(例如在线支付)的用例。
这应该在不阻止UI的情况下完成,所以我将使用AsyncTask。问题出在以下情况: - 用户在转移过程中旋转电话或接听来电,从而导致活动被扰乱。
如果我理解正确,asynctask现在有一个对陈旧对象的引用。因此,在事务完成后,无法通知用户结果。是吗?
应该使用服务吗?
答案 0 :(得分:2)
关于Service类的大多数混淆实际上都围绕着它不是:
- 服务不是一个单独的过程。 Service对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它将在与其所属的应用程序相同的过程中运行。
- 服务不是线程。它不是从主线程开始工作的手段(以避免应用程序无响应错误)。
即使用户没有与您的应用程序交互,服务也只是一个可以在后台运行的组件。因此,只有在您需要的时候才应创建服务。
如果您需要在主线程之外执行工作,但只有在用户与您的应用程序交互时,您应该创建一个新线程而不是服务。例如,如果您想播放一些音乐,但只有在您的活动正在运行时,您可以在onCreate()中创建一个线程,在onStart()中开始运行它,然后在onStop()中停止它。还要考虑使用AsyncTask或HandlerThread,而不是传统的Thread类。有关线程的更多信息,请参阅进程和线程文档。
请记住,如果您确实使用了服务,它默认仍会在您的应用程序的主线程中运行,因此如果它执行密集或阻塞操作,您仍应在服务中创建新线程。
如果设备的配置(由Resources.Configuration类定义)发生更改,则显示用户界面的任何内容都需要更新以匹配该配置。由于Activity是与用户交互的主要机制,因此它包含对处理配置更改的特殊支持。
除非您另行指定,否则配置更改(例如屏幕方向,语言,输入设备等的更改)将导致您的当前活动被破坏,通过onPause(),onStop的正常活动生命周期过程( )和onDestroy()视情况而定。如果活动位于前台或对用户可见,则在该实例中调用onDestroy()后,将创建活动的新实例,以及上一个实例从onSaveInstanceState(Bundle)生成的任何savedInstanceState。
在某些特殊情况下,您可能希望根据一种或多种配置更改绕过重新启动活动。这是通过其清单中的android:configChanges属性完成的。对于任何类型的配置更改,您说您在那里处理,您将收到对当前活动的onConfigurationChanged(配置)方法的调用,而不是重新启动。但是,如果配置更改涉及您未处理的任何内容,则仍将重新启动活动,并且不会调用onConfigurationChanged(Configuration)。