如何在进程被杀死后检查其状态,或者这是否可能?

3
以下是一个有意制造空指针异常的代码示例:

积分

// 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而崩溃。
崩溃发生的原因是应用程序对象是全新的,因此名称变量为空,在我们调用String#toUpperCase()方法时导致NullPointerException。
命令行,在模拟器或已root手机上运行: 启动应用程序,然后:
adb shell ps 

在设备上和命令行中按home键:

adb shell ps | grep com.crashy.package

和:

adb shell kill  <PID from above step>

现在,我们尝试使用最近使用的应用程序选项卡将应用程序从后台恢复,但由于意图而崩溃。问题是如何列出所有与进程一起被终止的对象的状态 - 或者终止进程是否会终止所有相关对象?有没有办法分叉这个进程?

您可以在WhatIsYourNameActivity中存储用户的姓名,并将其作为Intent Bundle传递到GreetLoudlyActivity中并进行存储。 - Grender
这不是我的问题。我故意引入这个问题,想要分析当一个进程被杀死时会发生什么。强引用的对象会发生什么? - Skynet
虽然这不是一个答案,但为什么你要将名称存储在Application类中,而不是共享首选项中呢? - varunkr
我正在创建一个测试环境,以了解进程如何被终止,哪些变量会丢失以及进程如何重新创建?这是一个纯粹的研发问题,与实际问题无关。 - Skynet
一个进程在被杀死后就不存在了。你的问题本身就包含了自相矛盾的内容。 - user207421
在一个进程被杀死之前,比如在onPause()方法中,尝试一下使用fork怎么样?实际上,我正在寻找一种方法来恢复我的新进程并使用旧进程数据。不确定这是否可能。 - Skynet
2个回答

2
当一个进程被杀死时,所有属于它的内存都被操作系统回收。如果这个过程没有发生,每当一个进程死亡时就会发生内存泄漏,而操作系统最终会耗尽内存。一旦进程/应用程序被终止,你将失去没有保存到永久存储的所有内容。

-1
问题在于您试图使用简单变量模拟持久性存储。为了更好地理解,我建议查看Android Activity的生命周期,以了解应用程序何时以及如何“被杀死”http://developer.android.com/training/basics/activity-lifecycle/index.html
现在,对于解决方案,我建议使用共享首选项管理器(您的数据似乎不足以证明需要使用sqlLite数据库)。
在您的存储活动中,使用以下方法保存名称。
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this)
Preferences.Editor edit = preferences.edit();
edit.putString('name', 'someName');
edit.commit();

并在其他活动中检索它:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this)
preferences.getString('name');

这不是我的问题。当一个进程被杀死时会发生什么?一个进程被分叉了吗?当一个进程被分叉时会发生什么?在分叉过程之后,子进程的地址空间将被新的进程数据覆盖。这是通过对系统进行exec调用来完成的。 - Skynet
因此,fork-and-exec机制可以将旧命令替换为新命令,而执行新程序的环境保持不变,包括输入和输出设备的配置、环境变量和优先级。该机制用于创建所有UNIX进程,因此也适用于Linux操作系统。即使是第一个进程init,其进程ID为1,在所谓的引导过程中也会在引导过程中进行分叉。 - Skynet
那么对象在哪里? - Skynet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接