ime命令分析

1, 概述

ime主要是和InputMethodManager进行交互,获取以及设置系统中的输入法。

2, ime命令

命令格式:

ime<command>

 

命令列表:

命令

功能

实现方法

list

获取所有输入法

getInputMethodList

enable ID

设置输入法可用

setInputMethodEnabled

disable ID

设置输入法不可用

setInputMethodEnabled

set ID

设置默认输入法

setInputMethod

 

3, 详细流程

所有adb命令的ime方法最后都会通过Ime.java执行,然后通过跨进程调用InputMethodManager的方法完成。

  Ime的main方法如下,

 public static void main(String[] args) {
        new Ime().run(args);
    }

直接调用run方法,

public void run(String[] args) {
        if (args.length < 1) {
            showUsage();
            return;
        }

        mImm = IInputMethodManager.Stub.asInterface(ServiceManager.getService("input_method"));
        if (mImm == null) {
            System.err.println(IMM_NOT_RUNNING_ERR);
            return;
        }

        mArgs = args;
        String op = args[0];
        mNextArg = 1;
        
        if ("list".equals(op)) {
            runList();
            return;
        }
        
        if ("enable".equals(op)) {
            runSetEnabled(true);
            return;
        }
        
        if ("disable".equals(op)) {
            runSetEnabled(false);
            return;
        }
        
        if ("set".equals(op)) {
            runSet();
            return;
        }
        
        if (op != null) {
            System.err.println("Error: unknown command '" + op + "'");
        }
        showUsage();
    }

runList方法如下,

private void runList() {
        String opt;
        boolean all = false;
        boolean brief = false;
        while ((opt=nextOption()) != null) {
            if (opt.equals("-a")) {
                all = true;
            } else if (opt.equals("-s")) {
                brief = true;
            } else {
                System.err.println("Error: Unknown option: " + opt);
                showUsage();
                return;
            }
        }

        
        List<InputMethodInfo> methods;
        if (!all) {
            try {
                methods = mImm.getEnabledInputMethodList();
            } catch (RemoteException e) {
                System.err.println(e.toString());
                System.err.println(IMM_NOT_RUNNING_ERR);
                return;
            }
        } else {
            try {
                methods = mImm.getInputMethodList();
            } catch (RemoteException e) {
                System.err.println(e.toString());
                System.err.println(IMM_NOT_RUNNING_ERR);
                return;
            }
        }
        
        if (methods != null) {
            Printer pr = new PrintStreamPrinter(System.out);
            for (int i=0; i<methods.size(); i++) {
                InputMethodInfo imi = methods.get(i);
                if (brief) {
                    System.out.println(imi.getId());
                } else {
                    System.out.println(imi.getId() + ":");
                    imi.dump(pr, "  ");
                }
            }
        }
    }

runSetEnabled方法如下,

private void runSetEnabled(boolean state) {
        String id = nextArg();
        if (id == null) {
            System.err.println("Error: no input method ID specified");
            showUsage();
            return;
        }
        
        try {
            boolean res = mImm.setInputMethodEnabled(id, state);
            if (state) {
                System.out.println("Input method " + id + ": "
                        + (res ? "already enabled" : "now enabled"));
            } else {
                System.out.println("Input method " + id + ": "
                        + (res ? "now disabled" : "already disabled"));
            }
        } catch (IllegalArgumentException e) {
            System.err.println("Error: " + e.getMessage());
            return;
        } catch (RemoteException e) {
            System.err.println(e.toString());
            System.err.println(IMM_NOT_RUNNING_ERR);
            return;
        }
    }

runSet方法如下,

private void runSet() {
        String id = nextArg();
        if (id == null) {
            System.err.println("Error: no input method ID specified");
            showUsage();
            return;
        }
        
        try {
            mImm.setInputMethod(null, id);
            System.out.println("Input method " + id + " selected");
        } catch (IllegalArgumentException e) {
            System.err.println("Error: " + e.getMessage());
            return;
        } catch (RemoteException e) {
            System.err.println(e.toString());
            System.err.println(IMM_NOT_RUNNING_ERR);
            return;
        }
    }

四个指令最后都是调用InputMethodManager中的方法来完成的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值