在此特殊设置中,此课程何时符合gc条件

时间:2013-09-23 22:34:34

标签: android static garbage-collection lifecycle intentservice

我需要测试此IntentService是否正在运行并创建了static方法isInstanceCreated()。当你看到真或假时,它会返回。

我正在努力学习会发生什么,希望你能跟着我。
现在,如果真的发生在这里:

1-我从关于GC的isInstanceCreated()致电BroadcastReceiver (我的想法是BroadcastReceiver完成且有资格获得GC,IntentService也有资格获得GC)

2-如果我从isInstanceCreated()课程中调用关于GC的Application (当Android杀死应用程序时,我的想法是IntentService是GC)

3-静态类方法的访问器将保存引用内容.. ???

4-我知道静态最终字段是由编译器硬编码的,当访问静态最终字段时,类中的静态内容(如静态块和字段)从不加载。但是当我调用isInstanceCreated()时会发生什么,静态内容从上到下加载,因为它是在代码中编写的。但是当我拨打isInstanceCreated()时,内存消耗情况如何呢?当我使用Newclass.forname实例化类时,会创建实例并为井类分配内存。当我调用isInstanceCreated()时,整个类也占用内存(当然没有人可以访问非静态内容,因为它需要先实例化)。希望你按照我的学习曲线,并给出一些答案。

public class MyIntentService extends IntentService {
    private static boolean stopNow; 
    private Integer someInt = 10;
    private static MyIntentService instance = null;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public MyIntentService() {
        super("MyIntentService");
    }

    public static boolean isInstanceCreated(){
        return instance != null;
    }

    @Override
    protected void onHandleIntent(Intent intent) {

    }
    public boolean someMethod(){

    {
    // much more methods
}

我知道这对我有用,但getRunningAppProcesses bad solution by Dianne Hackborn

1 个答案:

答案 0 :(得分:1)

要确定您的服务是否仍在投放,请查看this question的答案。请注意,这与您链接到的getRunningAppProcesses解决方案不同。

在您班级的当前实施中,isInstanceCreated()不会告诉您该服务是否正在运行;它只会告诉您MyIntentService的实例是否存在。如果服务对象未设置为null(例如,在instance中),静态成员onDestroy()将泄漏服务对象。

  

现在,如果真的发生在这里:

     

1-我从一个关于GC的BroadcastReceiver调用isInstanceCreated()(我的想法是当BroadcastReceiver完成并且符合GC条件时,IntentService也有资格获得GC)

     

2-如果我从Application类调用关于GC的isInstanceCreated()(我的想法是Android杀死应用程序时IntentService是GC)

调用isInstanceCreated()对GC资格无影响,因为它不会创建或销毁任何引用。

  

3-静态类方法的访问器将保存引用内容.. ???

我不知道“静态类方法”是什么意思。对MyIntentService的引用由静态成员instance持有。如果您将instance设置为null,那么当服务完成运行时,MyIntentService将符合GC条件,并且Android会删除自己的引用。

  

4- [...]当我调用isInstanceCreated()时,整个类也占用内存[...]

第一次引用MyIntentService时,类加载器将类加载到内存中并为其静态成员分配内存。由于您的类中只有两个静态成员,因此内存使用率将非常低。