以下是我关于使用context
的发现:
1) . 在Activity
内部,用this
来填充布局和菜单、注册上下文菜单、实例化小部件、启动其他活动、在Activity
中创建新的Intent
、实例化偏好设置或其他可用于Activity
的方法。
填充布局:
View mView = this.getLayoutInflater().inflate(R.layout.myLayout, myViewGroup)
展开菜单:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
this.getMenuInflater().inflate(R.menu.mymenu, menu);
return true;
}
注册上下文菜单:
this.registerForContextMenu(myView)
实例化小部件:
TextView myTextView = (TextView) this.findViewById(R.id.myTextView);
启动一个Activity
:
Intent mIntent = new Intent(this, MyActivity.class);
this.startActivity(mIntent);
实例化偏好设置:
SharedPreferences mSharedPreferences = this.getPreferenceManager().getSharedPreferences()
2) . 对于整个应用程序范围内的类,请使用getApplicationContext()
,因为此上下文存在于应用程序的生命周期中。
检索当前Android软件包的名称:
public class MyApplication extends Application {
public static String getPackageName() {
String packageName = null;
try {
PackageInfo mPackageInfo = getApplicationContext().getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), 0);
packageName = mPackageInfo.packageName;
} catch (NameNotFoundException e) {
}
return packageName;
}
}
绑定一个应用程序范围的类:
Intent mIntent = new Intent(this, MyPersistent.class);
MyServiceConnection mServiceConnection = new MyServiceConnection();
if (mServiceConnection != null) {
getApplicationContext().bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
3) . 对于 Listeners 和其他类型的 Android 类(如 ContentObserver),使用类似以下的 Context 替换:
mContext = this
mContext = context
其中this
或者context
指类(例如Activity)的上下文。
Activity
上下文替换:
public class MyActivity extends Activity {
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
}
}
监听器上下文替换:
public class MyLocationListener implements LocationListener {
private Context mContext;
public MyLocationListener(Context context) {
mContext = context;
}
}
ContentObserver
上下文替换:
public class MyContentObserver extends ContentObserver {
private Context mContext;
public MyContentObserver(Handler handler, Context context) {
super(handler);
mContext = context;
}
}
4) . 对于 BroadcastReceiver
(包括内联/嵌入式接收器),请使用接收器的自身上下文。
外部的BroadcastReceiver
:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(Intent.ACTION_SCREEN_OFF)) {
sendReceiverAction(context, true);
}
private static void sendReceiverAction(Context context, boolean state) {
Intent mIntent = new Intent(context.getClass().getName() + "." + context.getString(R.string.receiver_action));
mIntent.putExtra("extra", state);
context.sendBroadcast(mIntent, null);
}
}
}
嵌入式BroadcastReceiver
:
public class MyActivity extends Activity {
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final boolean connected = intent.getBooleanExtra(context.getString(R.string.connected), false);
if (connected) {
}
}
};
}
5) . 对于服务,请使用该服务的上下文。
public class MyService extends Service {
private BroadcastReceiver mBroadcastReceiver;
@Override
public void onCreate() {
super.onCreate();
registerReceiver();
}
private void registerReceiver() {
IntentFilter mIntentFilter = new IntentFilter();
mIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
this.mBroadcastReceiver = new MyBroadcastReceiver();
this.registerReceiver(this.mBroadcastReceiver, mIntentFilter);
}
}
6) . 对于 Toasts,通常使用getApplicationContext()
,但在可能的情况下,请使用从 Activity、Service 等传递的 context。
使用应用程序的上下文:
Toast mToast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG);
mToast.show();
使用来自源的上下文:
public static void showLongToast(Context context, String message) {
if (context != null && message != null) {
Toast mToast = Toast.makeText(context, message, Toast.LENGTH_LONG);
mToast.show();
}
}
最后,不要像Android的框架开发者建议的那样使用getBaseContext()
。
更新:添加Context
使用示例。