【问题标题】:How do you detect network connectivity loss on Nougat even if your app is not running?即使您的应用程序没有运行,您如何检测 Nougat 上的网络连接丢失?
【发布时间】:2016-11-15 03:34:44
【问题描述】:

在 Nougat 以下的 API 上,您只需在订阅 CONNECTIVITY_CHANGES 的清单中声明一个接收器。这让我可以监听网络连接的变化,无论连接是打开还是关闭,即使我的应用程序没有运行,我也可以执行任务。

在牛轧糖上,这似乎是不可能的。我知道如果有网络连接,Nougat 上的 JobScheduler 可用于在后台执行某些任务,但似乎没有监听网络连接丢失的选项。

换句话说,我希望能够在我的手机失去所有连接(Wi-Fi、LTE 等)时听到声音,并在发生这种情况时在后台执行某些操作。这在牛轧糖上可行吗?

【问题讨论】:

  • 您是否尝试过使用setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE) 创建一个JobInfo 并使用setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) 创建另一个?
  • 您可能需要谨慎行事 - 蜂窝设备无线电的更改确实经常发生 - 不要指望它会永远停止,这可能会使用户的电话非常忙碌。
  • @JaredRummler NETWORK_TYPE_NONE 不会像您认为的那样做。它基本上意味着无论你有什么样的网络连接都运行这个工作,而不是意味着:只有在没有网络时才做这个工作
  • @GeorgeYang,啊,好的。这个library 看起来像是使用NetworkRequestregisterNetworkCallback。也许您可以让服务始终通过网络回调运行。 ¯_(⊙_ʖ⊙)_/¯
  • 我觉得你可以手动注册一个BroadcastReciever。它仍然可以工作,只是清单注册开始失败。

标签: android networking background-process connectivity android-jobscheduler


【解决方案1】:

您可以使用 NetworkChangeReceiver

public class NetworkChangeReceiver extends BroadcastReceiver {

private static final String LOG_TAG = "NetworkChangeReceiver";
private boolean isConnected = false;
Context mContext;

@Override
public void onReceive(Context context, Intent intent) {
    Log.v(LOG_TAG, "Receieved notification about network status");
    isNetworkAvailable(context);
    mContext=context;

}

public boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivity != null) {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    if (!isConnected) {
                        Log.v(LOG_TAG, "Now you are connected to Internet!");
                        Toast.makeText(context, R.string.internet_available, Toast.LENGTH_SHORT).show();

                        isConnected = true;


                    }
                    return true;
                }
            }
        }
    }
    Log.v(LOG_TAG, "You are not connected to Internet!");
    Toast.makeText(context, R.string.internet_not_available, Toast.LENGTH_SHORT).show();




    isConnected = false;
    return false;
}

【讨论】:

  • @f.khantsis 如果这需要在后台发生,并且没有打开活动,您会在哪里执行此操作?
  • @the_gesslar 在您的应用程序类中使用它。
猜你喜欢
  • 2017-02-05
  • 1970-01-01
  • 2011-05-02
  • 2012-05-16
  • 2022-01-06
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
相关资源
最近更新 更多