Android和&amp ;;中的Back-Key按键行为问题

时间:2015-06-30 05:47:34

标签: android android-activity

我们有一个应用包含多个Activities和数据模型,控制器&一堆核心课程都捆绑在一起。

ISSUE: 当我们点击Back-Key @主页时,只有HomePage’s activity被杀,但应用的其余部分在Background中保持沉默。 Android中的这种行为看起来很奇怪。当应用程序重新启动时,并非整体重新启动。仅重新启动主页活动,其余模型,控制器等保留在内存中。因为其中许多都是作为Singleton对象实现的。

Mainpage actvitity包含数据调用的核心工作流程,执行REST APIs构建模型并触发控制器。如果整个应用程序在Back-Key媒体上被杀,我们会更好。但由于它只杀死了主页,当App重新启动时,它迫使我们实现会话管理类型的设计。我觉得可以避免。你在这里建议什么?

重新启动活动时,

一个。我们应该检查BG中的旧数据并尝试从那里继续吗? 或者,

B中。在检测背景中出现的数据/控制器时,是否应该强制将应用程序重新设置为0状态并让它重新开始? OR,

℃。我们是否应该在后退按键上强行杀死应用程序?这将使我们免于维持会议的需要。

----------------------------- //更新// ------------- ---------------------------

回复“需求”

感谢您的回复。 是的,这是我的第一个Android项目。我正在从头学习东西。 我的应用程序没有任何Services / Broadcast receivers 它只与Activities一起运行。

我们没有模特作为单身人士。我们确实有一堆核心类,需要单例来维护跨范围的实例。事实上,其中许多现在都改为飞重模式。所以我怀疑我们是否真的在那里做错了。

我的关键问题是,当您按后退键时,它会“杀死”主屏幕activity。我怎么说它“杀死”了activity,因为当我从App抽屉重新启动应用程序时,控件正在"OnCreate()" activity。这将触发数据获取模型更新例程。

如果应用程序在连续启动时没有流经此“OnCreate()”,我们没有任何问题。正因为如此,我们不得不考虑如果数据获取例程发生两次,我们应该忽略第二个或清除旧的.etc。

我想分享的其他信息是,按Home键将App推送到BG。所以我们免于这个问题。当我们点击App抽屉中的应用程序图标时,该应用程序不会重新启动,因此不会通过主屏幕Activity's OnCreate()方法,它会迅速将应用程序带到前台。仅当您按下主页按钮&试图再次回来。

Back-key按下是唯一导致问题的因素。我认为这是Android应用程序的标准行为。因此,从“已停止”状态恢复活动也会使Activity通过OnCreate()

的Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.poc_viewpager"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="19" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
android:name=".ApplicationController"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ViewPagerActivity"
android:label="@string/title_activity_view_pager"
android:screenOrientation="portrait">
</activity>
</application>

</manifest>

2 个答案:

答案 0 :(得分:1)

所以,我认为你不了解android的工作原理。 Android应用程序中有几个核心组件(应用程序,活动,服务等)。当你按下后退键时,android正在停止(不杀死)你的活动(不是应用程序)。这意味着,您的应用程序仍在运行(如果您有应用程序,还有广播接收器)。此外,如果您通过发送意图从主屏幕启动第二个屏幕,则看起来像按主屏幕活动的后退按钮的观点。我的意思是android会调用onPause() - &gt;家庭活动中的onStop()回调。这意味着您无法在此处杀死您的应用。

您不知道您的应用程序何时会被系统杀死。因此,从技术上讲,您的架构存在问题。 所以我不知道为什么你将模型实现为Singleton(我认为这是个坏主意),所以我无法提出解决方案。

尝试重新考虑您的架构。 希望它有所帮助。

我建议你阅读one

---更新 -

所以,有了新的信息。 您可以触发不在您的活动中但在您的应用程序类中的数据获取模型更新例程。应用程序在系统启动应用程序(非精确活动)时创建,在系统停止应用程序时停止。所以你的单身人士将活到你的申请为止。将您的代码从onCreate上的活动移动到Application onCreate方法。在这种情况下,您的数据提取将在应用程序启动时启动。我认为它会解决你的问题。

看看这个example

答案 1 :(得分:1)

这里似乎有些混乱。您需要更多地了解任务,活动和活动堆栈的整个概念(在SO或Android文档中有很多东西)。

按BACK键时,标准行为是完成当前活动。基本上&#34;整理&#34;一项活动杀死了它。它将从任务中的活动堆栈中删除,从而显示可能位于其下的任何活动。 Android最终将在Activity上调用onDestroy(),垃圾收集器将回收该对象。

如果您的任务中只有1个活动,那么从本质上完成该活动&#34;退出&#34;你的申请。该任务没有任何活动,因此将从系统中删除。

再次启动您的应用程序将创建一个新任务,创建一个新的Activity实例并在其上调用onCreate()。这是所有标准行为。

您写道:

  

当我们点击主页上的Back-Key @时,只有HomePage的活动被杀死,但应用程序的其余部分在后台保持静默。

我假设HomePage's Activity你的意思是MainActivity。是的,它被杀死了(完了)。

您的应用程序托管在操作系统进程中。这是由Android在您启动应用时创建的。操作系统进程具有虚拟机,您的代码在虚拟机内运行。 Android在虚拟机内管理和维护其组件(ActivityServiceBroadcastReceiverProvider)。如果需要资源或者知道虚拟机中没有活动组件运行,Android可以随时终止操作系统进程。如果您在虚拟机中浮动的单身人士与活动组件无关,那么您的Android应用程序架构就会不合适。 Android不关心你的单身人士,当虚拟机中没有活跃的Android组件时,它会杀死操作系统进程。

另一件事:如果您运行应用程序然后按HOME键,您的应用程序(任务)将被推送到后台。如果您再次启动应用程序,Android将把任务带回前台。这就是你所看到的。但是,如果你在后台停留你的应用程序太长时间,Android就会杀掉它,因为它没有被使用,而且它正在消耗宝贵的资源。此外,如果你运行另一个需要大量资源的应用程序,Android也会杀死你的应用程序,因为它在后台。这可能在任何时候发生,您无法控制它。因此,您的应用需要能够从所有这些案例中恢复。

如果您的单身人士在那里,您可以MainActivity进行onCreate()检查,轻松解决此问题。如果它们不是,它可以重新创建它们(就好像应用程序刚刚第一次启动)。如果他们在那里,那么它可以跳过这一步。