在Apress Pro Android 4中,作者说过:
当设备旋转时,[...]当前正在运行的活动的上下文将不再有效.[...]一种方法是使用对活动的弱引用而不是硬引用[...]
但是作者只是建议这一点,并没有说明它是如何完成的.谁先做了这个,请举个例子.
我对所有这些的用法非常困惑,我们应该在哪里使用它们.
我正在开发一个包含多个活动的Android应用程序.在其中我有一个类有几个静态方法.我希望能够从不同的活动中调用这些方法.我正在使用静态方法通过XmlResourceParser从xml文件加载数据.要创建XmlResourceParser,需要在Application Context上进行调用.所以我的问题是,将应用程序上下文引用到静态方法的最佳方法是什么?让每个Activity获取并传递它吗?以某种方式将它存储在全局变量中?
this经常参考当前的背景.但是,在某些情况下,为什么我们必须使用getBaseContext()而不是this.(这意味着使用时this会发现错误).
这是我的例子:
Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3){
Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show(); //this line
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,当我更改getBaseContext()为this将收到错误.
请问谁可以帮我解释一下.
我正在使用Dagger 2并使其工作,但我现在需要访问Android应用程序上下文.
我不清楚如何注入和访问上下文.我试过这样做如下:
@Module
public class MainActivityModule {
private final Context context;
MainActivityModule(Context context) {
this.context = context;
}
@Provides @Singleton
Context provideContext() {
return context;
}
Run Code Online (Sandbox Code Playgroud)
但是,这会导致以下异常:
java.lang.RuntimeException:无法创建应用程序:java.lang.IllegalStateException:必须设置mainActivityModule
如果我检查Dagger生成的代码,则会在此处引发此异常:
public Graph build() {
if (mainActivityModule == null) {
throw new IllegalStateException("mainActivityModule must be set");
}
return new DaggerGraph(this);
}
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是注入Context的正确方法 - 任何帮助将不胜感激.
我已经读过,Android应用程序中的一个错误和内存泄漏源是为了保持对Context的长期引用.
但是我不明白是否可以创建一个看起来像这样的类:
public class HelperClass {
private Context context;
public HelperClass(Context context) {
this.context = context;
}
public void myHelperMethod() {
// uses this.context
}
}
Run Code Online (Sandbox Code Playgroud)
并从活动中调用它:
public class MyActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
HelperClass h = new HelperClass(this);
h.myHelperMethod();
}
...
}
Run Code Online (Sandbox Code Playgroud) 可以将上下文变量传递给DialogFragment吗?
我在对话框中使用此代码来传递字符串:
public static ConfirmDialog newInstance( String f) {
ConfirmDialog d = new ConfirmDialog();
Bundle args = new Bundle();
args.putString("FILE_NAME", f);
d.setArguments(args);
return d;
}
Run Code Online (Sandbox Code Playgroud)
但我找不到像putString这样的函数来传递上下文.有可能这样做吗?
我正在尝试将配置(例如URL/etc)放入资源文件夹中以供实用程序类使用.但是,我不想从各地的活动中传递Context.我希望能够通过路径名访问资源(似乎资产/是为此用途设计的),而不使用上下文来访问资源.
在这种特殊情况下,我希望单例在实例化时在配置中使用某些东西.在实例化期间,除了那一次之外,它不需要任何资源.因此,每次调用getInstance()时都必须传入一个Context,这将是一个完全的浪费.
此外,这特定于App的配置,不应存储在共享系统文件或类似的任何内容中.
我将Activity上下文传递给对话框,但该对话框对于其他活动是全局的,因此其他活动也可能创建该对话框.我的问题是如何确定Activity上下文是一个特定的Activity?
我正在传递ActivityContext,如下所示:
private Activity ActivityContext;
public MessageDialog(Activity context,int DialogStyle,int Dialog_Layout,String Msg)
{
super(context,DialogStyle,Dialog_Layout);
this.ActivityContext = context;
this.Msg = Msg;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试从扩展BroadcastReceiver的类开始一个活动.
public void onReceive(Context context, Intent intent) {
Run Code Online (Sandbox Code Playgroud)
问题是参数上下文是Application上下文而不是Activity上下文.
有没有办法使用Application上下文启动intent?