在一个片段中注册和注销BroadcastReceiver

我的应用程序有一个带3个片段选项卡的操作栏。 在第二个片段中,我注册并取消注册BroadcastReceiver。 我在onPause注销接收器,并在onCreateViewonResume注册它。

 getActivity().registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

 getActivity().unregisterReceiver(batteryInfoReceiver); 

1)两次注册相同的接收者(在onCreateView和onResume中)是否可以?(是否无害?)

2)在onResume中注册接收器是否足够?

看看Fragments 生命周期 :

onCreateView():当片段第一次绘制其用户界面时,系统会调用它。 为了为你的片段绘制一个UI,你必须从这个方法返回一个View,它是你的片段布局的根。 如果片段不提供UI,则可以返回null。

onResume():片段在运行活动中可见

onPause():这通常是你应该提交任何应该在当前用户会话之外保存的更改的地方(因为用户可能不会回来)。

结论:

因此,最好只在onResume()注册接收者,并在onPause()内注销,因为onCreateView()只处理视图层次结构。 它与接收器无关。 所以这不是有害的,但肯定是没用的。

我希望它会有帮助!

这里是适合我的代码:

内部布局:

 <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="sendInternalBroadcast" android:text="Broadcast"/> 

片段布局:

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:gravity="center"> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Fragment One" android:id="@+id/fragmentoneTextView1"/> </LinearLayout> 

里面主要活动:

  public void sendInternalBroadcast(View view) { Intent intent = new Intent(); intent.setAction("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup"); intent.putExtra("From", "sendInternalBroadcast"); sendBroadcast(intent); } 

分段:

 import android.app.*; import android.content.*; import android.os.*; import android.view.*; import android.widget.*; public class FragmentOne extends Fragment { View view; Context _context; PendingIntent pi; BroadcastReceiver br; AlarmManager am; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragmentone, container, false); setup(); return view; } @Override public void onAttach(Context context) { super.onAttach(context); _context = context; } @Override public void onDestroyView() { super.onDestroyView(); _context.unregisterReceiver(br); } private void setup() { br = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent i) { TextView tv = (TextView)view.findViewById(R.id.fragmentoneTextView1); tv.setText("onReceive"); } }; _context.registerReceiver(br, new IntentFilter("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup")); pi = PendingIntent.getBroadcast(_context, 0, new Intent("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup"), 0); am = (AlarmManager)(_context.getSystemService(Context.ALARM_SERVICE)); } } 

好运.. Stefan Ronnkvist