控制进程停止后 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 重新启动 的相关文章

  • Android TelecomManager 中的 addIncomingCall 没有执行任何操作

    我正在尝试使用本机 Android 来电 UI 我有一个连接服务 并且我已经成功注册了一个电话帐户 但在我调用方法 addNewIncomingCall 后什么也没有发生 对我所缺少的有什么想法吗 显现
  • 通过代码在创建时突出显示 ListView 项目

    我想在创建 listView 时突出显示 ListView 的第一行 0 我尝试了不同的方法 就像您在注释代码中看到的那样 但没有任何效果 这很奇怪 因为 OnItemClickListener 中的突出显示工作正常 它通过 xml 选择器
  • 嵌套 XML 布局文件

    android 有没有办法从另一个布局文件引用 xml 布局文件 为了更好地解释 我有一个名为layout1 xml 和layout2 xml 的布局文件 我可以从layout1 xml引用layout2 xml吗 用这个
  • 蓝牙 BLE Android 以最大吞吐量写入外设

    我们公司开发了一个具有蓝牙 BLE 的硬件单元 并且我们在 Nexus 7 2013 中有一个服务应用程序 我们希望使用它向该单元发送固件文件 文件最大可达 500kb BT芯片是德州仪器CC2540 我浏览了大量的页面 并扫描了 Stac
  • VOIP通话录音

    我正在开发一个在 android 中录制 VOIP 通话的项目 我没有找到任何解决方案 有很多应用程序支持手机上的 VOIP 录音 我找不到任何教程和帮助 立方体通话记录器 https play google com store apps
  • Play 商店中的应用描述更新

    我想更新应用程序的描述以及 Play 商店上的屏幕截图 但应用程序保持相同 即相同的版本号 我不想发布新应用程序 因为应用程序中没有任何更改 这可能吗 谷歌也会要求更新应用程序吗 您可以更新描述 也可以更改屏幕截图 您的应用程序将保持不变
  • 更改语言 Flutter 的按钮

    我正在 Flutter 中构建一个应用程序 到目前为止 我正在使用 JSON 国际化 其中应用程序的语言基于用户手机中默认的语言 它工作得很好 但我想给用户有机会在不更改手机系统语言设置的情况下更改语言 只需单击按钮 然后应用程序即可更改语
  • 如何清除Android剪贴板?

    我发现的方法都不起作用 这是我尝试过的 1 使用clearPrimaryClip 的方法ClipboardManager class ClipboardManager clipboard ClipboardManager getSystem
  • 什么是 Android 测试协调器?

    谷歌最近发布了Android测试支持库1 0 读完后overview https android developers googleblog com 2017 07 android testing support library 10 is
  • 如何绘制部分位图圆弧?类似于圆形进度轮,但具有显示得越来越多的位图。

    我正在寻找的是一种以顺时针圆形方式显示图像的视图 当进度为 25 时 应显示前 90 度 当进度为 100 时 应绘制完整的 360 度 它与使用 canvas drawArc 非常接近 但此方法仅适用于 Paint 对象 不适用于位图 其
  • Toast 消息消失后​​完成活动吗?

    有谁知道 是否有可能对 Toast 消息执行某些操作 在我的情况下完成活动 将被关闭 您只需创建一个Thread持续时间只要Toast显示 然后您就可以完成您的Activity public void onCreate Bundle sav
  • 在 Android 中加密/解密字符串的简单方法

    我的问题是如何加密String String AndroidId Override public void onCreate Bundle savedInstanceState super onCreate savedInstanceSta
  • Android 操作项上的通知徽章

    我想在操作栏中放置的购物车图像上添加一个通知徽章 并以编程方式操作它 有帮助吗 您可以显示自定义MenuItem on ActionBar通过创建一个custom layout for MenuItem 要设置自定义布局 您必须使用菜单项属
  • TextView.setMaxLines 不起作用?

    在我的应用程序中 我有一个屏幕 其中显示一些文本 然后显示一张照片 文本的长度是可变的 有时根本没有 有时很多 所以我想对其进行设置 以便文本永远不会占用超过几行 但可以滚动 为下面的图像留下足够的空间 我这部分的视图组件是以编程方式创建的
  • Android 中 Activity 之间的 3D 动画

    How to create animation between two Activity look like As Screen shot in android 搜索jazzyviewpager 这是link https github co
  • XML 配置中的 screenName 不起作用

    我刚刚在我的应用程序中添加了对 Google Analytics 分析 的支持 但我无法
  • 调试android数据绑定?

    谁能告诉我如何调试或找到数据绑定生成的代码 从this https www youtube com watch v NBbeQMOcnZ0链接我发现它生成了所需的代码 我猜您正在寻找自动生成的绑定 java 文件 我也在寻找他们 最后我在这
  • Android AppWidgetManager 方法 updateAppWidget 无法设置意图、加载数据。而且它是随机发生的

    我的小部件由 2 个按钮和一个显示数据的列表视图组成 大多数时候 当调用小部件提供程序的 onUpdate 方法时 一切都会正常加载 每个人都很高兴 但是我注意到有时在调用更新方法后 小部件完全无法加载其数据 列表视图为空 所有按钮均无响应
  • Android:透明活动问题

    最近 在我们的一款生产应用程序上 透明活动已停止工作 我的意思是它变成了黑色背景而不是透明背景 当我将活动的背景颜色设置为纯色 即红色 绿色等 时 它的应用不会出现问题 该问题可能是由于迁移到 AndroidX 引起的 但我没有这方面的证据
  • 在数组列表中过滤 Filterable 不取消之前的过滤

    我看过过滤器方法文档 其中显示调用过滤器会取消所有先前未执行的过滤请求 并发布一个稍后将执行的新过滤请求 但我收到的实际回调有些不同 在我的实现中 它不会取消先前的过滤器请求并调用publishResults 最近一次搜索条件后的上一次搜索

随机推荐

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