
一、Service 通知 Activity 更新 UI1、ServicepublicclassBroadcastConstants{publicstaticfinalStringACTION_UPDATE_UIcom.example.ACTION_UPDATE_UI;publicstaticfinalStringEXTRA_DATAextra_data;}publicclassMyServiceextendsService{OverridepublicintonStartCommand(Intentintent,intflags,intstartId){// 模拟后台任务newThread(()-{try{Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}// 发送广播通知 ActivityIntentbroadcastIntentnewIntent(BroadcastConstants.ACTION_UPDATE_UI);broadcastIntent.putExtra(BroadcastConstants.EXTRA_DATA,来自 Service 的数据);sendBroadcast(broadcastIntent);}).start();returnSTART_NOT_STICKY;}NullableOverridepublicIBinderonBind(Intentintent){returnnull;}}2、Activity?xml version1.0 encodingutf-8?androidx.constraintlayout.widget.ConstraintLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.communication.WorkActivityTextViewandroid:idid/tv_resultandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent//androidx.constraintlayout.widget.ConstraintLayoutpublicclassWorkActivityextendsAppCompatActivity{privateTextViewtvResult;privatefinalBroadcastReceiveruiReceivernewBroadcastReceiver(){OverridepublicvoidonReceive(Contextcontext,Intentintent){if(BroadcastConstants.ACTION_UPDATE_UI.equals(intent.getAction())){Stringdataintent.getStringExtra(BroadcastConstants.EXTRA_DATA);tvResult.setText(data);}}};OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_work);tvResultfindViewById(R.id.tv_result);IntentFilterfilternewIntentFilter(BroadcastConstants.ACTION_UPDATE_UI);if(Build.VERSION.SDK_INTBuild.VERSION_CODES.TIRAMISU){registerReceiver(uiReceiver,filter,Context.RECEIVER_NOT_EXPORTED);}else{registerReceiver(uiReceiver,filter);}startService(newIntent(this,MyService.class));}OverrideprotectedvoidonDestroy(){super.onDestroy();unregisterReceiver(uiReceiver);}}二、Fragment 与 Activity 通信双向1、Fragment?xml version1.0 encodingutf-8?LinearLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:background#EEEEEEandroid:orientationverticalandroid:padding16dpTextViewandroid:idid/tv_fragment_msgandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:paddingBottom12dpandroid:textFragment 收到 Activity 的消息无android:textSize16sp/Buttonandroid:idid/btn_send_to_activityandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textFragment 发消息给 Activity//LinearLayoutpublicclassChildFragmentextendsFragment{privateTextViewtvFragmentMsg;NullableOverridepublicViewonCreateView(NonNullLayoutInflaterinflater,NullableViewGroupcontainer,NullableBundlesavedInstanceState){Viewviewinflater.inflate(R.layout.fragment_child,container,false);tvFragmentMsgview.findViewById(R.id.tv_fragment_msg);view.findViewById(R.id.btn_send_to_activity).setOnClickListener(v-{IntentintentnewIntent(ParentActivity.ACTION_FROM_FRAGMENT);intent.putExtra(ParentActivity.EXTRA_MSG_FROM_FRAGMENT,你好我是 Fragment);LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent);});returnview;}privatefinalBroadcastReceiveractivityReceivernewBroadcastReceiver(){OverridepublicvoidonReceive(Contextcontext,Intentintent){if(ParentActivity.ACTION_FROM_ACTIVITY.equals(intent.getAction())){Stringmsgintent.getStringExtra(ParentActivity.EXTRA_MSG_FROM_ACTIVITY);tvFragmentMsg.setText(Fragment 收到 Activity 的消息msg);}}};OverridepublicvoidonStart(){super.onStart();// 注册接收 Activity 的广播IntentFilterfilternewIntentFilter(ParentActivity.ACTION_FROM_ACTIVITY);LocalBroadcastManager.getInstance(requireContext()).registerReceiver(activityReceiver,filter);}OverridepublicvoidonStop(){super.onStop();// 注销接收 Activity 的广播LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(activityReceiver);}}2、Activity?xml version1.0 encodingutf-8?LinearLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalandroid:padding16dpTextViewandroid:idid/tv_activity_msgandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:paddingBottom12dpandroid:textActivity 收到 Fragment 的消息无android:textSize16sp/Buttonandroid:idid/btn_send_to_fragmentandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textActivity 发消息给 Fragment/FrameLayoutandroid:idid/containerandroid:layout_widthmatch_parentandroid:layout_height0dpandroid:layout_marginTop16dpandroid:layout_weight1//LinearLayoutpublicclassParentActivityextendsAppCompatActivity{// Activity - Fragment 的广播publicstaticfinalStringACTION_FROM_ACTIVITYcom.example.ACTION_FROM_ACTIVITY;publicstaticfinalStringEXTRA_MSG_FROM_ACTIVITYextra_msg_from_activity;// Fragment - Activity 的广播publicstaticfinalStringACTION_FROM_FRAGMENTcom.example.ACTION_FROM_FRAGMENT;publicstaticfinalStringEXTRA_MSG_FROM_FRAGMENTextra_msg_from_fragment;privateTextViewtvActivityMsg;OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_parent);tvActivityMsgfindViewById(R.id.tv_activity_msg);findViewById(R.id.btn_send_to_fragment).setOnClickListener(v-{IntentintentnewIntent(ACTION_FROM_ACTIVITY);intent.putExtra(EXTRA_MSG_FROM_ACTIVITY,你好我是 Activity);LocalBroadcastManager.getInstance(this).sendBroadcast(intent);});if(savedInstanceStatenull){getSupportFragmentManager().beginTransaction().replace(R.id.container,newChildFragment()).commit();}}privatefinalBroadcastReceiverfragmentReceivernewBroadcastReceiver(){OverridepublicvoidonReceive(Contextcontext,Intentintent){if(ACTION_FROM_FRAGMENT.equals(intent.getAction())){Stringmsgintent.getStringExtra(EXTRA_MSG_FROM_FRAGMENT);tvActivityMsg.setText(Activity 收到 Fragment 的消息msg);}}};OverrideprotectedvoidonStart(){super.onStart();// 注册接收 Fragment 的广播IntentFilterfilternewIntentFilter(ACTION_FROM_FRAGMENT);LocalBroadcastManager.getInstance(this).registerReceiver(fragmentReceiver,filter);}OverrideprotectedvoidonStop(){super.onStop();// 注销接收 Fragment 的广播LocalBroadcastManager.getInstance(this).unregisterReceiver(fragmentReceiver);}}