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