在 WeakReference 中保存 activity 实例是一个好习惯吗

Is it a good practice to save activity instance in a WeakReference

Here, in this answer Activity 实例保存在 WeakReference<Activity> 变量中。这样它将避免内存泄漏。这样做是个好习惯吗?

public class BackgroundService extends IntentService {
    private static WeakReference<Activity> mActivityRef; 

    public static void updateActivity(Activity activity) {
        mActivityRef = new WeakReference<>(activity);
    }
}

我正在使用 mActivityRef.get() 并将其转换为所需的 activity 对象。使用该对象,访问 activity.

中的方法

目的是从服务访问 Activity 方法,这段代码可以工作,但根据评论,我很困惑是否要使用它

我提到了 document 但不清楚。

Is it a good practice to do so?

没有

The purpose is to access Activity methods from service

那个activity可能不存在。例如,用户可以在服务为 运行 时按 BACK 键并销毁 activity。在已销毁的 activity 上调用方法可能会导致崩溃。

使用事件总线(LocalBroadcastManager、greenrobot 的 EventBus 等)实现组件之间的松耦合通信,例如服务和活动之间的通信。让 activity 在可见时注册事件,并根据需要注册服务 post 事件。

不,在项目中的任何地方存储 Activity 的引用不是一个好习惯,但如果你想这样做,创建一个 interface 实现你的 activity 接口并传递它作为您的 activity 和 IntentService 与您的服务之间的通信方式的接口。

现在您的服务引用了您 activity 的(选定的)方法。通过该界面访问您的数据并在使用后清除参考。