我知道Context.getApplicationContext()和View.getContext()的可用性,通过它们我实际上可以调用Context.getPackageName()来检索应用程序的包名。
如果我从一个View或Activity对象可用的方法中调用,它们就可以工作,但是如果我想从一个完全独立的没有View或Activity的类中找到包名,有没有办法(直接或间接地)做到这一点?
我知道Context.getApplicationContext()和View.getContext()的可用性,通过它们我实际上可以调用Context.getPackageName()来检索应用程序的包名。
如果我从一个View或Activity对象可用的方法中调用,它们就可以工作,但是如果我想从一个完全独立的没有View或Activity的类中找到包名,有没有办法(直接或间接地)做到这一点?
当前回答
创建一个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();
使用应用程序模块还为需要但没有上下文的模块提供了上下文。
其他回答
一个想法是在你的主活动中有一个静态变量,实例化为包名。然后引用那个变量。
你必须在主活动的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访问它。
只需使用这段代码
val packageName = context.packageName
如果你的意思是没有一个明确的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();
希望能有所帮助。
使用: BuildConfig。APPLICATION_ID获取包名的任何地方(即;服务、接收方、活动、片段等)
例子: String PackageName = BuildConfig.APPLICATION_ID;
这适用于我在kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var packageName=applicationContext.packageName // need to put this line
Log.d("YourTag",packageName)
}