2017-02-18 54 views
1

我想動態設置一個BroadcastReceiver來檢查我是否只在我的應用在前臺運行時纔在線。在我的主類中,我創建了一個Intent Filter,一個嵌套的BroadcastReceiver Class,最後分別在onResume和onPause方法中註冊/註銷接收者。動態BroadcastReceiver檢查在線連接

我的問題是,是否有一個意向行動,我可以添加到我的意圖過濾器,檢查在線連接?

如果不是,我該如何創建此動態廣播接收器才能在我的應用運行時執行?

這裏是我的類看起來像....

public class MainActivity extends AppCompatActivity { 
private IntentFilter onlineIntentFilter; 
private CheckOnlineReceiver checkOnlineReceiver; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    onlineIntentFilter = new IntentFilter(); 
    checkOnlineReceiver = new CheckOnlineReceiver(); 
    //*****WHAT INTENT ACTION CAN I PASS TO CHECK NETWORK CONNECTIVITY****** 
    onlineIntentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED); 

    } 

@Override 
protected void onResume() { 
    super.onResume(); 
    registerReceiver(checkOnlineReceiver, onlineIntentFilter); 
} 

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


private class CheckOnlineReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     Toast.makeText(getApplicationContext(),"IN METHOD, ACTION = " + action, Toast.LENGTH_LONG).show(); 
    } 
}} 

回答

1

添加連接動作 onlineIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)

,不要忘記添加的權限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

廣播接收機的onReceive()將被要求連接的變化,這意味着在兩個連接和斷開。所以每當你收到braodcast你必須檢查連接如下

public boolean isNetworkAvailable() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
    if (networkInfo != null && networkInfo.isConnected()) { 
     return true; 
    } 
    return false; 
} 
0

添加的IntentFilter CONNECTIVITY_ACTION

+0

這是說它無法解決。這裏是我添加的內容:onlineIntentFilter.addAction(Intent.CONNECTIVITY_ACTION); –

1

下面是做到這一點的標準方式。

創建一個將有兩個方法:一個接口onNetworkConnected()和onNetworkDisconnected()

public interface NetworkConnectivityListener { 
    public void onNetworkConnected(); 
    public void onNetworkDisconnected(); 
} 

想要收聽網絡改變將實現這個接口並重寫它的兩個方法的任何類。

創建一個擴展BroadcastReceiver的類,並且此接收器的onReceive()將捕獲連接更改。在這個類來創建一個函數註冊聽衆

public class NetworkBroadcastReceiver extends BroadcastReceiver { 

private NetworkConnectivityListener listener; 

public NetworkBroadcastReceiver(NetworkConnectivityListener listener) { 
    this.listener = listener; 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 

    if (listener != null) { 
     if (isConnectedToInternet()) { 
      listener.onNetworkConnected(); 
     } else { 
      listener.onNetworkDisconnected(); 
     } 
    } 
} 

PS,你可以很容易地檢查,如果你的設備連接到互聯網或沒有。只是谷歌。

現在我們假設你想要你的MainActivity來監聽網絡變化,你所要做的就是在你的主要活動調用中實現NetworkConnectivityListener,並創建一個傳遞MainActivity上下文的NetworkBroadcastReceiver實例,它將開始獲取網絡更新。

0

你需要爲你正在尋找在後臺執行長時間運行的任務,以創建服務。

服務將需要在清單中的<application>標籤內註冊。

<service android:name=".WifiService" 
     android:stopWithTask="true" 
     android:enabled="true"/> 

stopWithTask導致當你所有的活動都銷燬,被銷燬的服務(默認值是true)。

您需要註冊和取消註冊BroadcastReceiver到服務類中的CONNECTIVITY_CHANGE操作。

public class WifiService extends Service { 

    private BroadcastReceiver mReceiver; 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); 

     // Your BroadcastReceiver class 
     mReceiver = new WifiReceiver(); 
     registerReceiver(mReceiver, filter); 
     return null; 
    } 

    @Override 
    public boolean onUnbind(Intent intent) { 
     unregisterReceiver(mReceiver); 
     return super.onUnbind(intent); 
    } 
} 

然後在BroadcastReceiver中,您必須監聽CONNECTIVITY_CHANGE。

public class WifiReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = manager.getActiveNetworkInfo(); 

     boolean isConnected = networkInfo != null && 
           networkInfo.isConnectedOrConnecting(); 

     if (isConnected) { 
      switch (networkInfo.getType()) { 
       case ConnectivityManager.TYPE_WIFI: 
        // Connected via wifi 
        break; 

       case ConnectivityManager.TYPE_ETHERNET: 
        // Connected via ethernet 
        break; 

       case ConnectivityManager.TYPE_MOBILE: 
        // Connected via mobile data 
        break; 
      } 
     } 
    } 
} 

使用此設置,您將能夠在連接更改時通知應用程序組件。