我知道Context.getApplicationContext()和View.getContext()的可用性,通过它们我实际上可以调用Context.getPackageName()来检索应用程序的包名。
如果我从一个View或Activity对象可用的方法中调用,它们就可以工作,但是如果我想从一个完全独立的没有View或Activity的类中找到包名,有没有办法(直接或间接地)做到这一点?
我知道Context.getApplicationContext()和View.getContext()的可用性,通过它们我实际上可以调用Context.getPackageName()来检索应用程序的包名。
如果我从一个View或Activity对象可用的方法中调用,它们就可以工作,但是如果我想从一个完全独立的没有View或Activity的类中找到包名,有没有办法(直接或间接地)做到这一点?
当前回答
如果你使用gradle-android-plugin来构建你的应用程序,那么你可以使用
BuildConfig.APPLICATION_ID
从任何作用域(包括静态作用域)检索包名。
其他回答
创建一个java模块,最初运行时启动你的应用程序。这个模块将扩展android应用程序类,并初始化任何全局应用程序变量,还包含应用程序范围的实用程序例程-
public class MyApplicationName extends Application {
private final String PACKAGE_NAME = "com.mysite.myAppPackageName";
public String getPackageName() { return PACKAGE_NAME; }
}
当然,这可能包括从android系统获取包名的逻辑;然而,上面的代码比从android获取的代码更小,更快,更干净。
请务必在AndroidManifest.xml文件中放置一个条目,告诉android在运行任何活动之前运行您的应用程序模块
<application
android:name=".MyApplicationName"
...
>
然后,要从任何其他模块获取包名,请输入
MyApp myApp = (MyApp) getApplicationContext();
String myPackage = myApp.getPackageName();
使用应用程序模块还为需要但没有上下文的模块提供了上下文。
如果你使用gradle build,使用这个:BuildConfig。APPLICATION_ID获取应用程序的包名。
只需导入Android。App,然后你可以使用: < br / > Application.getProcessName () < br / >
获取不包含上下文、视图或活动的当前应用程序进程名。
private String getApplicationName(Context context, String data, int flag) {
final PackageManager pckManager = context.getPackageManager();
ApplicationInfo applicationInformation;
try {
applicationInformation = pckManager.getApplicationInfo(data, flag);
} catch (PackageManager.NameNotFoundException e) {
applicationInformation = null;
}
final String applicationName = (String) (applicationInformation != null ? pckManager.getApplicationLabel(applicationInformation) : "(unknown)");
return applicationName;
}
你可以使用未记录的方法android.app.ActivityThread.currentPackageName():
Class<?> clazz = Class.forName("android.app.ActivityThread");
Method method = clazz.getDeclaredMethod("currentPackageName", null);
String appPackageName = (String) method.invoke(clazz, null);
注意:这必须在应用程序的主线程中完成。
感谢这篇博客文章的想法:http://blog.javia.org/static-the-android-application-package/。