控制进程停止后 Android Activity 重新启动

2024-03-12

我的应用程序正在运行 Android Gingerbread 2.3.7 自定义版本的特殊设备上运行

在某些情况下,系统将终止我的应用程序。我认为设备制造商考虑到了这些紧急情况,应立即关闭所有第三方应用程序,以便设备可以执行其主要任务。

我可以使用模拟器复制我在设备上看到的行为,并在 DDMS 中选择我的任务并单击“停止进程”按钮。这是我看到的行为。

我的应用程序通常会执行四个活动,活动 A 启动活动 B,B 启动活动 C,C 启动活动 D。因此,当活动 D 在顶部运行时,我的堆栈为:

A B C D

如果此时进程终止,则 Activity D 不会收到 onPause() 或 onStop() 调用。它没有机会拯救其状态。

进程终止后,Android 的 ActivityManager 为我的应用程序启动一个新任务并启动 Activity C。我认为这是重新启动崩溃的应用程序的标准 Android 行为。

我的问题是我可以控制这种重启行为吗?如果 Android 要重新启动我的应用程序,我需要恢复活动堆栈,活动 C 单独运行并没有真正的意义(单击后退按钮将退出应用程序,这对于此活动没有意义)。

我可以阻止此重启吗? 我可以让重启按顺序启动我的所有活动吗? 我可以重新启动活动 A 吗?

我确实找到了这个有趣的讨论 https://groups.google.com/forum/#!topic/android-developers/-qONhniHOlM我相信这解释了为什么重新启动活动 C 而不是活动 D。

至于活动何时重新启动——如果运行该活动的进程 前台活动消失,系统将丢弃该活动 活动,如果它没有有效的保存状态(通常 意味着它已暂停并给系统提供了以下结果 暂停之前的 onSaveInstanceState)。一旦决定了 无论是否放弃该活动,它都会恢复 Activity 现在位于堆栈顶部。如果这是你的其中之一 活动——或者因为你有另一个活动 崩溃了,或者崩溃的那个不知何故是固定的停顿 状态——然后它将再次启动您的过程以显示顶部 活动。

还有一些类似的问题,比如防止活动堆栈被恢复? https://stackoverflow.com/questions/5423571/prevent-activity-stack-from-being-restored和这个有趣的thread https://groups.google.com/forum/#!topic/android-developers/snTPpksX9TU


经过大量实验后,我选择了“Android 开发者>”中暗示的方法操作系统杀死活动后重新启动崩溃 https://groups.google.com/forum/#!topic/android-developers/YtQ_S76_hPc”。有一次问答交流是:

问题:

“已经浏览了代码并看到了你在说什么 关于。它调用onSaveInstanceState并将数据保存在Bundle中。 当活动重新启动时,此捆绑包信息是否可用 操作系统杀死进程后?”

Answer:

“应该是这样。您将在 onCreate() 和中获得该 Bundle onRestoreInstanceState()。 onCreate() 可以传递 null Bundle,如果没有要恢复的 Bundle。 onRestoreInstanceState() 是 仅当有捆绑包需要恢复时才调用。”

我将应用程序被终止后恢复所需的所有会话数据移至可序列化的单例中。

在 onSaveInstanceState() 中,我将序列化的会话数据放入 savingInstanceState 包中

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    // save and restore session data to instance state to recover from task termination 
    savedInstanceState.putSerializable(SessionVariables.class.getName(), mSessionVariables);        
}

在 onCreate() 和 onRestoreInstanceState() 中,我测试我的会话单例实例是否有效。如果它没有有效数据,我会从 savingInstanceState 包中恢复会话变量,并将此恢复的对象作为我的会话变量单例。

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    if (mSessionVariables.propertyThatShouldbeGood == null || mSessionVariables.propertyThatShouldbeGood .length() == 0)
    {
        // save and restore session data to instance state to recover from task termination
        Serializable serializedSessionVariables = savedInstanceState.getSerializable(SessionVariables.class.getName());

        if (serializedSessionVariables != null) {
            mSessionVariables = (SessionVariables) serializedSessionVariables;
            SessionVariables.putInstance(mSessionVariables);
        }
    }
}

现在,当我的任务被终止时,Android 会从堆栈中恢复之前的活动。 onCreate() 从保存的实例状态包中恢复所有必要的会话数据。

此时“后退”按钮也可以正常工作,所以我错了,Android 没有保留 Activity 堆栈。我认为它只是根据需要恢复背部活动(当您向后导航时)。如果您不向后导航,则不会创建它们。至少在 HierarchyViewer 中是这样的。

当我的堆栈为 A-B-C-D 并且任务被终止时,活动“C”将恢复,而“D”将丢失。但是,现在“C”处于健康状态,用户可以轻松导航回“D”。现在,我也可以从“C”自动启动“D”活动,我只是还没有时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

控制进程停止后 Android Activity 重新启动 的相关文章

