android输入法架构解析

android输入法架构解析

简介:
前阵子接手维护了一个密码键盘的项目,之前还没有接触过android输入法这块的知识点,所以在熟悉项目的同时将android系统输入法实现框架整理了一遍,记录在此.整个输入法架构可以简单划分为主要三块:

1.android输入法管理服务InputMethodManagerService(IMMS)
2.android输入法管理InputMethodManager(IMM)与当前输入控件(EditText)
3.输入法IME
简要示意图如下:
在这里插入图片描述

几个主要类关系图如下:
在这里插入图片描述

以下将按照如下流程分别进行介绍:
1.输入法管理服务InputMethodManagerService(IMMS)简介
2.输入法管理InputMethodManager(IMM)简介
3.输入法服务InputMethodService简介
4.从edittext点击到输入法界面显示过程
5.输入法字符传递到edittext过程

1.输入法管理服务InputMethodManagerService简介

IMMS主要管理输入法,通过接收IMM的请求拉起或者隐藏输入法,保持输入法与IMM的连接,系统服务的启动在systemserver中,输入法管理是在startOtherServices中:

    if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
        mSystemServiceManager.startService(InputMethodManagerService.Lifecycle.class);

        ......
    }

进入到InputMethodManagerService中主要进行初始化操作,比如当前安装的输入法列表,设置默认输入法,运行时序图如下:
在这里插入图片描述

这里获取默认输入法列表和设置默认输入法的操作都在初始化方法中完成:

    public InputMethodManagerService(Context context) {
        mIPackageManager = AppGlobals.getPackageManager();
        mContext = context;
        mRes = context.getResources();
        mHandler = new Handler(this);
        // 这里后续会用来注册几个数据字段的监听
        mSettingsObserver = new SettingsObserver(mHandler);
        mIWindowManager = IWindowManager.Stub.asInterface(
                ServiceManager.getService(Context.WINDOW_SERVICE));
        mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
        mCaller = new HandlerCaller(context, null, new HandlerCaller.Callback() {
            @Override
            public void executeMessage(Message msg) {
                handleMessage(msg);
            }
        }, true /*asyncHandler*/);
        mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
        mUserManager = mContext.getSystemService(UserManager.class);
        mHardKeyboardListener = new HardKeyboardListener();
        mHasFeature = context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_INPUT_METHODS);
        //获取默认的系统设置
        mSlotIme = mContext.getString(com.android.internal.R.string.status_bar_ime);
        mHardKeyboardBehavior = mContext.getResources().getInteger(
                com.android.internal.R.integer.config_externalHardKeyboardBehavior);
        //初始化通知
        Bundle extras = new Bundle();
        extras.putBoolean(Notification.EXTRA_ALLOW_DURING_SETUP, true);
        mImeSwitcherNotification = new Notification.Builder(mContext)
            .setSmallIcon(com.android.internal.R.drawable.ic_notification_ime_default)
            .setWhen(0)
            .setOngoing(true)
            .addExtras(extras)
            .setCategory(Notification.CATEGORY_SYSTEM)
            .setColor(com.android.internal.R.color.system_notification_accent_color);

        Intent intent = new Intent(Settings.ACTION_SHOW_INPUT_METHOD_PICKER);
        mImeSwitchPendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);

        mShowOngoingImeSwitcherForPhones = false;
        //注册用户添加移除,从备份中恢复系统设置广播
        final IntentFilter broadcastFilter = new IntentFilter();
        broadcastFilter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        broadcastFilter.addAction(Intent.ACTION_USER_ADDED);
        broadcastFilter.addAction(Intent.ACTION_USER_REMOVED);
        broadcastFilter.addAction(Intent.ACTION_SETTING_RESTORED);
        mContext.registerReceiver(new ImmsBroadcastReceiver(), broadcastFilter);

        mNotificationShown = false;
        int userId = 0;
        try {
            userId = ActivityManagerNative.getDefault().getCurrentUser().id;
        } catch (RemoteException e) {
            Slog.w(TAG, "Couldn't get current user ID; guessing it's 0", e);
        }
        //注册app相关操作广播,包括安装卸载清除数据改变停止等
        mMyPackageMonitor.register(mContext, null, UserHandle.ALL, true);

        //初始化mSettings,后续用来存放和获取一些InputMethod设置相关内容
        mSettings = new InputMethodSettings(
   
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 输入法开发是指为Android系统开发一款输入法应用程序的过程。输入法是一种用于输入文字的工具,通过输入法,用户可以在Android设备上输入各种语言的文字。 Android 输入法开发需要掌握一定的编程知识和技巧。首先,开发者需要了解Android系统的架构输入法的工作原理。其次,需要使用Java等编程语言来编写输入法的代码。开发者还需要使用Android Studio等开发工具来调试和测试输入法的功能。 在Android 输入法开发过程中,需要考虑以下几个关键点。首先,输入法需要正确地处理用户输入的字符,并将其显示在屏幕上。其次,输入法需要提供联想和自动完成的功能,以帮助用户更快地输入文字。此外,输入法还需要支持多种输入方式,例如手写输入、语音输入等。 同时,开发者还应该关注输入法的用户体验。输入法应该具有良好的界面设计和交互方式,方便用户使用。此外,输入法还应该具备一定的智能化功能,例如根据用户的输入习惯进行个性化设置,提供更准确的输入建议等。 最后,输入法开发完成后,开发者还需要将其发布到应用商店供用户下载和使用。在发布前,需要对输入法进行充分的测试和迭代,确保其稳定性和功能完善性。 总的来说,Android 输入法开发是一个复杂而有挑战的过程,但随着技术的不断发展和改进,越来越多的开发者参与到输入法开发中,推动了输入法的创新和提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值