我知道Context.getApplicationContext()和View.getContext()的可用性,通过它们我实际上可以调用Context.getPackageName()来检索应用程序的包名。

如果我从一个View或Activity对象可用的方法中调用,它们就可以工作,但是如果我想从一个完全独立的没有View或Activity的类中找到包名,有没有办法(直接或间接地)做到这一点?


当前回答

如果你的意思是没有一个明确的Context(例如来自后台线程),你应该在你的项目中定义一个类:

public class MyApp extends Application {
    private static MyApp instance;

    public static MyApp getInstance() {
        return instance;
    }

    public static Context getContext(){
        return instance;
        // or return instance.getApplicationContext();
    }

    @Override
    public void onCreate() {
        instance = this;
        super.onCreate();
    }
}

然后在清单中,您需要将这个类添加到Application选项卡的Name字段中。或者编辑xml并放置

<application
    android:name="com.example.app.MyApp"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    .......
    <activity
        ......

然后你可以在任何地方打电话

String packagename= MyApp.getContext().getPackageName();

希望能有所帮助。

其他回答

如果你的意思是没有一个明确的Context(例如来自后台线程),你应该在你的项目中定义一个类:

public class MyApp extends Application {
    private static MyApp instance;

    public static MyApp getInstance() {
        return instance;
    }

    public static Context getContext(){
        return instance;
        // or return instance.getApplicationContext();
    }

    @Override
    public void onCreate() {
        instance = this;
        super.onCreate();
    }
}

然后在清单中,您需要将这个类添加到Application选项卡的Name字段中。或者编辑xml并放置

<application
    android:name="com.example.app.MyApp"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    .......
    <activity
        ......

然后你可以在任何地方打电话

String packagename= MyApp.getContext().getPackageName();

希望能有所帮助。

如果你使用gradle build,使用这个:BuildConfig。APPLICATION_ID获取应用程序的包名。

使用: BuildConfig。APPLICATION_ID获取包名的任何地方(即;服务、接收方、活动、片段等)

例子: String PackageName = 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();

使用应用程序模块还为需要但没有上下文的模块提供了上下文。

BuildConfig。APPLICATION_ID和package可能并不总是相同的。使用“buildConfigField”让gradle添加包到BuildConfig并访问BuildConfig. package。 https://developer.android.com/studio/build/gradle-tips

defaultConfig {
    applicationId "com.example.app.name"
    minSdkVersion 24
    targetSdkVersion 29
    versionCode 1
    versionName '0.1.0'
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    buildConfigField("String", "PACKAGE", "\"com.example.app\"")
}