Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在这个特殊设置中,这个类什么时候有资格使用gc_Android_Static_Garbage Collection_Lifecycle_Intentservice - Fatal编程技术网

Android 在这个特殊设置中,这个类什么时候有资格使用gc

Android 在这个特殊设置中,这个类什么时候有资格使用gc,android,static,garbage-collection,lifecycle,intentservice,Android,Static,Garbage Collection,Lifecycle,Intentservice,我需要测试此IntentService是否正在运行,是否创建了static方法isInstanceCreated()。它会在你看到真或假时返回 我正在努力了解发生了什么,希望你能跟我来。 现在,如果: 1-我从BroadcastReceiver调用有关GC的isInstanceCreated() (我的想法是当BroadcastReceiver完成并符合GC条件时,IntentService也符合GC条件) 2-如果我调用isInstanceCreated()来自Application类 (我的

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

我正在努力了解发生了什么,希望你能跟我来。
现在,如果:

1-我从
BroadcastReceiver
调用有关GC的
isInstanceCreated()
(我的想法是当
BroadcastReceiver
完成并符合GC条件时,
IntentService
也符合GC条件)

2-如果我调用
isInstanceCreated()
来自
Application
类 (我的想法是,
IntentService
Android kill应用程序时是GC)

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

4-我知道静态最终字段是由编译器硬编码的,当访问静态最终字段时,类中的静态内容(如静态块和字段)永远不会加载。但是当我调用
isInstanceCreated()
时,这里会发生什么呢?静态内容是从右上到右下加载的,就像在代码中编写的一样。但是,当我调用
isInstanceCreated()
时,内存消耗会怎样呢。当我用
New
class.forname
实例化类时,将创建实例并为右侧的hole类分配内存。当我调用
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
}

我知道这对我很有效,但要确定您的服务是否仍在运行,请查看以下问题的答案。请注意,这与链接到的
GetRunningAppProcess
解决方案不同

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

现在,如果:

1-我从BroadcastReceiver调用isInstanceCreated()来处理GC(我的想法是当BroadcastReceiver完成并符合GC条件时,IntentService也符合GC条件)

2-如果我从应用程序类调用isInstanceCreated()来处理GC(我的想法是,当Android杀死应用程序时,IntentService就是GC)

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

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

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

4-[…]调用isInstanceCreated()时,整个类是否也占用内存[…]


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

要确定您的服务是否仍在运行,请查看以下问题的答案。请注意,这与链接到的
GetRunningAppProcess
解决方案不同

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

现在,如果:

1-我从BroadcastReceiver调用isInstanceCreated()来处理GC(我的想法是当BroadcastReceiver完成并符合GC条件时,IntentService也符合GC条件)

2-如果我从应用程序类调用isInstanceCreated()来处理GC(我的想法是,当Android杀死应用程序时,IntentService就是GC)

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

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

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

4-[…]调用isInstanceCreated()时,整个类是否也占用内存[…]


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

因此,当我调用
isInstanceCreated()
时,类加载器会将静态成员放在中,直到我的应用程序被杀死为止,它们不会被删除
getRunningServices
是我现在使用的,但是当我调用
isInstanceCreated()
类加载器将静态成员放在中,并且在我的应用程序被杀死之前,它们不会被删除
getRunningServices
是我现在使用的,但我想离开它