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

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

问题描述:

我正在开发一款针对android nougat的android应用程序。如果连接到互联网,它应该在后台线程中对本地数据库同步执行远程SQL。我试过使用广播接收机来检测连通性,但它并没有在android N上发射。我怎么能在背景中做到这一点(检查网络可用性)?一个例子是有益的在后台线程上检查Android nougat的互联网连接

我想这

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(); 
} 
+0

检查了这可能会帮助你http://stackoverflow.com/a/42229749/5610842 – RaghavPai

+0

如何使用该类?我想在用户启用互联网时触发一些操作,即使我的应用程序不活动。如何监控?对不起,我是一个noob –

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

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

然后在我的情况,我有两个选择(这就是我的想法),安排与

  • GCM网络经理

    OR

  • 作业调度

    同步操作

该pr与工作调度程序相关的是它只能在API 21级以上工作,但它不需要Google Play服务工作。另一方面,GCM网络经理向后兼容,但需要谷歌播放服务运行。

然后我参观了Intelligent Job Scheduling,他们说,去Firebase Job dispatcher

火力地堡JobDispatcher支持使用谷歌的Play服务,因为一个 实施调度(运行)的工作,但是库也 让你定义和使用其他实现:例如,您可能会决定使用JobScheduler或编写您自己的自定义代码。 由于这种多功能性,如果您的应用的目标版本低于5.0 (API等级21),我们建议您使用此Firebase JobDispatcher。

我就把他的意见, 这是我做过什么,

创建一个服务(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); 

而且这部作品在背景。

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

//使用上面的代码

+0

它适用于我的应用程序处于活动状态。但是,当我退出我的应用程序或通过清除活动任务,然后连接/断开互联网,它不能正常工作 –

Connectivi ty动作应该用于牛轧糖

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); 
+0

我不认为它会工作 –

+0

没有检查它对我的工作很好 –

+0

是,我检查它不工作,如果遇害将检查一些其他解决方案 –