android - intent - mainactivity context取得




如何從任何地方獲取包名? (6)

一個想法是在你的主要活動中有一個靜態變量,實例化為包名稱。 然後只需引用該變量。

您將不得不在主活動的onCreate()方法中初始化它:

全球對班級:

public static String PACKAGE_NAME;

然後..

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    PACKAGE_NAME = getApplicationContext().getPackageName();
}

然後您可以通過Main.PACKAGE_NAME訪問它。

我知道Context.getApplicationContext()View.getContext()的可用性,通過它我可以實際調用Context.getPackageName()來檢索應用程序的包名稱。

如果我從一個ViewActivity對象可用的方法調用它們,它們會工作,但是如果我想從完全獨立的類中找到沒有ViewActivity的包名,是否有辦法做到這一點(直接或間接)?


你可以使用未記錄的方法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/http://blog.javia.org/static-the-android-application-package/


創建一個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();

使用應用程序模塊還為您提供了需要但沒有上下文的模塊的上下文。


如果你的意思是沒有明確的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();
    }
}

然後在manifest您需要將此類添加到“ 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-android-plugin構建您的應用程序,那麼您可以使用

BuildConfig.APPLICATION_ID

從任何範圍檢索包名稱,包括。 一個靜態的。


PackageInfo pinfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
         String sVersionCode = pinfo.versionCode; // 1
         String sVersionName = pinfo.versionName; // 1.0
         String sPackName = getPackageName(); // cz.okhelp.my_app
         int nSdkVersion = Integer.parseInt(Build.VERSION.SDK); 
         int nSdkVers = Build.VERSION.SDK_INT; 

希望它能起作用。





android-context