如何调用Android活动中包含的方法?

时间:2018-06-18 08:35:54

标签: java android android-activity

我有一个名为getPacketNames()的方法的Activity类,它返回了一些已安装软件包的名称。

private ArrayList<CharSequence> getPackageNames(){
    ArrayList<CharSequence> packageNames = new ArrayList<>();
    List<PackageInfo> packagesInfos = getPackageManager().getInstalledPackages(0);

    for(PackageInfo packageInfo: packagesInfos){
        if(!isSystemApp(packageInfo)){
            packageNames.add(packageInfo.packageName);
        }
    }

    return packageNames;
}

我希望其他人可以轻松地从另一个类调用此方法。但是,为了这样做,他们必须创建活动的实例。这看起来很麻烦,而且不正确。

我能以任何方式在Activity之外创建此方法吗?当我创建一个单独的类并复制粘贴该方法时,它不起作用,因为getPackageManager().getInstalledPackages(0)似乎需要在一个活动中。

2 个答案:

答案 0 :(得分:5)

你不应该试图这样做。而是创建一个UtilityClass并将getPackageNames()作为静态方法。

public final class MyUtils {

    public static ArrayList<CharSequence> getPackageNames(final Context context){
        ArrayList<CharSequence> packageNames = new ArrayList<>();
        List<PackageInfo> packagesInfos = context.getPackageManager().getInstalledPackages(0);

        for(PackageInfo packageInfo: packagesInfos){
            if(!isSystemApp(packageInfo)){
                packageNames.add(packageInfo.packageName);
            }
        }

        return packageNames;
    }
    private static boolean isSystemApp(...){
        ...
    }
}

然后从Activity中,您可以按如下方式访问它:

MyUtils.getPackageNames(this);

答案 1 :(得分:1)

萨加尔的回答是正确的,你应该遵循这一点。如果要创建一个util类,请不要忘记添加私有构造函数,这样就不会实例化您的util类。

对于“hacky”和错误的解决方案,您始终可以在活动类中将方法定义为公共静态,并使用YourActivity.methodname从其他地方调用它。但是,如果您尝试使用“不保留活动”选项,则此方法将失败。