[英]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.