2017-02-13 154 views
1

我正在開發一款針對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 –

回答

0

我得到了我的問題的答案。

採取行動的廣播接收器 <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); 

而且這部作品在背景。

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

//使用上面的代碼

+0

它適用於我的應用程序處於活動狀態。但是,當我退出我的應用程序或通過清除活動任務,然後連接/斷開互聯網,它不能正常工作 –

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

是,我檢查它不工作,如果遇害將檢查一些其他解決方案 –