1 Android输入法的特点:
一个应用程序,要想成为输入法,必然会申请输入法权限:
android:permission="android.permission.BIND_INPUT_METHOD
所以,判断一个输入法应用的原理如下:
判断一个程序是否是输入法,可以通过解析它的Androidmanifest.xml文件,读取它的所有services列表,如果其中一个的android:permission="android.permission.BIND_INPUT_METHOD", 那么这个就是输入法。
2 判断输入法应用的代码实现:
public static boolean isInputMethodApp(Context context, String packageName) {
PackageManager pm = context.getPackageManager();
boolean isInputMethodApp = false;
try {
PackageInfo pkgInfo = pm.getPackageInfo(packageName, PackageManager.GET_SERVICES);
ServiceInfo[] sInfo = pkgInfo.services;
if (sInfo != null) {
for(int i = 0; i < sInfo.length; i++) {
ServiceInfo serviceInfo = sInfo[i];
if (serviceInfo.permission != null &&
serviceInfo.permission.equals("android.permission.BIND_INPUT_METHOD")) {
isInputMethodApp = true;
break;
}
}
}
} catch (NameNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return isInputMethodApp;
}
说明:
(1)PackageInfo中的ServiceInfo保存了此app的权限列表;
(2)通过下面这行代码来判断是否具有输入法权限:
serviceInfo.permission.equals("android.permission.BIND_INPUT_METHOD")
3 ServiceInfo类声明:
ServiceInfo
public class ServiceInfo
extends ComponentInfo
implements Parcelable
java.lang.Object | |||
↳ | android.content.pm.PackageItemInfo | ||
↳ | android.content.pm.ComponentInfo | ||
↳ | android.content.pm.ServiceInfo |
ServiceInfo类的flag:
int
FLAG_EXTERNAL_SERVICE
flags
位:如果设置,则可以在调用应用程序的包中绑定和运行该服务,而不是在其声明的包中运行该服务。int
FLAG_ISOLATED_PROCESS
flags
位:如果设置,服务将在其自己的独立进程中运行。int
FLAG_SINGLE_USER
flags
位:如果设置了,则服务的单个实例将针对设备上的所有用户运行。int
FLAG_STOP_WITH_TASK
flags
位:如果设置,则如果用户移除以某个应用程序活动为根的任务,系统将自动停止该服务。