2013-05-17 137 views
49

我的應用程序有一個帶有3個片段選項卡的操作欄。 在第二個片段中,我註冊並取消註冊BroadcastReceiver。 我註銷中的接收器,並在onCreateViewonResume中註冊它。在片段中註冊和註銷BroadcastReceiver

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

getActivity().unregisterReceiver(batteryInfoReceiver); 

1)是否有兩次註冊相同reciever(在onCreateView和的onResume好嗎)?(是無害的?)

2)是它足以只註冊onResume中的接收器?

+0

當我在一個片段上嘗試時發生註銷錯誤。我面臨的問題是 - 我試圖註銷兩次。一旦onDestroy()和onPause()一次。我還在onCreate()上註冊了一次,在onResume()上註冊了一次。後來看片段的生命週期,我發現我只需要在onResume()上註冊並在onPause()上取消註冊。這足以在一個片段上註冊和取消註冊。 希望這可以幫助有人做與片段廣播。 :) –

回答

112

看一看life-cycleFragments的:

onCreateView(): 系統調用這個當它的時間片段繪製它的用戶界面首次。要爲您的片段繪製UI,您必須從此方法返回一個視圖,該方法是片段佈局的根。如果片段不提供UI,則可以返回null。

的onResume(): 該片段是在運行活動

的onPause()可見: 這通常是你應該提交應堅持超越了當前用戶會話的任何改變(因爲用戶可能不會回來)。

結論:

所以最好是註冊接收器裏面只有onResume()和註銷內部onPause()因爲onCreateView()涉及只能查看層次。它與接收器無關。所以它不是有害的,但肯定是沒用的。

我希望它會有幫助!

3

這裏是代碼爲我的作品:

內部佈局:

<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)); 
    } 
} 

好運.. 斯特凡Ronnkvist

+0

你的解決方案太棒了!請更正您的個人資料,男士。 user1579736不酷但你是! –

0

的onResume註冊:

上下文。registerReceiver(接收器,IntentFilter的(BroadCastAction.action_success))

的onPause UNREGISTER:

context.unregisterReceiver(mContactBroadCastReceiver);