一些故意引入空指针异常的代码如下:
// 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/