gpt4 book ai didi

android - 为什么即使应用程序处于后台,BroadcastReceiver 也能正常工作?

转载 作者:IT王子 更新时间:2023-10-28 23:33:19 25 4
gpt4 key购买 nike

我正在使用 BroadcastReceiver 在我的应用程序中检查 Internet 连接,如果连接丢失,我会显示一个警报对话框。它工作正常。但我的问题是,即使我的应用程序处于后台,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();
}
}
}
}

Activity 是:

 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;
}
}
}

这是我在 list 中声明接收者和 Activity 的方式:

  <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" />

我读到我们可以通过不在 list 中声明来限制 BroadcastReceiver 在应用程序中工作。但我不知道接收器将如何工作?请帮我。我被严重困住了。提前谢谢。

最佳答案

一个 BroadcastReceiver当应用程序在后台时工作,因为接收器拾取的事件是全局发送的,并且每个应用程序都注册以监听这些事件,无论它是否正在运行。

为了解决这个问题,在您的 BroadcastReceiveronReceive 代码中,检查您的应用是否在前台。

有一种——也是我所知道的唯一一种——始终如一地有效的方法来做到这一点。您需要跟踪应用程序的暂停/恢复操作。确保您在每个 Activity 中检查这一点。

有一些示例代码 in this answer (解决方案#1)。在您的情况下,您需要在从 BroadcastReceiver 执行任何操作之前检查 MyApplication.isActivityVisible() == true 作为验证。

关于android - 为什么即使应用程序处于后台,BroadcastReceiver 也能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12274997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com