Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 广播接收器类将状态发送到片段_Java_Android_Broadcastreceiver - Fatal编程技术网

Java 广播接收器类将状态发送到片段

Java 广播接收器类将状态发送到片段,java,android,broadcastreceiver,Java,Android,Broadcastreceiver,我有一个广播接收器作为我的类的一部分,在将广播接收器移动到它自己的类时,我无法将任何类型的值返回到需要该数据的类。是否有方法设置数据,然后将其发送回已注册的类 Overview类应该能够获取BatteryReceiver类发布的内容的状态 public class Overview extends Fragment { private Unbinder unbinder; private BroadcastReceiver batteryReceiver = new Batt

我有一个广播接收器作为我的类的一部分,在将广播接收器移动到它自己的类时,我无法将任何类型的值返回到需要该数据的类。是否有方法设置数据,然后将其发送回已注册的类

Overview类应该能够获取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;
        }
    }

}

对于注销,您也可以定义另一种方法

你能给我看一个例子吗,书面的或其他方式来证明这一点吗?谢谢你更新你的答案,我想问你是否可以解释一下你在这里做什么的背景下设置文本到文本视图Battext谢谢你Vahid,这是非常有帮助的!我也可以将其用于其他广播接收器!