我正在使用BroadcastReceiver检查我的应用程序中的互联网连接,如果连接丢失,我会显示一个警告对话框。它工作得很好。但我的问题是,即使我的应用程序处于后台,BroadcastReceiver也能正常工作。因此,即使用户在其他应用程序中,当互联网连接丢失时,也会弹出对话框。这完全毁了我的应用。
有没有人知道如何在应用程序中限制广播接收器?
这是我的BroadcastReceiver:
public class ConnectivityChangedReceiver extends BroadcastReceiver{
@Override
public void onReceive( Context context, Intent intent )
{
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
} else {
try{
Intent i=new Intent(context, InternetDialogActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
} catch(Exception e){
e.printStackTrace();
}
}
}
}
活动是:
public class InternetDialogActivity extends Activity implements OnClickListener{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.internet_dialog_box);
getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
Button retryButton = (Button) findViewById(R.id.retryInternetButton);
retryButton.setOnClickListener(this);
}
public boolean checkConnectivity(){
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo!=null && networkInfo.isConnected()) {
finish();
return true;
} else {
Intent intent = getIntent();
finish();
startActivity(intent);
return false;
}
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.retryInternetButton:
try{
checkConnectivity();
} catch(Exception e){
e.printStackTrace();
}
break;
}
}
}
下面是我如何在清单中声明接收器和活动的:
<receiver android:name="com.lisnx.service.ConnectivityChangedReceiver"
android:label="NetworkConnection">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<activity android:name="com.lisnx.activity.InternetDialogActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="@android:style/Theme.Dialog" />
我读到过,我们可以通过不在清单中声明BroadcastReceiver来限制它在应用程序中工作。但我不知道接收器是如何工作的?请帮帮我。我被它卡住了。提前谢谢。
发布于 2012-09-05 13:58:20
您是否已尝试从清单中删除意图过滤器,并在活动中注册/注销它?因此,您可以尝试在onStart()中注册意图过滤器,并在onStop()方法中取消注册它。代码是这样想的:
static final String ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
IntentFilter filter = new IntentFilter(ACTION);
this.registerReceiver(ConnectivityChangedReceiver, filter);
unregisterReceiver(ConnectivityChangedReceiver);
如果你还不熟悉Activity Lifecycle,你也应该学习它。
发布于 2012-09-05 16:32:33
您应该在每个活动的onPause()
和onResume()
中注册/注销您的BroadcastReceiver
。然后你就会知道,只有当你的应用程序在前台时,接收器才会“监听”。您可以通过创建自己的BaseActivity
轻松做到这一点,它扩展了Activity
,覆盖了onPause()
和onResume()
,并注册/注销您的接收器。只需让您的所有活动像往常一样扩展BaseActivity
并让它们调用super.onResume()
和super.onPause()
即可。示例代码如下:
public class BaseActivity extends Activity {
// Create an IntentFilter to listen for connectivity change events
static IntentFilter filter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
// Create an instance of our BroadcastReceiver
static ConnectivityChangedReceiver receiver = new ConnectivityChangedReceiver();
@Override
protected void onPause() {
super.onPause();
// Stop listening for connectivity change events
unregisterReceiver(receiver);
}
@Override
protected void onResume() {
super.onResume();
// Listen for connectivity change events
registerReceiver(receiver, filter);
}
}
您的所有活动都应该扩展BaseActivity
,如果它们需要在onResume()
或onPause()
中做任何特殊的事情,只需确保调用super.onXXXXX()
,如下所示:
public MyActivity extends BaseActivity {
@Override
protected void onResume() {
super.onResume();
// Here you do whatever you need to do in onResume() of your activity
...
}
@Override
protected void onPause() {
super.onPause();
// Here you do whatever you need to do in onPause() of your activity
...
}
}
我没有通过编译器运行代码,所以如果有拼写错误或者我遗漏了什么,我向您道歉。
发布于 2012-10-25 21:05:12
我认为你必须确保当应用程序在后台时,你没有使用接收器。为此,您必须使用每个活动的onPause()和onResume()方法。
https://stackoverflow.com/questions/12274997
复制相似问题