有时我需要提供一个Context对象来调用特定的函数,例如
Intent intent = new Intent(context, MyClass.class);
Run Code Online (Sandbox Code Playgroud)
为了开始服务
context.startService(intent);
Run Code Online (Sandbox Code Playgroud)
或者,提供Context对象来进行查询
Cursor cursor = context.managedQuery(uri, projection, null, null, null);
Run Code Online (Sandbox Code Playgroud)
如果这是在扩展Activity的UI类中完成的,那很好.但是,如果我想创建自己的实用程序类(单例),它不扩展任何东西并调用这些函数,我没有必要的Context对象.现在我的解决方法是在初始化实用程序类时传递一个活动引用,并具有调用这些函数的引用.我想知道这样做的正确方法是什么.让每个类扩展Context以使它可以调用这些函数是不合理的.
我目前正在尝试从实用程序类调用一个方法,该方法将引用为此实用程序方法创建的新游标.不幸的是,我的新类不会让我在没有上下文的情况下创建游标.我已经尝试了许多从调用活动传递上下文的方法,但在大多数情况下获取空指针异常.
这是我的代码的一部分:
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Tools.pickRandomItem();
}
});
Run Code Online (Sandbox Code Playgroud)
并在工具类中:
public static void pickRandomItem() {
Cursor cur = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
null, null,MediaColumns.TITLE + " ASC");
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码会引发错误getContentResolver(),并且我为传递上下文所做的所有尝试都失败了.
我对Android编程很新,并不完全理解上下文的概念.您将提供的任何帮助将不胜感激!
首先是Toast.makeText()的格式:
public static Toast makeText (Context context, CharSequence text, int duration)
第一个参数是Context,函数getApplicationContext()也返回当前上下文,一切正常,但是IMO,getApplicationContext()也可以替换为这个,如下所示:
public class ContextMenuResourcesActivity extends Activity {
/** Called when the activity is first created. */
private Button b1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b1 = (Button)findViewById(R.id.button1);
final int l = Toast.LENGTH_LONG;
final String s1 = "some string";
b1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast t1 = Toast.makeText(this, s1, l);
t1.show();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
IMO this代表 …
我需要将一个上下文传递给一个函数,我无法得到它的上下文getApplicationContext()我必须说我的应用程序是一个服务.那么我怎样才能获得内部的上下文locationListener?
内部onLocationChanged(Location location)方法更准确
我有这样的代码:
else if (v == mSettings)
{
if (disappearView.getVisibility() == View.VISIBLE)
{
AlphaAnimation fadeOutAnimation = new AlphaAnimation(1, 0); // start alpha, end alpha
fadeOutAnimation.setDuration(1000); // time for animation in milliseconds
fadeOutAnimation.setFillAfter(true); // make the transformation persist
Animation out = AnimationUtils.makeOutAnimation(this, true);
disappearView.startAnimation(out);
disappearView.setVisibility(View.INVISIBLE);
out.setAnimationListener(new Animation.AnimationListener()
{
public void onAnimationEnd(Animation animation)
{
disappearView.setVisibility(View.GONE);
Animation in = AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
bannerView.startAnimation(in);
bannerView.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) { }
@Override
public void onAnimationStart(Animation animation) { }
});
}
else {
Animation in …Run Code Online (Sandbox Code Playgroud) 为什么需要为视图构造函数传递上下文对象.视图和上下文如何相互关联.
在我的应用程序中,我在不同的地方引用上下文,包括Intent,访问资源,文件操作,AlertDialog等.而且难以在不同的类中传递当前上下文.所以我尝试在启动器活动中的单例类中设置应用程序基础上下文.因此,在启动应用程序时,我正在获取应用程序上下文并将其设置为类.后来我指的是该上下文的相同实例.但是在某些地方AlertDialog,如果我使用基本上下文,它就会出错.那么,将上下文保持在一个公共位置并访问相同而不是在不同类之间传递当前上下文是一种好的做法吗?或者在不同类之间进行通信时传递上下文的优先方式是什么?
这是我获取上下文的课程
public class AppContext extends Application {
private static Context sContext = null;
@Override
public void onCreate() {
super.onCreate();
sContext = getApplicationContext();
}
public static Context getContext() {
return sContext;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个扩展类的应用程序,并且正在使用它的对象在其他类中访问它
private <class-name> <object-name>;
Run Code Online (Sandbox Code Playgroud)
并像这样初始化它:
<object-name> =(<class-name> ) context.getApplicationContext();
Run Code Online (Sandbox Code Playgroud)
它会作为单例还是将形成多个实例?
如果形成了多个实例,那我该如何创建使其像单例一样工作?
如果它像一个单例,那么我可以通过它访问我的静态变量吗?
我正在使用LocalBroadcastManager使用APPLICATION CONTEXT向我的活动和服务进行广播,如下所示:
public class CommonForApp extends Application{
public void broadcastUpdateUICommand(String[] updateFlags,
String[] flagValues) {
Intent intent = new Intent(UPDATE_UI_BROADCAST);
for (int i = 0; i < updateFlags.length; i++) {
intent.putExtra(updateFlags[i], flagValues[i]);
}
mLocalBroadcastManager = LocalBroadcastManager.getInstance(mContext);
mLocalBroadcastManager.sendBroadcast(intent);
}}
Run Code Online (Sandbox Code Playgroud)
现在在我的服务中使用监听器,我正在调用broadcastUpdateUICommand(),如下所示:
public class mService extends Service {
public BuildNowPLaylistListListener buildCursorListener = new BuildNowPLaylistListListener() {
@Override
public void onServiceListReady() {
mApp.broadcastUpdateUICommand(
new String[] { CommonForApp.INIT_DRAWER},
new String[] {""});
}}}
Run Code Online (Sandbox Code Playgroud)
我正在我的活动中接收广播,如下所示:
public class mActivity extends Activity{
BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void …Run Code Online (Sandbox Code Playgroud) service android android-context android-activity localbroadcastmanager
我正在尝试实现以下单例模式: SingletonClass.getInstance(context).callMethod()
虽然有很多教程可以解释如何在Kotlin中制作单例,但它们都没有解决context在静态字段中持有一个会导致Android内存泄漏的事实.
如何在不创建内存泄漏的情况下创建上述模式?
更新:
这是我对CommonsWare解决方案#2的实现.我用过Koin.
单身人士课程:
class NetworkUtils(val context: Context) {
}
Run Code Online (Sandbox Code Playgroud)
申请类别:
class MyApplication : Application() {
val appModule = module {
single { NetworkUtils(androidContext()) }
}
override fun onCreate() {
super.onCreate()
startKoin(this, listOf(appModule))
}
}
Run Code Online (Sandbox Code Playgroud)
活动类:
class MainActivity : AppCompatActivity() {
val networkUtils : NetworkUtils by inject()
}
Run Code Online (Sandbox Code Playgroud)