You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Receiver中仅初始化一次android.os.Vibrator实例?

Android Receiver中单次初始化Vibrator实例的解决方案

你遇到的问题核心是BroadcastReceiver每次接收广播时都会创建新实例,所以类里的普通实例变量每次都会被重新初始化。要实现只初始化一次Vibrator,有两种可靠的方案:

方案一:使用静态变量存储实例

把Vibrator声明为类的静态变量,利用类加载机制保证只初始化一次。注意要用Application Context来获取服务,避免持有Receiver的Context导致内存泄漏:

private static Vibrator sVibrator;

public void onLocationChanged(@NonNull Location location) {
    if (sVibrator == null) {
        // 优先用Application Context
        Context appContext = mainContext.getApplicationContext();
        sVibrator = (Vibrator) appContext.getSystemService(Context.VIBRATOR_SERVICE);
    }
    // 后续直接使用sVibrator即可
}

方案二:通过自定义Application存储全局实例

这种方式更推荐,因为Application的生命周期和APP一致,不会出现意外的内存泄漏:

  1. 自定义Application类,在onCreate中初始化Vibrator:
public class MyApplication extends Application {
    private static Vibrator sGlobalVibrator;

    @Override
    public void onCreate() {
        super.onCreate();
        sGlobalVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    }

    public static Vibrator getVibrator() {
        return sGlobalVibrator;
    }
}
  1. 在AndroidManifest.xml中注册这个Application:
<application
    android:name=".MyApplication"
    <!-- 其他配置 -->
    >
    <!-- 组件注册 -->
</application>
  1. 在Receiver中直接获取全局实例:
public void onLocationChanged(@NonNull Location location) {
    Vibrator vibrator = MyApplication.getVibrator();
    // 使用vibrator
}

补充说明

如果你的Receiver是动态注册且长期存活的(比如在Service中注册后一直不销毁),也可以在Receiver的构造方法里初始化一次Vibrator,但静态注册的Receiver每次广播都会新建实例,这种场景下还是静态变量或Application方案更靠谱。

内容的提问来源于stack exchange,提问作者Pavol Švančarek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 23:36:37