Activity 和 Fragment中的Context

Activity

  • getBaseContext 这个函数的默认返回类型就是当前的Activity。

在启动流程的ActivityThread.class--performLaunchActivity()

appContext.setOuterContext(activity);
                activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.configCallback,
                        r.assistToken);
final void attach(Context context, ActivityThread aThread,
            Instrumentation instr, IBinder token, int ident,
            Application application, Intent intent, ActivityInfo info,
            CharSequence title, Activity parent, String id,
            NonConfigurationInstances lastNonConfigurationInstances,
            Configuration config, String referrer, IVoiceInteractor voiceInteractor,
            Window window, ActivityConfigCallback activityConfigCallback, IBinder assistToken) {
        attachBaseContext(context);
                ...
            }

这里直接通过attach方法调用了attachBaseContext 实现了base的赋值

但是这个值是可以被更改的

在Activity.class中

protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(newBase);
        if (newBase != null) {
            newBase.setAutofillClient(this);
            newBase.setContentCaptureOptions(getContentCaptureOptions());
        }
    }

这个方法是可以被子类调用的。所以也不能完全认为baseContext就是当前的activity。
不建议使用这中方式处理普通的context操作。可以用Activity.this 或者 getApplicationContext代替

  • getApplicationContext 返回的就是applicationContext
public Context getApplicationContext() {
        return mBase.getApplicationContext();
    }

Fragment

  • getContext()
  • getActivity()

这两个返回的是相同的都是actvity

FragmentActivity中创建 FragmentController时就赋值了Context和Activity

final FragmentController mFragments = FragmentController.createController(new HostCallbacks());
......
public HostCallbacks() {
            super(FragmentActivity.this /*fragmentActivity*/);
        }
        
.......

//这里传入的两个参数都是activity

FragmentHostCallback(@NonNull FragmentActivity activity) {
        this(activity, activity /*context*/, new Handler(), 0 /*windowAnimations*/);
    }
.......
FragmentHostCallback(@Nullable Activity activity, @NonNull Context context,
            @NonNull Handler handler, int windowAnimations) {
        mActivity = activity;
        mContext = Preconditions.checkNotNull(context, "context == null");
        mHandler = Preconditions.checkNotNull(handler, "handler == null");
        mWindowAnimations = windowAnimations;
    }

在使用的时候我们可以使用requireContext requireActivity 来获取 ,它们已经帮我们做了空检测

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在AndroidActivityFragment之间的绑定可以通过以下步骤实现: 1. 在Activity定义一个Fragment实例,并在布局文件引用该Fragment。 2. 在Fragment定义一个接口,并在onAttach()方法将该接口与Activity绑定。 3. 在Activity实现该接口,并在其方法调用Fragment的方法。 以下是一个简单的示例代码: 在Activity: ```java public class MainActivity extends AppCompatActivity implements MyFragment.OnButtonClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onButtonClick() { // 在此处处理按钮点击事件 } } ``` 在布局文件的引用: ```xml <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <fragment android:name="com.example.MyFragment" android:id="@+id/fragment" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> ``` 在Fragment: ```java public class MyFragment extends Fragment { private OnButtonClickListener mListener; public interface OnButtonClickListener { void onButtonClick(); } @Override public void onAttach(Context context) { super.onAttach(context); try { mListener = (OnButtonClickListener) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString() + " must implement OnButtonClickListener"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); Button button = view.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onButtonClick(); } }); return view; } } ``` 在此示例,MyFragment的onAttach()方法将Activity与OnButtonClickListener接口绑定。而Activity实现了该接口,并在onButtonClick()方法处理按钮点击事件。通过这种方式,FragmentActivity之间就建立了通信的桥梁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值