如何在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一致,不会出现意外的内存泄漏:
- 自定义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; } }
- 在
AndroidManifest.xml中注册这个Application:
<application android:name=".MyApplication" <!-- 其他配置 --> > <!-- 组件注册 --> </application>
- 在Receiver中直接获取全局实例:
public void onLocationChanged(@NonNull Location location) { Vibrator vibrator = MyApplication.getVibrator(); // 使用vibrator }
补充说明
如果你的Receiver是动态注册且长期存活的(比如在Service中注册后一直不销毁),也可以在Receiver的构造方法里初始化一次Vibrator,但静态注册的Receiver每次广播都会新建实例,这种场景下还是静态变量或Application方案更靠谱。
内容的提问来源于stack exchange,提问作者Pavol Švančarek
相关产品推荐
相关产品推荐

