Android设计模式系列-单例模式(1)

文章介绍了Android系统中的全局变量,特别是如何使用单例模式实现InputMethodManager的线程安全实例,以及它在ContextgetSystemService()方法中的应用。作者强调了单例模式在多线程环境下的并发控制重要性,并指出深入讨论超出了文章范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.结构

android中有很多系统级别的全局变量,如时间,输入法,账户,状态栏等等,android中对这些都直接或者有些间接用到了单例模式。

以输入法为例,把上图修改为实际情况:

非常的简单,但是有一点,从上面我们也看到了synchronized关键字,在多线程的环境下,单例模式为了保证自己实例数量的唯一,必然会做并发控制。

类似这种线程安全的单例,跨进程的单例,参数化的单例等等的情况,确实超出本文的范围,而且都涉及到很多东西,是一个很大的话题,不好展开。

3. 代码:

public final class InputMethodManager {

static final Object mInstanceSync = new Object();//同步

//内部全局唯一实例

static InputMethodManager mInstance;

//对外api

static public InputMethodManager getInstance(Context context) {

return getInstance(context.getMainLooper());

}

/**

  • 内部api,供上面的外部api调用

  • @hide 系统隐藏的api

*/

static public InputMethodManager getInstance(Looper mainLooper) {

synchronized (mInstanceSync) {

if (mInstance != null) {

return mInstance;

}

IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE);

IInputMethodManager service = IInputMethodManager.Stub.asInterface(b);

mInstance = new InputMethodManager(service, mainLooper);

}

return mInstance;

}

}

客户端调用,比如contextimpl中的getSystemService()方法中如下调用:

class ContextImpl extends Context{

@Override

public Object getSystemService(String name) {

if (WINDOW_SERVICE.equals(name)) {

//… … 省略下面n个if,else if

} else if (INPUT_METHOD_SERVICE.equals(name)) {

//获取输入法管理者唯一实例

return InputMethodManager.getInstance(this);

} else if (KEYGUARD_SERVICE.equals(name)) {

//… … 省略下面n个if,else if

} else if (ACCESSIBILITY_SERVICE.equals(name)) {

//又见单例,无处不在

return AccessibilityManager.getInstance(this);

} else if (LOCATION_SERVICE.equals(name)) {

//… … 省略下面n个if,else if

} else if (NFC_SERVICE.equals(name)) {

return getNfcManager();

}

尾声

开发是需要一定的基础的,我是08年开始进入Android这行的,在这期间经历了Android的鼎盛时期,和所谓的Android”凉了“。中间当然也有着,不可说的心酸,看着身边朋友,同事一个个转前端,换行业,其实当时我的心也有过犹豫,但是我还是坚持下来了,这次的疫情就是一个好的机会,大浪淘沙,优胜劣汰。再等等,说不定下一个黄金浪潮就被你等到了。

  • 330页 PDF Android核心笔记

  • 几十套阿里 、字节跳动、腾讯、华为、美团等公司2020年的面试题

  • PDF和思维脑图,包含知识脉络 + 诸多细节

  • Android进阶系统学习视频


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
Android进阶系统学习视频

[外链图片转存中…(img-QZ0ZPMV7-1714642687879)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值