繁体   English   中英

广播接收器在后台应用程序时不活动

[英]broadcast receiver not active when app in background

我有一个通过清单文件注册的广播接收器。 基本上,当互联网连接开启/关闭时,它会激活。 它会在Toast出现时以及在它关闭时显示Toast。

但是,当我的应用程序在后台(按下主页按钮)时,我不希望显示此Toast。 我怎样才能做到这一点? 我不介意广播是否仍然注册,但我需要一种方法来了解我的应用程序是不可见的所以我禁用了Toast。

非常感谢你

    ConnectivityManager connManager = (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
        NetworkInfo active_nwInfo = (NetworkInfo) connManager.getActiveNetworkInfo();

if(active_nwInfo == null || !active_nwInfo.isConnected()) {
            //broadcast.putExtra("action", "no_connection");
            Toast.makeText(context, "No Internet Connection", Toast.LENGTH_LONG).show();


        }else {
            //broadcast.putExtra("action", "new_connection");
            Toast.makeText(context, "Internet Connection", Toast.LENGTH_LONG).show();


        }

您可以创建一个Activity,例如BaseActivity (扩展Activity ofcourse)。 在此Activity的onResume()onPause()方法中,您可以设置一个布尔变量,就像Anup Cowkur在他的答案中所做的那样。

现在,您可以从BaseActivity而不是Activity类扩展所有活动 因此,在BroadcastReceiver的 onReceive()函数中,您可以先检查此布尔变量,并仅在Toast为“true”时显示Toast。

这些链接非常有用:

检查Android应用程序是否在后台运行

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

在您的活动中,在onPause()上取消注册您的接收器,并在onResume()上再次注册它

@Override
protected void onPause() {
    mLocalBroadcastManager.unregisterReceiver(mReceiver);
    super.onPause();
}

@Override
protected void onResume() {
    mLocalBroadcastManager.registerReceiver(mReceiver, filter);
    super.onResume();
}

我只是使用LocalBroadcastManager进行演示,将其更改为适合您的接收器的那个。

使用布尔标志来指示app是否在后台:

boolean appIsInBackgorund = false;
  @Override
    protected void onPause() {
        appIsInBackgorund = true;
        super.onPause();
    }

    @Override
    protected void onResume() {
        appIsInBackgorund = false;
        super.onResume();
    }

现在,您可以检查此标志以确定应用程序是否处于后台状态,并确定是否显示您的祝酒词。

如果您需要在多个活动中使用相同的标志,则可以将其存储在SharedPreferences中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM