每当设备从USB /电源拔下或插上时,我都会从宣言中调用一个类。
我正在尝试更改TextView的值,向用户显示设备连接的状态。
这应该是一件非常容易和简单的事情,但遗憾的是,即使经过数小时的搜索,我也无法找到答案。
以下是我的代码:(注释部分不起作用)
public class PowerConnectionReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(Intent.ACTION_POWER_CONNECTED))
{
//TextView txtStatus = (TextView) ((Activity)context).findViewById(R.id.txtStatus);
//txtStatus.setText("Connected");
}
else if(action.equals(Intent.ACTION_POWER_DISCONNECTED))
{
//TextView txtStatus = (TextView) ((Activity)context).findViewById(R.id.txtStatus);
// txtStatus.setText("Disconnected");
}
}
}
答案 0 :(得分:0)
从动态注册的广播接收器(即不在清单中)更新UI相对容易,但是从清单中注册的广播接收器更新它是tricker,因为实例是静态的。
理论上你可以使它可观察并添加观察者,或者添加一个静态的可观察对象并听取它,但我不太习惯在我自己的代码中这样做,特别是因为不能保证清单接收器存在直到收到第一个广播。最安全的方法可能是在您的活动中添加另一个广播接收器,然后将PowerConnectionReceiver
的广播发送到您活动中的广播。在我的例子中,我使用的是本地广播接收器(开销较小)。所以你的PowerConnectionReceiver
看起来像这样:
public class PowerConnectionReceiver extends BroadcastReceiver {
public static final String ACTION_STATUS_CHANGE = "STATUS_CHANGE";
public static final String EXTRA_STATUS = "POWER_STATUS";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String status = null;
if(action.equals(Intent.ACTION_POWER_CONNECTED)){
status = "Connected";
}
else if(action.equals(Intent.ACTION_POWER_DISCONNECTED)){
status = "Disconnected";
}
if (status == null){
return;
}
Intent intent = new Intent(ACTION_STATUS_CHANGE);
// You can also include some extra data.
intent.putExtra(EXTRA_STATUS, status);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
}
你的活动看起来像这样:
public class MyActivity extends AppCompatActivity {
private txtStatusView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myLayoutWithTextView);
txtStatusView = findViewById(R.id.txtStatus);
LocalBroadcastManager.getInstance(this).registerReceiver(
statusReceiver, new IntentFilter(PowerConnectionReceiver.ACTION_STATUS_CHANGE)
);
}
@Override
protected void onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(statusReceiver);
super.onDestroy();
}
private BroadcastReceiver statusReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String status = intent.getStringExtra(PowerConnectionReceiver.EXTRA_STATUS);
txtStatusView.setText(status);
}
};
}