随机推荐

  • 为什么 Visual Studio 2019 不支持 Openmp 的 for-reduction 中的关键字“max”?

    当我像这样使用 openmp 时 pragma omp parallel for reduction max dumax IDE 将在 Openmp 中引发错误 max reduction 无效 pragma omp parallel fo
  • 托管 c++/cli .net 将固定字节数组转换为字符串^

    如何在托管 c cli 中将固定字节数组转换为字符串 例如我有以下字节数组 Byte byte data 5 byte data 0 a byte data 1 b byte data 2 c byte data 3 d byte data
  • 如何在 Kendo Grid 的每一行中添加自定义按钮

    我正在尝试将自定义按钮添加到 Kendo 网格的每一行 但我没有得到所需的输出 所以我的要求是向每一行添加动态按钮 然后单击这些按钮 我需要处理一些我需要的东西要传递给该按钮单击的几个列值 我试过类似的东西 Html Kendo Grid
  • 跟踪 IP 地址和国家/地区名称 (asp.net)?

    昨天我看到一个网站 其中列出了IP地址和国家名称 说最近访问过的成员 带有国家名称 城市名称的IP地址列表 我可以知道如何跟踪该信息 任何参考或任何代码吗 谢谢 请检查这些问题 检测 估计 ASP NET 中 http 请求的国家 地区 h
  • 用于列出用户的 S3 存储桶内的特定文件夹的 IAM 策略

    我在桶下面有下面的钥匙客户演示 demo for customers customer1 demo for customers customer2 现在我有 2 个客户客户1 and 客户2 这就是我要的 仅授予他们访问权限客户演示 buc
  • 给定一个数的质因数分解,生成该数的所有因数

    如果您已经对一个数字进行质因数分解 那么获得该数字的所有因数的集合的最简单方法是什么 我知道我可以从 2 循环到 sqrt n 并找到所有可整除的数字 但这似乎效率很低 因为我们已经有了质因数分解 我想它基本上是组合 选择函数的修改版本 但
  • 熊猫 corr() 与 corrwith()

    Pandas 提供两种不同的相关函数的原因是什么 DataFrame corrwith 其他 轴 0 drop False 两个DataFrame对象的行或列之间的相关性成对计算 vs DataFrame corr method pears
  • Jackson 序列化 可选,YAML 为空值

    目前我正在使用YAML工厂 https fasterxml github io jackson dataformats text javadoc yaml 2 11 配置ObjectMapper序列化和反序列化Pojos lt gt YAM
  • 显示片段中的对话框?

    我有一些片段需要显示常规对话框 在这些对话框中 用户可以选择是 否答案 然后片段应该做出相应的行为 现在Fragment类没有onCreateDialog 方法来重写 所以我想我必须在包含的外部实现对话框Activity 没关系 但是接下来
  • 当 url 包含锚点时,获取页面加载时网页滚动条的垂直位置

    我使用 jQuery 的scrollTop 方法来获取页面加载时滚动条的垂直位置 我需要在执行 url 中的锚点后获取此值 例如 url www domainname com foo 我可以使用以下代码 它可以在 Firefox 和 IE
  • iPhone 解锁时 Xcode“设备锁定”

    当我尝试构建并运行时 Xcode 说我的设备已锁定 我看了看我的 iPhone 它根本没有锁定 我该如何解决 我的手机设置为 信任 Mac 但我在 Xcode 6 1 1 中仍然遇到此错误 这对我有用 拔掉设备插头 退出 xcode 打开X
  • 测试示例集属性应等于训练示例集 Rapidminer SVM 的 OR 超集

    I am new to Rapid Miner and using SVM Linear in it My model is as I made Training Example set which consist of 3552 exam
  • 动态 Java 整数/长溢出检查与性能

    这是一个相当理论化的问题 因此虽然该语言是 Java 特有的 但任何通用的解决方案都足够了 假设我想编写一个简单的阶乘函数 long factorial int n handle special cases like negatives e
  • Xamarin 表单更改导航栏的背景颜色

    我正在使用 Xamarin Forms 并尝试更改 iOS 上导航栏的背景颜色 我有一个继承自 NavigationPage 的自定义导航栏类 具有可绑定属性和构造函数 用于设置导航栏的颜色 根据我的理解 导航栏顶部有一个默认背景 黑色 X
  • 从 fresco 获取 bitmapdrawable

    我正在尝试从 SimpleDraweeView 获取位图 我已经使用 uri 图像设置了 SimpleDraweeView final Uri uri new Uri Builder scheme UriUtil LOCAL RESOURC
  • 如何阻止 Docker 注册表?

    我想阻止对默认 docker io 注册表的访问 为了安全 IP 保护 我们需要阻止对公共 Docker 中心的推 拉访问 曾经有过many尝试将此作为配置选项 但所有 PR 都不断被拒绝 红帽已经实现了 block registry 和
  • java 图形的多线程

    我有一个java应用程序 可以传输原始数据并相应地绘制实时图 这是通过调用我编写的使用 Graphics 对象的类中的方法来处理的 我在重写的paintComponent方法中实现了算法 以根据最新数据生成所有绘图 我的类中有其他方法来更新
  • 同时在 dplyr 中对多列进行 Shapiro.test

    我正在尝试对数据集运行正态性检验 shapiro wilk 并且我希望同时获得所有列的统计数据和 p 值 我已阅读 SO 上的所有其他页面 R 按组进行的夏皮罗测试不会产生 p 值和损坏的数据框警告 https stackoverflow
  • 除了第一个之外,所有意图都收到了错误的附加内容

    我有一个小应用程序 可用于设置未来事件的提醒 该应用程序使用 AlarmManager 来设置提醒用户的时间 当闹钟响起时 BroadcastReceiver 会对此进行注册 然后启动一项服务 通过 Toast 和状态栏中的通知来通知用户
  • 控制进程停止后 Android Activity 重新启动

    我的应用程序正在运行 Android Gingerbread 2 3 7 自定义版本的特殊设备上运行 在某些情况下 系统将终止我的应用程序 我认为设备制造商考虑到了这些紧急情况 应立即关闭所有第三方应用程序 以便设备可以执行其主要任务 我可