java - 如何在它被杀死后检查进程状态,或者这甚至可能吗?

标签 java android linux object process

一些故意引入空指针异常的代码如下:

Credits

// access modifiers omitted for brevity
class MyApplication extends Application {

    String name;

    String getName() {
        return name;
    }

    void setName(String name) {
        this.name = name;
    }
}

//====================================

// access modifiers omitted for brevity
class WhatIsYourNameActivity extends Activity {

    void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.writing);

        // Just assume that in the real app we would really ask it!
        MyApplication app = (MyApplication) getApplication();
        app.setName("Developer Phil");
        startActivity(new Intent(this, GreetLoudlyActivity.class));

    }

}

//=========================================== =========

// access modifiers omitted for brevity
class GreetLoudlyActivity extends Activity {

    TextView textview;

    void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.reading);
        textview = (TextView) findViewById(R.id.message);
    }

    void onResume() {
        super.onResume();

        MyApplication app = (MyApplication) getApplication();
        textview.setText("HELLO " + app.getName().toUpperCase());
    }
}

用户启动应用程序。 在 WhatIsYourNameActivity 中,您询问用户的姓名并将其存储在 MyApplication 中。 在 GreetLoudlyActivity 中,您从 MyApplication 对象中获取用户名并显示它。 用户使用主页按钮离开应用程序。 几个小时后,Android 会默默地终止该应用程序以回收一些内存。

到目前为止,还不错!

但是崩溃的部分来了......

用户重新打开应用。 Android 创建一个新的 MyApplication 实例并恢复 GreetLoudlyActivity。 GreetLoudlyActivity 获取用户名(现在为空)并因 NullPointerException 而崩溃。

发生崩溃是因为 Application 对象是全新的,所以 name 变量为 null,当我们对其调用 String#toUpperCase() 时导致 NullPointerException。

命令行,当您在模拟器或 root 手机上运行时: 启动应用程序,然后:

adb shell ps 

在设备和命令行上按主页:

adb shell ps | grep com.crashy.package

和:

adb shell kill  <PID from above step>

现在,我们尝试使用最近使用的应用程序选项卡从后台恢复应用程序,但它按预期崩溃了。问题是我如何列出与进程一起被杀死的所有对象的状态 - 或者杀死进程会杀死所有关联的对象吗?有没有办法 fork 这个过程?

最佳答案

"...or does killing a process kill all associated objects?"

这正是发生的事情。当一个进程被终止时,它拥有的所有内存都会被操作系统回收——如果没有发生,每次进程终止时都会发生内存泄漏,操作系统最终会耗尽内存。

一旦进程/应用程序终止,您将丢失所有未保存到永久存储的内容。

关于java - 如何在它被杀死后检查进程状态,或者这甚至可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37029996/

相关文章:

java - 由于错误 c00ce56e,无法完成操作

java - 编程 - Java - 将合并算法与操作分离

java - MockMvc 是否有资格进行 WebFlux Controller 测试?

java - 在重写期间使用泛型 Map 参数将具体对象返回到泛型方法

android - 一个本地容器(.apk),可以将 html 文件作为应用程序加载到设备中

android - 如何将联系人从电话簿导入我们的应用程序

java - 如何向按钮的recycleview添加onItemclicklistener方法

linux - 将文件从给定的 'x'(起始)偏移量复制到给定的 'y'(结束)偏移量的工具

ruby-on-rails - 在 sed 之后更改并应用文本 .first

c - 当 CPU 需要大于 0xC0000000 的地址时,如何执行地址转换(virt->phy)?