在后台线程中检查android nougat上的互联网连接

时间:2017-02-13 10:57:00

标签: android broadcastreceiver android-7.0-nougat

我正在开发一个针对android nougat的Android应用程序。如果连接到Internet,它应该在后台线程中执行远程sql到本地数据库同步。我尝试使用广播接收器来检测连接,但它没有在Android N上触发。我怎么能在后台执行此操作(检查互联网可用性)?一个例子很有帮助

我试过这个

Android清单

 <receiver android:name=".NetworkChangeReceiver">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>

NetworkChangeReciever.java

public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
        Toast.makeText(context,"Internet state changed",Toast.LENGTH_LONG).show();
}

3 个答案:

答案 0 :(得分:0)

private void registerInternetReceiver()
{
    if (this.internetReceiver != null) return;
    this.internetReceiver = new BroadcastReceiver()
    {
        @Override
        public void onReceive (Context context, Intent intent)
        {
            if (isInternetAvailable()) {
                Log.i ("Tag", "internet status online");
                // write ur logic here
            }
            else
                Log.i ("Tag", "internet status offline");
        }
    };
    IntentFilter filter = new IntentFilter();
    filter.addAction (ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver (internetReceiver, filter);
}

private boolean isInternetAvailable()
{
    try
    {
        return (Runtime.getRuntime().exec ("ping -c 1 google.com").waitFor() == 0);
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
    return false;
}

//使用上面的代码

答案 1 :(得分:0)

连接动作应该用于nougat

 IntentFilter intentFilter = new IntentFilter();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)

    {
        //For Nougat
        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTI‌ON);
    } else

    {
        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_CHANGE));
    }

    registerReceiver(new NetworkConnectionReceiver(), intentFilter);

答案 2 :(得分:0)

我得到了一个问题的答案。

带有动作的广播接收器 在清单中注册的<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />将不会在android N中触发。但是可以以编程方式注册广播并使其正常工作。但是当应用程序被杀时它将不起作用。

然后在我的情况下,我有两个选项(这就是我的想法),使用

安排同步操作
  • GCM网络管理员

  • 作业调度程序

作业调度程序的问题在于它仅适用于API级别21,但它并不需要Google Play服务才能工作。另一方面,GCM网络管理器具有向后兼容性,但需要谷歌播放服务才能运行。

然后我访问了Intelligent Job Scheduling,然后他们说,请Firebase Job dispatcher

  

Firebase JobDispatcher支持将Google Play服务用作   调度(运行)作业的实现,但库也   允许您定义和使用其他实现:例如,您   可能决定使用JobScheduler或编写自己的自定义代码。   由于这种多功能性,我们建议您使用此Firebase   如果您的应用针对的Android版本低于5.0,则为JobDispatcher   (API级别21)。

我接受了这个建议, 这就是我做的,

创建了一个服务(SyncService.java),用于执行同步作业

将该服务添加到清单

<service
    android:exported="false"
    android:name=".SyncService">
        <intent-filter>
            <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
        </intent-filter>
</service>

在我的活动中,创建并执行了一个要同步的作业

Job syncJob=jobDispatcher.newJobBuilder()
            .setService(SyncService.class)
            .setRecurring(true)
            .setLifetime(Lifetime.FOREVER)
            .setRecurring(true)
            .setLifetime(Lifetime.FOREVER)
            .setTrigger(Trigger.executionWindow(3,600))
            .setConstraints(Constraint.ON_ANY_NETWORK) //does job when network is available
            .setReplaceCurrent(true)
            .setTag("syncService")
            .build();
jobDispatcher.mustSchedule(syncJob);

这适用于后台。