簡體   English   中英

廣播接收器類將狀態發送到片段

[英]Broadcast Receiver class send status to fragment

我有一個廣播接收器作為班級的一部分,將廣播接收器移到其自己的班級時,我無法將任何類型的值返回給需要該數據的班級。 有沒有辦法設置數據,然后將其發送回注冊它的類?

概述類應該能夠獲取BatteryReceiver類發出的狀態。

public class Overview extends Fragment {

    private Unbinder unbinder;

    private BroadcastReceiver batteryReceiver = new BatteryReceiver();

    @BindView(R.id.bat_generic)
    TextView batText;

    public Overview() {
        // Required empty public constructor
    }

    public static Overview newInstance() {
        return new Overview();
    }

    @Override
    public void onCreate(Bundle outState) {
        super.onCreate(outState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_overview, container, false);
        unbinder = ButterKnife.bind(this, view);

        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public void onResume() {
        super.onResume();

        try {
            initView();

            getActivity().registerReceiver(
                    batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)
            );

        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onPause() {
        super.onPause();
        unbinder.unbind();
        getActivity().unregisterReceiver(batteryReceiver);
    }

    private void initView() {

        batText.setText(
          // TODO: logic  
        );
}

BatteryReceiver類應該能夠將數據發送回實現它的類。

public class BatteryReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int deviceStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        int percentage = (int) (((float) level / (float) scale) * 100.0f);

        switch (deviceStatus) {
            case BatteryManager.BATTERY_STATUS_CHARGING:
                context.getString((R.string.bat_charge), "Charging:", percentage, "%");
                break;
            case BatteryManager.BATTERY_STATUS_DISCHARGING:
                context.getString((R.string.bat_charge), "Discharging:", percentage, "%");
                break;
            case BatteryManager.BATTERY_STATUS_FULL:
                context.getString((R.string.bat_charge), "Full:", percentage, "%");
                break;
            case BatteryManager.BATTERY_STATUS_UNKNOWN:
                context.getString((R.string.bat_charge), "Unknown:", percentage, "%");
                break;
            case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
                context.getString((R.string.bat_charge), "Not charging:", percentage, "%");
                break;
        }
    }

基本上,您不能在非上下文的類中注冊廣播,但是有一種方法可以將上下文傳遞給其他類。

        // implements OnBatteryChange in your activity
    public class MainActivity extends AppCompatActivity implements OnBatteryChange {...
    // add following method in your activity
     @Override
      public void batteryChanged(String data) {
        txtBat.setText(data);
      }
    // add following line in onCreate() in activity

    OtherReceiver reciever = new OtherReceiver(getApplicationContext(),this);
    reciever.doSomethingWithReceivedIntent();

        //OtherReceiver class

        public class OtherReceiver {
    Context context;
    OnBatteryChange batteryChange;

    public OtherReceiver(Context context, OnBatteryChange batteryChange) {
        this.context = context;
        this.batteryChange = batteryChange;
    }

    public void doSomethingWithReceivedIntent() {
        BatteryReceiver batteryReceiver = new BatteryReceiver();
        batteryReceiver.setBatteryChange(batteryChange);
        context.registerReceiver(batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    }
}

    //OnBatteryChange interface

    public interface OnBatteryChange {
        void batteryChanged(String data);
    }

    //amend BatteryReceiver to following code 
public class BatteryReceiver extends BroadcastReceiver {
    OnBatteryChange batteryChange;

    public void setBatteryChange(OnBatteryChange batteryChange) {
        this.batteryChange = batteryChange;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        int deviceStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        int percentage = (int) (((float) level / (float) scale) * 100.0f);

        switch (deviceStatus) {
            case BatteryManager.BATTERY_STATUS_CHARGING:

                batteryChange.batteryChanged(context.getString((R.string.bat_charge), "Charging:", percentage, "%"));
                break;
            case BatteryManager.BATTERY_STATUS_DISCHARGING:

                batteryChange.batteryChanged(context.getString((R.string.bat_charge), "Discharging:", percentage, "%"));
                break;
            case BatteryManager.BATTERY_STATUS_FULL:

                batteryChange.batteryChanged(context.getString((R.string.bat_charge), "Full:", percentage, "%"));
                break;
            case BatteryManager.BATTERY_STATUS_UNKNOWN:

                batteryChange.batteryChanged(context.getString((R.string.bat_charge), "Unknown:", percentage, "%"));
                break;
            case BatteryManager.BATTERY_STATUS_NOT_CHARGING:

                batteryChange.batteryChanged(context.getString((R.string.bat_charge), "Not charging:", percentage, "%"));
                break;
        }
    }

}

要注銷,您也可以定義其他方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM