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

时间:2016-05-04 13:58:28

标签: java android linux object process

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

Credits

// 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());
    }
}

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

adb shell ps 

用户启动应用。 在WhatIsYourNameActivity中,您要求输入用户的名称并将其存储在MyApplication中。 在GreetLoudlyActivity中,您从MyApplication对象中获取用户名并显示它。 用户使用主页按钮离开应用程序。 几个小时后,Android默默杀死应用程序以回收一些内存。

到目前为止,非常好!

但是这里出现了崩溃的部分......

用户重新打开该应用。 Android创建一个新的MyApplication实例并恢复GreetLoudlyActivity。 GreetLoudlyActivity获取用户的名称,该名称现在为null,并且使用NullPointerException崩溃。

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

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

adb shell ps | grep com.crashy.package

在设备和命令行上按home:

adb shell kill  <PID from above step>

和:

{{1}}

现在,我们尝试使用最新应用标签从后台恢复应用,并按预期崩溃。问题是如何列出与进程一起被杀死的所有对象的状态 - 或者杀死进程是否会杀死所有关联的对象?有没有办法分叉这个过程?

2 个答案:

答案 0 :(得分:2)

  

“......或者杀死进程会杀死所有关联对象吗?”

这正是发生的事情。当一个进程被终止时,操作系统将回收它所有拥有的内存 - 如果没有发生这种情况,每次进程死机并且操作系统最终会耗尽内存时会出现内存泄漏。

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

答案 1 :(得分:-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');