确定Method是否是`RemotableViewMethod`

时间:2012-09-05 11:43:04

标签: java android reflection remoteview

我正在构建一个包含ProgressBar的Widget。如果Widget正在计算,我将ProgressBar的可见性设置为VISIBLE,如果所有计算都停止,则设置为INVISIBILE。应该没有问题,因为setVisibility被记录为RemotableViewMethod。然而,HTC的一些人似乎忘了它(即在Wildfire S上),所以拨打RemoteViews.setVisibility会导致崩溃。因此,如果setVisibility真的可以调用,我会尝试执行检查。我已经为它写了这个方法:

private boolean canShowProgress(){
        LogCat.d(TAG, "canShowProgress");
        Class<ProgressBar> barclz = ProgressBar.class;
        try {
            Method method = barclz.getMethod("setVisibility", new Class[]{int.class});
            Annotation[] anot = method.getDeclaredAnnotations();
            return anot.length > 0;
        } catch (SecurityException e) {
            LogCat.stackTrace(TAG, e);
        } catch (NoSuchMethodException e) {
            LogCat.stackTrace(TAG, e);
        }
        return false;
    }

这样可行,但真的丑陋,因为如果 ANY Annotiation存在,它将返回“True”。我看了一下,RemoteView本身是如何进行查找的,并发现了这个:

if (!method.isAnnotationPresent(RemotableViewMethod.class)) {
                throw new ActionException("view: " + klass.getName()
                        + " can't use method with RemoteViews: "
                        + this.methodName + "(" + param.getName() + ")");
            }

但是我不能这样做,因为通过sdk无法接受类RemotableViewMethod。如何知道它是否可访问?

1 个答案:

答案 0 :(得分:3)

通过编写我的问题,我有想法通过其名称查找该类,并且它有效。 所以我将我的方法更新为以下内容:

private boolean canShowProgress(){
        LogCat.d(TAG, "canShowProgress");
        Class<ProgressBar> barclz = ProgressBar.class;
        try {
            Method method = barclz.getMethod("setVisibility", new Class[]{int.class});
            Class c = null;
            try {
                c = Class.forName("android.view.RemotableViewMethod");
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return (this.showProgress= (c != null && method.isAnnotationPresent(c)));


        } catch (SecurityException e) {
            LogCat.stackTrace(TAG, e);
        } catch (NoSuchMethodException e) {
            LogCat.stackTrace(TAG, e);

        }
        return false;
    }

完美无瑕地运作