我有一个名为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)
似乎需要在一个活动中。
答案 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从其他地方调用它。但是,如果您尝试使用“不保留活动”选项,则此方法将失败。