我创建了一个测试应用程序来查看 Android 的服务是否被正确回收。
我创建了一个服务,它做一件事:持有一个对象的弱引用。这个想法是,在 Service 被销毁并调用 GC 之后,WeakReference 应该返回 null。这是我的服务:
package com.example.test.serviceleaktest;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import java.lang.ref.WeakReference;
public class MyService extends Service {
public static WeakReference sWeakReference = new WeakReference(null);
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
sWeakReference = new WeakReference("data");
Log.d("asdf", "MyService started");
return START_NOT_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
Log.d("asdf", "MyService created");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("asdf", "MyService destroyed");
}
}
我使用 Context.startService() 启动服务并使用 Context.stopService() 停止它。LogCat 确认 onDestroy() 被调用。然后我做一个 GC(从 LeakCanary 复制的代码):
Runtime.getRuntime().gc();
Thread.sleep(100);
System.runFinalization();
在这一点上,我假设 sWeakReference.get() 应该返回 null,对吗?但它仍然返回分配的值。为什么?