-->

Android应用程序生命周期和singelton(Android Application life

2019-09-17 12:57发布

以及我们大多数人熟悉的模式:

   public class MySingeltone {

    public String mSomeReferenceTypeData;
    public int mSomeValueTypeData;

    private static MySingeltone mInstance;

    private MySingeltone() {

    }

    public static MySingeltone getInstance() {
        if (mInstance == null) {
            mInstance = new MySingeltone();
        }

        return mInstance;
    }
 }

我的问题是,我最近发现mInstance用做他被破坏,或活动后不等于空当整个应用程序假设是从句,例如:

public class SomeActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        MySingeltone mySingeltone = MySingeltone.getInstance();
        mySingeltone.mSomeReferenceTypeData = "some value";
    }
}

启动关闭运行活动的全应用程序后,“SomeActivity”下一次的时候(比如10秒后..)的mInstance仍持有相同的参考,在他的领域相同的值。

为什么会发生?

我缺少什么?

当Android的垃圾回收静态成员属于应用程序?

Answer 1:

由于“mInstance”是一个静态变量,当你关闭你的应用程序不会得到空。 应用程序的关闭并不意味着应用程序全部摧毁。

还没有关闭您的Android应用程序的概念。 如果你离开你的应用程序中它不会在同一时间销毁。 Android操作系统处理它内部时关闭应用程序时,它不再使用。 在内存不足的情况下,当Android的决定破坏应用程序,然后这个静态变量也将得到空。



Answer 2:

当正好Java对象成为垃圾收集你无法控制。 当有它没有更多的(非圆)引用的对象符合垃圾收集。 有了Android,进一步,你不能当你的活动会从内存中删除控制。



Answer 3:

为什么会发生?

我缺少什么?

当Android的垃圾回收静态成员属于应用程序?

好吧第一,正如其他人所说,有作为Android操作系统的管理自己的应用程序生命周期Android上没有关闭应用程序的概念。

其次,你做了错误的测试 - 如果不是关闭所有的应用程序,你会做相反的 - 那就是 - 通过启动越来越多的应用程序,那么最终你的应用程序的内存将被清理到其他应用程序,这可以用来填补内存包括所有静态mebers以及实例成员! 那么,你会看到,当你预期的静态变量将是无效的。

他们只是“懒洋洋地”清理内存,如果有足够的内存,那么你的应用程序可能永远不会清理。

其实,有没有办法解决它,因为据我所知,有没有办法grauntee不会在从设备内存的任何一点被清理的对象。 在一些情况下它会导致不良行为。 例如,如果单做其创作重处理,调用的getInstance可能让你的UI卡住,甚至让你的应用程序崩溃是由于irresponsibleness。



文章来源: Android Application life cycle and singelton