Java 当用户脱机时显示对话框,当用户联机时关闭对话框(使用broadcastReceiver)
这是我的基本活动,它扩展了类Java 当用户脱机时显示对话框,当用户联机时关闭对话框(使用broadcastReceiver),java,android,dialog,broadcastreceiver,Java,Android,Dialog,Broadcastreceiver,这是我的基本活动,它扩展了类活动。我让我的其他活动扩展这个基本类: public abstract class Base extends Activity { private BroadcastReceiver netStateReceiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLa
活动
。我让我的其他活动扩展这个基本类:
public abstract class Base extends Activity {
private BroadcastReceiver netStateReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutResourceId());
}
protected abstract int getLayoutResourceId();
@Override
protected void onPause() {
if (netStateReceiver != null) {
unregisterReceiver(netStateReceiver);
netStateReceiver = null;
}
super.onPause();
}
@Override
protected void onResume() {
if (netStateReceiver == null) {
netStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, Intent intent) {
final Dialog offline = new Dialog(context, android.R.style.Theme_Light);
//A change occurred in connection state. Check whether user has been become online or offline:
if (!CheckNet()) {
//User became offline (show offline dialog):
offline.setContentView(R.layout.activity_offline);
offline.setTitle("offline");
offline.getWindow().setBackgroundDrawableResource(R.color.transparent);
offline.show();
final Button retry = (Button) offline.findViewById(R.id.button6);
retry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (CheckNet()) {
offline.dismiss();
}
}
});
}
else {
//User became online (dismiss offline dialog):
if (offline.isShowing()) {
offline.dismiss();
}
}
}
};
registerReceiver(netStateReceiver, new IntentFilter(Values.CONNECTIVITY_RECEIVER_ACTION));
}
super.onResume();
}
private boolean CheckNet() {
final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
return (activeNetwork != null && activeNetwork.isConnectedOrConnecting());
}
}
正如您在代码中看到的,我已经注册了一个用于检查连接状态的接收器
我希望当用户脱机时,向用户显示一个对话框,并通知用户他已脱机,应该联机才能继续。这部分很好用
我还希望当该对话框显示时,当用户联机时,该对话框被取消,但该部分不起作用,对话框仍保留在显示器上
有什么问题,我如何取消该对话框?您每次收到广播时都会创建一个新对话框,因此您取消的对话框与用于显示“您当前处于脱机状态”的对话框完全不同 尝试将“脱机”对话框放在“活动”中,而不是放在onReceive回调中 一个简单的例子是:
public abstract class Base extends Activity {
private BroadcastReceiver netStateReceiver;
final Dialog offline;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutResourceId());
// You create the dialog here instead within the onReceive callback
offline = new Dialog(this, android.R.style.Theme_Light);
offline.setContentView(R.layout.activity_offline);
offline.setTitle("offline");
offline.getWindow().setBackgroundDrawableResource(R.color.transparent);
}
@Override
protected void onResume() {
if (netStateReceiver == null) {
netStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, Intent intent) {
if (!CheckNet()) {
// Your dialog already exists, just show it immediately
offline.show();
final Button retry = (Button) offline.findViewById(R.id.button6);
retry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (CheckNet()) {
offline.dismiss();
}
}
});
}
else {
//User became online (dismiss offline dialog):
if (offline.isShowing()) {
offline.dismiss();
}
}
}
};
registerReceiver(netStateReceiver, new IntentFilter(Values.CONNECTIVITY_RECEIVER_ACTION));
}
super.onResume();
}
}
使其成为对对话框对象引用的全局访问:
final Dialog offline = new Dialog(context, android.R.style.Theme_Light);
然后您将能够关闭对话框。您将在每次广播中创建一个新对话框,而不是使用以前创建的对话框 使对话框变量成为activity类的成员变量,那么它就可以工作了
private Dialog offline;
@Override
protected void onResume() {
if (netStateReceiver == null) {
netStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, Intent intent) {
if (!CheckNet()) {
if(offline==null || !offline.isShowing()){
offline = new Dialog(context, android.R.style.Theme_Light);
}
...
} else {
//User became online (dismiss offline dialog):
if (offline!=null && offline.isShowing()) {
offline.dismiss();
}
}
我需要onReceive方法的上下文对象,所以我无法在onReceive之外初始化对话框block@Masoud您可以在onCreate()方法中启动dialog对象。